1.1.4 order,limit和from后的注入

order by 注入

这是一种特殊的注入 sql语句为 select from admin order by $id 或者"select from goods order by $_GET['order']"我们一般用order by 来判断他的列数,其实他就是一个依照第几个列来排序的过程。

order by注入是不能 直接使用and 1=1 来判断的,他需要用到条件语句。

mysql> select * from admin order by id;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | cdmin    | bdmin    |
|    2 | admin    | ddmin    |
|    3 | bdmin    | fdmin    |
+------+----------+----------+
3 rows in set (0.00 sec)

mysql> select * from admin order by username;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    2 | admin    | ddmin    |
|    3 | bdmin    | fdmin    |
|    1 | cdmin    | bdmin    |
+------+----------+----------+
3 rows in set (0.00 sec)

进一步构造payload 前面的判断并不是绝对的,我们需要构造出类似and 1=1、and 1=2的payload以便于注入出数据

可以观测到排序的结果不一样

利用报错 在有些情况下无法知道列名,而且也不太直观的去判断两次请求的差别,如下用IF语句为例

返回多条记录

利用regexp

利用updatexml

利用extractvalue

基于时间的盲注、 注意如果直接if(1=2,1,SLEEP(2)),sleep时间将会变成2*当前表中记录的数目,将会对服务器造成一定的拒绝服务攻击

数据猜解 以猜解user()即root@localhost为例子,由于只能一位一位猜解,可以利用SUBSTR,SUBSTRING,MID,以及left和right可以精准分割出每一位子串。然后就是比较操作了可以利用=,like,regexp等。这里要注意like是不区分大小写

通过下可以得知user()第一位为r,ascii码的16进制为0x72

http://192.168.239.2:81/?order=(select+1+regexp+if(substring(user(),1,1)=0x72,1,0x00)) 正确 http://192.168.239.2:81/?order=(select+1+regexp+if(substring(user(),1,1)=0x71,1,0x00)) 错误 猜解当前数据的表名

猜解指定表名中的列名

测试源码:

From

from 后面的注入比较少 还是提一下

select * from $id;

可以结合 order by 来注入

可以使用联合注入来注入

方法跟普通注入一样的一样自己加上表名

limit

这种注入也不是很常见,依照 https://rateip.com/blog/sql-injections-in-mysql-limit-clause/ 来提一下

如何利用呢 大佬们已经给出方法了 用 PROCEDURE ANALYSE 配合报错注入,所以多看文档,如果你想提升下自己的水平

这里延时只能使用BENCHMARK() 如同

Last updated

Was this helpful?