order by 、limit注入,以及宽字节注入

一、order by注入 

尝试?sort=1 desc 或者 asc,显示结果不同,则表明可以注入。(升序 or 降序排列)
从上述的 sql 语句中我们可以看出,我们的注入点在 order by 后面的参数中,而 order by
不同于的我们在 where 后的注入点,不能使用 union 等进行注入。
如果order by '1’显示的是默认排序
 

?sort=(select ******)
报错

?sort=(select extractvalue(0x7e,concat(0x7e,database(),0x7e)))

延时

?sort=1 and(select if(length(database())=8,sleep(5),1))

利用一些函数

例如 rand()函数等。?sort=rand(sql 语句)
rand()函数
rand(ture)和 rand(false)返回的结果不一样
payload

?sort=rand(length(database())=8)

利用 and

例如?sort=1 and (加 sql 语句)。
同时,sql 语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
布尔注入

?sort=1 and(select extractvalue(0x7e,concat(0x7e,database(),0x7e)))

order by stacked injection

order by 堆栈注入

?sort=1;create table less50 like users

二、limit注入

1.今天听学长们交流漏洞挖掘的经验,提到了Limit注入,借此来学习一下limit注入

2.limit

LIMIT[位置偏移量,]行数

其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依此类推...,第二个参数为“行数”即指示返回的记录条数。效果如图 自行理解

order by 、limit注入,以及宽字节注入_第1张图片

benchmark

benchmark函数有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式 

比如 benchmark(10000000,sha1(1))

意思是执行sha1函数10000000次 使mysql运算量增大 导致延时 有点类似与多表联合查询(笛卡尔积)如图

order by 、limit注入,以及宽字节注入_第2张图片 

大概执行10000000次会造成3秒以上的延时

3.

Example:select*from limittest limit 1,[可控点] or select ... limit [可控点]

limit后面能够拼接的函数只有into和procedure,into可以用来写文件,本文我们不考虑。

在Limit后面 可以用 procedure analyse()这个子查询

而且只能用extractvalue 和 benchmark 函数进行延时

procedure analyse(updatexml(rand(),concat(0x3a,benchmark(10000000,sha1(1)))),1)

如图

4.脚本批量检测

我的思路是将获取的url的每个id用poc来测试查看有没有延时。

 

三、宽字节注入

1、涉及函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符

mysql_escape_string() 转义一个字符串

2、原理分析
先了解一下什么是窄、宽字节已经常见宽字节编码:

当某字符的大小为一个字节时,称其字符为窄字节.

当某字符的大小为两个字节时,称其字符为宽字节.

所有英文默认占一个字节,汉字占两个字节

常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等

为什么会产生宽字节注入,其中就涉及到编码格式的问题了,宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入

如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题,原因是程序员为了防止SQL注入,就会调用我们上面所介绍的几种函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠(\)进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠(\)组合被当作一个汉字,从而保留单或双引号,使其发挥应用的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。
 

 

你可能感兴趣的:(sql,mybatis,数据库)