当前位置: 代码迷 >> 综合 >> sqli-labs练习(十七)--- POST-Update Query-Error Based-String
  详细解决方案

sqli-labs练习(十七)--- POST-Update Query-Error Based-String

热度:27   发布时间:2023-09-23 00:40:33.0

在用万能密码进行登录的时候发现,username处无法绕过对密码的检查,总是登录失败。猜测后台对uname参数的值有过滤。导致无法注入。

使用正常方式进行登录,发现在前台可以修改用户的密码。
sqli-labs练习(十七)--- POST-Update Query-Error Based-String

再次尝试,发现passwd处存在sql注入漏洞,
payload:uname=admin&passwd=123'&submit=Submit,出现报错语句
sqli-labs练习(十七)--- POST-Update Query-Error Based-String

于是在passwd出输入万能语句uname=admin&passwd=123' or 1=1#&submit=Submit,成功登录。

基于错误的注入,基本的注入流程和前面关卡的方法一样,在这里就不在讨论了。


现在我们通过源代码来看看,后台对uname的值做了哪些检查和过滤,导致了无法注入。
从下图可以看到,后台对uname调用了函数check_input
sqli-labs练习(十七)--- POST-Update Query-Error Based-String
我们跟进check_input()函数,
sqli-labs练习(十七)--- POST-Update Query-Error Based-String
可以看到,该函数通过substr()uname首先加了长度限制,15个字符以后的将会被舍弃。

之后又用到stripslashes()函数对uname进行过滤。该函数的作用是返回一个去除转义反斜线后的字符串(\’ 转换为 ’ 等等)。双反斜线(\)被转换为单个反斜线(\)。
这里是该函数详细说明:http://php.net/manual/zh/function.stripslashes.php

最后进行纯数字检查,使用函数mysql_real_escape_string()进行特殊字符的过滤。一般没有特殊情况,在向mysql传送查询前,必须调用该函数。
该函数在以下字符前添加反斜杠: \x00, \n, \r, \, ', " 和 \x1a.
该函数的详细说明:http://php.net/manual/zh/function.mysql-real-escape-string.php
在这里只对uname调用了check_input()函数,并没有对passwd也调用该方法。

在后面又使用update导致在前台可以对用户密码进行更改。
sqli-labs练习(十七)--- POST-Update Query-Error Based-String

  相关解决方案