SQL二次注入填坑(Sqlilab 第24关)
2023-06-15 16:55:38
# Web Security
# SQL Injection
SQL二次注入填坑(Sqlilab 第24关)
在练习sql注入的时候我有一个不好的习惯,就是总是看别人的提示,没有给自己养成一个自我思考、尝试的习惯。所以这次决定把每一步思路都记录下来,自己尝试。
尝试登录POST注入(失败)
先尝试了黑盒测试,各种注入都不报错,然后去代码审计,在Login.php里,可以看到
username
和 password
都被mysql_real_escape_string做了处理,所以登录POST处的注入就不再想了
尝试二次注入(成功)
修改其他用户密码
在post注入行不通后,我发现可以创建新用户和登录
随便创建了一个用户:username:123,密码123456
,登录后发现有需改密码选项,所以猜测修改密码选项的语句是
1 | Update users set password = '111' where username = 'admin' and password = '123'; |
这里的username
可能是存在注入的,但因为创建用户的时候,我们的username
和password
都被转义过了,该怎么办呢?
实际上,因为这个创建用户时的转移函数mysql_real_escape_string()
会在引号前加入反斜杠\
, 比如admin'#
会变成admin\'#
, 但存入数据库的时候,数据库会自动移除\
,所以存进数据库的还是admin'#
那么回到刚才修改密码的语句,当我们进行修改密码的时候,语句会变为:
1 | Update users set password = '123' where username = 'admin'#' and password = '123'; |
所以虽然我们登录的是admin'#
这个账号,但却修改了admin
的密码
扩散思维
既然二次注入可以利用,那么我们可以利用这个干点别的事
假设:如果我们现在php页面上有一个打印所有user信息的user表,我们甚至可以直接用
1 | 1' union select 1,user(),database()# |
把信息union到打出来的这张表上。
总结
遇到转义的函数如mysql_real_escape_string()
,考虑数据进入数据库后会被还原的情况,再找取出这个数据的地方,即可完成二次注入。