一.sql二次注入介绍
简单的说,二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
相比于直接注入,二次注入是比较有趣的。因为他会把你第一次的请求存储,然后在第二次使用到的时候,才会激活并且返回结果。例如在某个插入功能中,我们插入构造的SQL语句,此时并没有什么现象,但是当浏览的时候,系统执行了一个查询,就执行了我们之前的SQL语句,返回了我们需要的信息。
二.开始
1.可以发现题目页面是一个简单的留言板,只能输入昵称和所要留言的内容,并提交。似乎没有别的功能。
2.尝试注入
显示留言成功后在页面回显了,猜想使用了insert('$昵称','$内容')语句插入数据库并读取出来
显示失败,说明单引号被嵌入sql语句被执行
通过分别留言 ' ,5 和5. ' 发现两处均存在注入点,有意思的是留言'' ,5时居然成功了,难道insert into xx values('''')会插入一个 ' 号?
测试了一下还真是这样
尝试闭合
结果失败了,查看后端发现insert语句中还加了一个时间函数
于是构造新的闭合语句
爆库
爆出其中一个表名intd,这里值得注意的:①是由于使用了concat函数连接#号与一个表名的字符串,所以查询出表名的语句必须加limit限制一下查询一条;
②与get与post方式sql注入不同的是,由于sql语句嵌入在查询语句中,不用使用union select函数了,直接查数据就可以了
修改limit 0,1为limit 1,1 ....查出别的表key
接下来就是常规查列名,得出key 和id 两列,通过查询id不同数值(id=0~n),查key
最后一步特别关键
2',concat(0x23,(select `key` from ` key` where id =12)), '4')#
这里key用的是反引号!
原因:加反引号是因为有时候定义的表名或者字段名时与系统关键字发生冲突,所以才用反引号引起来,如果能确保不使用关键字就可以不用反引号。而我们实验中的key,正好时mysql自身的一个关键字。所以需要用反引号括起来