一、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)
例如?sort=1 and (加 sql 语句)。
同时,sql 语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
布尔注入
?sort=1 and(select extractvalue(0x7e,concat(0x7e,database(),0x7e)))
order by 堆栈注入
?sort=1;create table less50 like users
二、limit注入
1.今天听学长们交流漏洞挖掘的经验,提到了Limit注入,借此来学习一下limit注入
LIMIT[位置偏移量,]行数
其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依此类推...,第二个参数为“行数”即指示返回的记录条数。效果如图 自行理解
benchmark函数有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式
比如 benchmark(10000000,sha1(1))
意思是执行sha1函数10000000次 使mysql运算量增大 导致延时 有点类似与多表联合查询(笛卡尔积)如图
大概执行10000000次会造成3秒以上的延时
3.
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,才到汉字的范围 ,这一点需要注意。