0%

sqli-labs24

二次注入

原理:在http请求中提交恶意输入,保存到数据库中,第二次提交http请求,构造sql语句注入,虽然参数在过滤后会添加\进行转义,但是\并不会插入到数据库中,这样就可以利用这个构造一个二次注入。

最开始尝试了登陆,按照页面的反应进行操作,就是注册登陆,还有修改自己的原密码。
也不知道是要做什么,看了源代码,也是一脸懵逼,只好借鉴大佬了。
出现频率最高的代:session_start()函数
session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。
session_start的作用是开启$_SESION,需要在$_SESION使用之前调用。
PHP $_SESION 变量用于存储关于用户会话(session)的信息
mysql_real_escape_string() 函数:
mysql_real_escape_string(string,connection)
string:必需,规定要转义的字符
connection:可选,规定MySQL连接
下列字符受影响:
\x00
\n
\r



\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
username,password,re_password字段所投递的字符都被转义了,重心就放在修改密码的sql语句中。
在查看源代码时,特别注意sql语句,注入点在修改密码上。

重点:从session中直接获得了当前用户名,且被直接用于更新语句并未做检查。
从根本上来说,插入数据时没有过滤,只是做了转义处理。
若当前用户名中含有注释,便可以修改当前用户名中包含的另一用户的密码,例如注册用户:Dumb’# 那么他就可以修改用户Dumb的密码。

思路:注意到修改密码的sql语句,我们就可以创建一个含同名含单引号注释符的用户名来修改原来用户名的密码。
原SQL语句:
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
修改密码sql语句:
UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass'
最后真正执行的sql语句:
UPDATE users SET PASSWORD='$pass' where username='admin'

操作:
注册好后登陆,就能修改密码了更新成功。
先创建一个和admin类似的用户名(admin’#)

登陆后,进入修改密码页面修改,成功篡改其他用户的密码。

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道