sqli-labs闯关31-40——通关记录

Less-31

测试可得闭合方式是双引号小括号

构造语句

?id=-1") union select 1,database(),3 and ("1")=("1#

成功

查看源码,和上题类似,不再赘述

Less-32

测试闭合方式,但是可以看到符号都被过滤了

查看源码,可以看到代码中使用正则匹配过滤了\ ' "

对于这种情况,可以采用宽字节注入

UTF8

由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式。

宽字节

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。

注意点

通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出echo strlen("中");页面编码为gbk时输入2,utf-8时输入3;

原理

mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ' 的时候,往往利用的思路是将 ' 转换为 \' 。

在本题里,单引号被过滤了。而过滤后的表示为%5c%27。因此我们可以在前面添加一个%df,使%5c即\被吞。

构造语句

?id=-1%df%27%20%20union%20select%201,database(),3%23

成功

Less-33

本题和上题类似,不再赘述

Less-34

测试发现,这道题的单引号也被注释掉了,且错误界面都是一样的没有变化

在上面两题中,数据以url的形式提交,对于本题POST类型,可以采用将UTF-8转换为UTF-16或者UTF-32。从而达到将\吃掉的效果。例如将 ’ 转为UTF-16的�' 。

构造语句

�' union select 1,database(),3 #

发现列数不同,测试得知是两列

成功

Less-35

测试闭合,发现没有闭合,虽然过滤了单引号等符号,但是没有影响

?id=-1 union select 1,database(),3#

成功

Less-36

测试闭合,可以看到依旧过滤了单引号,且根据报错信息可以看出是单引号闭合

构造语句

?id=-1%df%27%20%20union%20select%201,database(),3%23

成功

Less-37

测试可得,依旧过滤了单引号,本题参考Less-34的思路

�' union select 1,database() #

成功

Less-38

测试可知是单引号闭合

本题是堆叠注入

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句

构造语句,在查询数据库名称的同时,在users表中插入数据

?id=-1' union select 1,database(),3;insert into users values(18,'lili','lili')%23

成功

Less-39

测试可知本题没有闭合

本题和上题类似,不再赘述

Less-40

测试闭合。。。没看出来,看源码是单引号小括号闭合

本题和上题类似,也不多说