二次注入首先的一点就要在HTTP请求中提交恶意代码,将这个恶意代码存储在数据库中,以便后面使用。
在第24关,我们是通过注册新账号这种方式,将恶意代码存储到数据库中。
假设我们的攻击目标是Dummy。
1、将恶意代码存储到数据库中
点击注册,输入语句
Dummy'#
,并给它设置密码返回页面如下:
注册成功,Dummy#
就是我们存储到数据库中的恶意代码。由于我们的注释符#将注册时的密码给注释了,所以我们注册的新用户无密码。
也确定'是闭合方式。
2、修改密码
我们接下来要给Dummy重新设置密码。首先登录Dummy'#,然后将它的密码修改为123456,返回页面如下:
然而,数据库执行的语句是:
update users set password='123456'where username='Dummy'#'and password='1111'
,由于我们存储的恶意代码发挥作用,所以最终修改了用户Dummy的密码而不是Dummy'#。
因此我们获得了Dummy这个账号的拥有权,可以使用Dummy用户成功登录。
除了可以获取账号外,我们还可以我们还通过这种方法来爆破数据库。
比如:注册时输入语句
admin' and updatexml(1,concat('~',database(),'~',user(),'~',version(),'~'),1)#
。但是这种方法通常会因为有限制而无法实现。
比如:前端或后端有对写入内容长度的限制。如果是前端,可以通过修改HTML代码来改变对长度的限制,但是如果是后端就不行了。
但是这一关我们可以修改密码,我们可以尝试在修改密码时,将一些SQL语句写入数据库。也会有一样的效果。