3D打印|php代码审计-sql注入进阶篇( 二 )


$dl=\"SELECT * FROM xs WHERE username='$username' and password='$password'\"; //登录界面后台处理$ck=mysqli_query($db$dl);$row = mysqli\\_fetch\\_array($ck);if($_POST\\['login'\\
){if($row) {echo\"登录成功\";
else{echo\"登录失败\";

function dl($gl){$gl=str_replace(array(\"union\"\"UNION\")\"\"\"$gl\");$gl=str_replace(array(\"select\"\"SELECT\")\"\"\"$gl\");$gl=str_replace(array(\"database\"\"DATABASE\")\"\"\"$gl\");$gl=str_replace(array(\"sleep\"\"SLEEP\")\"\"\"$gl\");$gl=str_replace(array(\"if\"\"IF\")\"\"\"$gl\");$gl=str_replace(\"--\"\"\"\"$gl\");$gl=str_replace(\"order\"\"\"\"$gl\");return $gl;

?>

阅读一遍代码发现在上一段的基础上面添加了一个preg_match函数 , 这个函数过滤了or and xor not关键字 , 需要注意的是preg_match会大小写都过滤 , 继续往下读回显位改成了成功或者失败所以我们只能采用盲注或者延时注入 。
逻辑运算符绕过先尝试大小写绕过 , 果然是失败的 。

使用逻辑运算符尝试
and = &&
or = ||
xor = | # 异或
not = !
使用&&代替and构造盲注语句1’ && length(DATAbase())=3 # 因为关键字过滤函数还在所以还同时需要大小写绕过 。

注入成功url编码绕过在平常使用url提交数据时 , web容器在接到url后会自动进行一次url编码解析 , 但是由于业务问题有些网站在web容器自动解析之后 , 通过编写程序对解析的参数进行再次url编码解析 , 就会出大问题 。
源代码分析<?phprequire 'db.php';
header('Content-type:text/html;charset=utf8');
$id1=$_GET\\['id'\\
;
$gl=\"/and|or|not|xor|length|union|select|database|if|sleep|substr/i\";if(preg_match($gl$id1)){echo\"<script>alert('存在危险字符')</script>\";
else{
$id=urldecode($id1);
$dl=\"SELECT * FROM xs WHERE id='$id'\";
$result=mysqli_query($db$dl);
$row = mysqli\\_fetch\\_assoc($result);if($_GET\\['id'\\
) {if ($row) {echo \"登录成功:\" . $row\\['username'\\
;

?>

上来还是先看看代码 , 把客户端传入的get参数赋值进了id1&#x7528;if&#x52A0;pregmatch&#x5BF9;&#x53D8;&#x91CF;\" role=\"presentation\">id1用if加pregmatch对变量id1用if加pregmatch对变量id1里的值进行检索 。 如果客户端传入的参数有gl&#x91CC;&#x7684;&#x503C;&#x90A3;&#x4E48;&#x5C31;&#x4F1A;&#x8FD4;