SQL二次注入填坑(Sqlilab 第24关)
2023-06-15 16:55:38 # Web Security # SQL Injection

SQL二次注入填坑(Sqlilab 第24关)

在练习sql注入的时候我有一个不好的习惯,就是总是看别人的提示,没有给自己养成一个自我思考、尝试的习惯。所以这次决定把每一步思路都记录下来,自己尝试。

尝试登录POST注入(失败)

先尝试了黑盒测试,各种注入都不报错,然后去代码审计,在Login.php里,可以看到image-20210706183658126

usernamepassword都被mysql_real_escape_string做了处理,所以登录POST处的注入就不再想了

尝试二次注入(成功)

修改其他用户密码

在post注入行不通后,我发现可以创建新用户和登录

随便创建了一个用户:username:123,密码123456,登录后发现有需改密码选项,所以猜测修改密码选项的语句是

1
Update users set password = '111' where username = 'admin' and password = '123';

这里的username可能是存在注入的,但因为创建用户的时候,我们的usernamepassword都被转义过了,该怎么办呢?

实际上,因为这个创建用户时的转移函数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(),考虑数据进入数据库后会被还原的情况,再找取出这个数据的地方,即可完成二次注入。