美文网首页
实验吧-你真的会PHP吗

实验吧-你真的会PHP吗

作者: byc_404 | 来源:发表于2019-07-05 12:02 被阅读0次

    实验吧这道题让我成功知道自己真的不会php。。。。。。

    开始就卡住了,点开链接出现的是

    题目

    然后就抓包嘛,结果在response里找到了hint

    hint: 6c525af4059b4fe7d8c33a.txt

    结果半天不知道怎么访问这个文件,,,最后发现只用url里访问就行了

    ```

    <?php

    $info = "";

    $req = [];

    $flag="xxxxxxxxxx";

    ini_set("display_error", false);

    error_reporting(0);

    if(!isset($_POST['number'])){

      header("hint:6c525af4059b4fe7d8c33a.txt");

      die("have a fun!!");

    }

    foreach([$_POST] as $global_var) {

        foreach($global_var as $key => $value) {

            $value = trim($value);

            is_string($value) && $req[$key] = addslashes($value);

        }

    }

    function is_palindrome_number($number) {

        $number = strval($number);

        $i = 0;

        $j = strlen($number) - 1;

        while($i < $j) {

            if($number[$i] !== $number[$j]) {

                return false;

            }

            $i++;

            $j--;

        }

        return true;

    }

    if(is_numeric($_REQUEST['number'])){

      $info="sorry, you cann't input a number!";

    }elseif($req['number']!=strval(intval($req['number']))){

        $info = "number must be equal to it's integer!! "; 

    }else{

        $value1 = intval($req["number"]);

        $value2 = intval(strrev($req["number"])); 

        if($value1!=$value2){

              $info="no, this is not a palindrome number!";

        }else{

              if(is_palindrome_number($req["number"])){

                  $info = "nice! {$value1} is a palindrome number!";

              }else{

                $info=$flag;

              }

        }

    }

    ```

    源码可以自己去看,总结下来几个条件比较清晰:

     条件一: 提交的number不能是数字

    条件二: 输入的数和他整数的返回值相等

    条件三: 需要value1和value2相等,value2是反序的value1,所以就是要求是回文数

    条件四:用is_palindrome_number()这个函数检测 number,需要number不是回文数

    (此处涉及到intval()化整函数与strrev()反序函数,很有意思)

    代码审计题总是给出这种看似自相矛盾的条件,实际上还是得从函数的漏洞入手。

    第一,二个条件,可以用到%00放在payload中,number就不是数字

    第三四个条件则有不同思路,比如说运用到0:

    intval()返回的0.00还是0

    0的反序也是0

    用上科学记数法与小数点可以混过回文的判断

    因此payload:  number=0.00%00  或者是 0e00%00.


    post方法提交得flag即可

    最后仍有一点疑问:之前在网上找到的wp大都用了另一种方法:构造出number=2147483647%00,因为抓包时发现服务器是32位的, 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。因此intval()返回的整数最大为2147483647,恰好其逆序比自己大,因此逆序取整还是2147483647,妙啊。

    但,这个方法现在不行了。。。

    难道是换服务器了?那就不得而知了。。。

    相关文章

      网友评论

          本文标题:实验吧-你真的会PHP吗

          本文链接:https://www.haomeiwen.com/subject/fdmshctx.html