二次注入须要具有的两个条件:php
(1)用户向数据库插入恶意语句(即便后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)mysql
(2)数据库对本身存储的数据很是放心,直接取出恶意数据给用户sql
(1)在sqli_libs的第24关,其页面以下所示:数据库
(2)当咱们点击Forgot your password?时,出现提示:后端
(3)所以能够尝试在注册页面进行二次注入,首先,咱们注册一个帐号,名为:admin'# ,密码为:123456spa
(4)注册成功,尝试登陆admin‘# ,而后能够查看一下phpmyadmin内存储状况3d
(5)而这时的admin原密码是admin,而且两个帐号都存储在数据库内的。当咱们从新修改admin'#的密码的时候,这里修改成:12345678;能够发现二次注入的威力所在。admin的密码被修改成了:12345678;而admin'#用户的密码并无发生变化。blog
(6)代码审计,尝试分析源码,出现问题的页面很显然是注册页面,与密码修改重置的页面。内存
注册用户时:源码
仅对特殊字符进行了转义,判断输入两次密码是否一致,而后将用户键入,将数据插入至数据库。
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")"
这里直接插入了数据
修改密码时:
$username= $_SESSION["username"];//直接取出了数据库的数据
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";//对该用户的密码进行更新
$sql = "UPDATE users SET PASSWORD='12345678' where username='admin‘#
执行成功!
(1)对外部提交数据谨慎
(2)从数据库取数据时,不能轻易相信查询出的数据,要作到一样的转义或是甄别