SQL注入-二次注入攻击
原理:
二次注入漏洞是一种在 Web 应用程序中广泛存在的安全漏洞形式,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。
在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes
或者是借助其他函数进行过滤,这些函数会在特殊字符前加\
造成过滤的效果,但是\
并不会插入在数据库中,我们输入的东西会原样储存到数据库中,虽然防止了一次注入,但如果可以二次使用该数据时,就有可能造成注入。
二次注入通常存在用户注册->修改密码
,邮箱注册->修改密码
,文章添加->文章编辑
等数据可以二次使用的地方。
根据例子看二次注入:
环境:sqli-labs
第24关。
我们先查看一下users表中的内容:
记住这个admin用户。
然后我们回到第24关,点击注册账户:
我们注册一个账户:用户名为admin'#
密码123456
:
我们检查一下表中的内容,看看是否原样插入:
可以看到,我们的数据被原样插入。
接下来我们再修改这个账户的密码:原密码随便输入也没问题,修改成aaaaaa。
修改成功后我们再去数据库查看:
我们发现,我们修改的admin'#
账户密码并没有变,反而admin
账户密码被更改。
解析:
一、为什么我们输入的账户会原样插入到数据库?
进入Less-24文件夹,查看login_create.php
:
我们发现他只用了mysql_escape_string()
函数做过滤,这个函数会在特殊字符前加上\
转义,但\
不会插入到数据库中。
二、为什么我们修改的是admin'#
,而被修改的是admin
账户?
查看pass_change.php
:
我们把这句复制下来:
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
把username的位置换上admin'#
就会发现:
UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass;
我们的'
与前面的闭合,而#
将后面的注释掉,整个语句就只剩下了:
UPDATE users SET PASSWORD='$pass' where username='admin'
。所以admin账户密码被更改了。