Sqli-Labs 闯关 less 26-31
Less 26:
因为出现字符转义问题,所以我们在kail的docker环境下,用windows2008访问sql-labs。
首先输入id=1返回正确,然后输入id=1'返回报错,说明可能存在注入漏洞,用--+尝试注释无效后改用;%00返回正确。。。


将注释符改为or '1'='1返回正确,但通过提示发现or被替换了,这里使用双写尝试,返回正确且提示中有or,但没有空格。。。

查看Less 26的index.php发现它将空格和其它一些字符也进行了替换。。。

因为不能使用空格,所以可以考虑空格,使用报错注入进行查库等操作。。。

查表,空格用括号包裹。。。

查字段。。。

查字段的值,发现返回值缺省。。。

我们用where的方式通过改变id的值从而实现所有数据的遍历。。。

我们知道也可以将or换成and,也就是||换成&&,但是&被替换了,所以这时候需要考虑字符编码的问题,将&&改为%26%26,空格用%a0进行替换。。。
参考链接:https://www.w3school.com.cn/tags/html_ref_urlencode.html
这时候有我们直接将所有的空格进行替换,注释符可以使用;%00或者是使用||'1'='1即可完成注入。。。

Less 26a:
输入id=1返回正确,输入id=1')返回错误但没有错误信息,用%26%26('1')=('1进行闭合返回正确。。。

因为没有返回错误信息,所以我们查看Less 26a的index.php文件查看,发现与Less 26不同的点在于它注释了返回错误的语句。。。

使用order by函数检测有3列。。。

使用union select进行联合查询,id=1111来进行回显。。。

然后使用联合查询将3替换就可以了,替换时需将其中所有的空格用%a0进行替换。。。
Less 27:
输入id=1返回正确,输入id=1'返回错误,输入id=1';%00返回正确。。。

保险起见,我们先查看Less 27的index.php文件,发现报错信息没有被注释,可以使用报错注入,没有将区分大小写将其注释掉,所以可以使用大小写进行绕过。。。

使用order by函数检测数据库有3列。。。

使用union select函数查看,中间穿插大小写,使用id=1111'得到数据回显。。。

然后使用联合查询将3替换就可以了,替换时需将其中所有的空格用%a0进行替换。。。
第二种方法就可以使用报错注入了。。。
查库。。。

因为group_concat()会出现数据缺省,所以使用limit来遍历所有数据。。。
因为对select进行了替换,所以使用大小写。。。
依次进行查库,查表,查字段,查数据等操作,注意所有的空格都要使用%a0替换。。。

Less 27a:
输入id=1返回正确,输入id=1'返回也正确,输入id=1"返回报错。。。

方法一:使用union select联合查询,输入id=1111"使其回显,union select使用大小写,空格用%a0替换,与Less 27唯一的区别就是单引号换成了双引号,其余均相同。。。

方法二:使用基于时间的盲注。。。
注意:在句子后面不能使用or,因为使用or的情况下,无论前面是否正确,返回都为真。。。

也可以将前面的and改为or,id使用不存在的id。。。

Less 28:
首先输入id=1,返回正确,输入id=1'返回错误说明存在注入漏洞。。。

使用||'1'='1进行闭合,返回正确。。。

使用union select联合查询进行操作,发现正确的操作却返回错误的结果。。。

我们用Windows的sql-labs试一下,因为可以看到返回值,发现它对id值进行了包裹。。。

对id值进行包裹有什么用呢?我们用mysql做一下演示,发现只有括号内为true,返回为1,false返回为0。。。

那么这个坑怎么解决呢?我们可以输入id=1')使其先进行闭合,并用注释符把后面的括号进行注释,输入一个不存在的id值使其回显。。。

也可以将注释符替换为||('1')=('1,||也可以替换为%26%26

之后可以将2替换为查库查表的操作,与之前相同。。。
因为它没有显示返回报错,所以我们不能使用报错注入。。。
方法二:我们可以使用基于时间的盲注,通过替换database()来进行判断。。。

Less 28a:
首先输入id=1返回正确,输入id=1'或者id=1')返回错误,说明存在注入漏洞,但没有报错信息,说明无法进行报错注入。。。

这里我们查看Less 28a的index.php文件,发现它与less 28的id包裹是一样的,不同的是它把字符替换都注释了。。。


这里我们试一下order by函数和--+注释符,发现返回正确。。。

我们再试一下union select联合查询进行操作,发现返回错误。。。

再试一下使用大小写的union select,空格用%26替换,返回正确,之后将2进行替换即可实现遍历。。。

方法二:使用基于时间的盲注。。。
空格使用%a0替换。。。
这里的and也可以换成or,只不过id需要改为不存在的id。。。

之后就是将database()替换为查表查字段等,与之前相同。。。
Less 29:
首先输入id=1返回正确,输入id=1'返回错误,输入id=1'--+返回正确。。。

使用union select联合查询进行操作,id=-1进行数据回显。。。

照这么做下去就和Less 1一模一样了,Less 29其实并不是这样的,我们需要先打开phpstudy网站根目录,将sql-labs-master/tomcat-files解压到当前文件夹。。。

然后去官网下载JspStudy2016,安装完成后打开,打开其它选项菜单中的站点域名管理,选择新增,将端口改为8080,因为默认的80端口与phpstudy冲突。。。
还要改网站目录,一定要是安装JspStudy的网站根目录,不然访问不到。。。

之后修改JspStudy/WWW/sqli-labs/Less-29/index.jsp文件中的两处URL地址指向,改为指向PhpStudy中Less-29的index.php文件,后面的30,31也都要进行修改。。。

最后就可以通过火狐浏览器访问JSP的Less-29关了。。。

访问Less-29关输入id=1会报错,输入id=1&id=3返回正确,为什么会这样呢?这就涉及到了服务器的两层架构了。。。

我们首先了解一下服务器两层架构:
参考链接:https://www.cnblogs.com/lcamry/p/5762961.html
http参数污染:jsp/tomcat使用getgetParameter("id")获取到的是第一个值,php/apache使用$_GET["id"]获取的是第二个值,那么第一个id纯数字,第二个id的值注入就可以了。
接下来我们将id=1&id=3修改为id=1'&id=3返回报错。。。

改为id=10000&id=3'--+返回正确,推断出前面的id值无法注入。。。

使用order by函数判断数据库有3列,如果将' order by3--+放在id=1的后面发现返回错误,确定第一个id值就是无法注入。。。

使用union select联合查询,将id=3'改为id=113'使数据进行回显。。。

之后将3替换进行常规的查库查表查字段查数据等操作即可,也可以使用报错注入和基于时间的盲注,与之前相同。。。
Less 30:
与Less 29的不同在于单引号改为了双引号,其余均相同。。。
还有一点不同就是因为本关没有返回报错信息,所有无法使用报错注入。。。
Less 31:
与Less 29的不同在于单引号改为了"),其余均相同。。。

浙公网安备 33010602011771号