原理
简单来说,二次注入就是在可以新建数据的地方插入恶意数据,然后在查询数据的地方取出这条数据,同时恶意代码也被执行,造成 SQL 的二次注入。
举个例子:
创建数据后,也需要页面上有一个地方显示创建的数据。
比如创建一条提醒事项后,这条数据也会显示在页面上,显示的时候就等于提取了这条数据。
创建一条提醒事项:6点起床' union select user()#
如果代码没有防御二次注入成功那么当前用户名就会被显示在页面上。
练习
sqli-labs less24
less24 对二次注入的表现并不是很直观和准确,但是可以通过它来理解。
打开页面,有一个创建新用户的功能,也就提供了插入恶意代码到后台的可能。
这个页面没有显示的地方,我们可以去数据库里看数据,检查注入是否成功。
数据库里有一个『 admin 』的用户,那我们注册一个新用户,注册时用『 admin'# 』为用户名,密码随意。
接着我们用这个『 admin' # 』账号登陆,登陆后有一个重设密码的表单,我们把密码重设为『000』,可以从数据库里看到反而是『 admin 』这个账号的密码被改为了『000』。
清楚 SQL 注入本质的话应该不是很难理解,重设密码时 SQL 语句是这样的:
update users set password='000' where username='admin'#' and password='123';
『 admin' # 』进入语句后 # 号后面的不再被执行,所以 username 成了 admin,也就成功更改了 admin 账号的密码。
防御
- 谨慎对待外部提交的数据
- 内部数据调用也要进行严格的检查
网友评论