美文网首页
2019-05-13 BugkuCTF Writeup之代码审计

2019-05-13 BugkuCTF Writeup之代码审计

作者: NoelleMu | 来源:发表于2019-05-13 11:37 被阅读0次

    本来想把代码审计放在Web里,但是既然Bugku平台上是两部分分开的,所以就分开写吧

    ereg正则%00截断

    考察使用%00截断ereg()函数的正则匹配

    代码如下:

    <?php
      $flag = "xxx";
      if (isset ($_GET['password'])) {
        if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) {
          echo 'You password must be alphanumeric';
        }
        else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) {
          if (strpos ($_GET['password'], '-') !== FALSE)  { //strpos — 查找字符串首次出现的位置
            die('Flag: ' . $flag);
          }
        else {
          echo('- have not been found');
          }
       }
       else {
         echo 'Invalid password';
       }
      }
    ?>
    

    要求传入password参数,这个参数只能由字母和数字组成,而且在长度小于8的情况下数值要大于9999999,可以用指数形式来绕过。另外,要匹配到字符“-”。

    ereg函数存在NULL截断漏洞,所以可以使用%00截断正则匹配来绕过对字符-的匹配。

    传入password=1e8%00-

    提示:

    看来题目中的信息有误,%00的后面应该是-

    payload: ?password=1e8%00-

    拿到flag。

    extract变量覆盖

    考察由extract()函数产生的变量覆盖漏洞

    代码:

    <?php
      $flag='xxx';
      extract($_GET);
      if(isset($shiyan))
      {
        $content=trim(file_get_contents($flag));
        if($shiyan==$content)
        {
          echo'flag{xxx}';
        }
        else
        {
          echo'Oh.no';
        }
      }
    ?>
    

    extract()函数的主要作用是将数组展开,键名作为变量名,元素值为变量值 ,但是这个函数不能防止已有变量被覆盖,如果传入了已有变量,则已有变量会被覆盖,造成变量覆盖漏洞。题目中要求shiyan和content的值相同,所以构造如下的payload,覆盖掉已有变量content的值,就可以得到flag:

    payload:?shiyan=&content=1

    或者

    ?shiyan=&flag=1

    都可以拿到flag。

    十六进制与数字比较

    考察PHP将十六进制解析为十进制

    <?php
      error_reporting(0);
      function noother_says_correct($temp)
      {
        $flag = 'flag{test}';
        $one = ord('1'); //ord — 返回字符的 ASCII 码值
        $nine = ord('9'); //ord — 返回字符的 ASCII 码值
        $number = '3735929054';
        // Check all the input characters!
        for ($i = 0; $i < strlen($number); $i++)
        {
          // Disallow all the digits!
          $digit = ord($temp{$i});
          if ( ($digit >= $one) && ($digit <= $nine) )
          {
            // Aha, digit not allowed!
            return "flase";
          }
        }
        if($number == $temp)
          return $flag;
      }
      $temp = $_GET['password'];
      echo noother_says_correct($temp);
    ?>
    

    要传入一个变量password,值必须与3735929054相同,但是又不能由数字组成,联想到题目名为“十六进制与数字比较”,可以把这个数字转化为十六进制再传入。

    记得加上先导0x,否则是字符串而不是十六进制数。

    payload:?password=0xdeadc0de

    拿到flag。

    未完待续……

    相关文章

      网友评论

          本文标题:2019-05-13 BugkuCTF Writeup之代码审计

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