1、堆叠注入
使用分号 ';' 成堆的执行sql语句
以sqllabs-less-38为例
?id=1'
简单测试发现闭合点为单引号
?id=1' order by 3
?id=1' order by 4
使用order by探测发现只有三列(字段数)
尝试简单的联合注入查询
?id=-1' union select 1,database(),user()--+
可行?
查询id为2的用户名和密码
?id=2
接下来我们使用堆叠注入对id为2的用户的密码进行修改
?id=1';update users set password='myon' where id=2 --+
首先使用单引号将前面语句进行闭合,该语句会正常查询id为1的用户信息;
之后使用分号结束该语句,后面继续追加我们还想执行的语句(更新用户信息)
这里的users、password等我们是可以通过联合注入查出来的,因此这里我就直接用了
我们再次查询id为2的用户信息
?id=2
可以看到密码已经被修改?
这个就是简单的堆叠注入,其实就是使用分号将语句隔开,使得我们可以一次执行多条语句。
2、二次注入
指已存储(数据库、文件)的用户的输入被读取后再次进入到 SQL 查询语句中导致的注入
成因:系统没有对已经存入数据库的数据做检查
以sqllabs-less-24为例
在我们的数据库里有一个用户名为admin,密码为admin的用户
假设我们只知道用户名为admin,并不知道密码
如果输入错误的密码
登录失败
接下来我们通过二次注入实现修改admin的密码
由于页面给我们提供了注册的功能
我们先注册一个用户名为 admin'# 的用户,密码这里设为123
注册成功
使用该账号登录
注意我们现在的身份是admin'#
提示我们可以修改密码
我们修改密码,假设改为12345
提示密码更新成功
我们login out退出
接下来神奇的东西发生了
我们尝试登录admin,密码即为我们刚才修改的密码12345
竟然以admin的身份登录成功了
换句话说,我们刚才对注新册的 admin'# 用户进行密码修改,其实是修改了 admin 的密码
查看本地数据库,也确实如此,也可以看到我们创建的用户和密码
在这个过程中,我们正常创建新用户其实是没有任何问题的,问题出在修改密码,此时查询的本该是用户?admin'# 的信息,但是由于 '#? 闭合了前面,并且将后面的信息进行了注释,导致查到的用户名为?admin?,由于后面关于核对admin密码的信息也被注释掉了,即没有进行校验,从而误认为是admin在进行密码修改。