来到第五关 Please input the ID as parameter with numeric value ------请用数值输入ID作为参数
构造参数?id=1' and 1=1--+ 在url后面,页面显示为You are in.......
将参数改为?id=1' and 1=2--+ 后页面不显示任何内容,由此我们可以确定这是存在sql注入漏洞的
尝试使用order by x 探测一下表中字段的列数,在这里使用了3,发现有回显
将3改为4后报错,未找到该列,说明表中字段列数为3
尝试用联合注入探测一下回显位,页面显示You are in..证明这是基于布尔的盲注,这一步基本没用
直接使用函数length(a)探测一下当前数据库名的长度
length(a)函数:返回a的字符长度
如果是length("a")则返回字符串a的长度,即1
得出大概长度后可以直接确认字符长度是否等于某个数值
接下来使用函数left(a,b)探测具体字母
字母的大小怎么比较,这个是看字母的ASCII值的,以下是大小写字母的ASCII值的对照
函数返回的字符会和大小写字母分别比对ASCII值的,比如
将其和大写字母T比较时,页面显示是正确的,这是因为大写字母S的ASCII值小于T的ASCII值
同理,猜出大致范围后可以直接比较
将1改成2可以直接比较后面几位
直到全部猜解
看到这里你可能会觉得这得猜多久,但事实就是没有其他的函数能够帮你缩短这个过程,比如将其转化为ASCII值,只不过是将字母换成了数字而已,对于缩短猜解时间没有帮助,在这里提供一个思路:
利用脚本或者工具,比如sqlmap等工具通过爆破数据库名,从而减少手工注入的时间成本。工具就像车辆,车辆会为你极大的提供便利,然而有些地方车辆也到不了,人却能够到达。
同理判断表名的长度,注意这里是使用了group_concat()函数,所以查询到的表名会使用逗号隔开一起查询出来 即 emails,referers,uagents,users 所以正确长度是29
使用substr()函数确定表名
艰难的猜解出第一个表名,这里还可以使用ASCII()函数
得到users表名,接下来猜解字段名,看到这里你不妨自己尝试构造语句,以此来检查前面的注入是否掌握。
你构造正确了吗
终于得到username和password字段名
开始猜解字段内的内容
成功猜解出第一个账号和密码,如果分不开的话 可以在账号和密码之间直接添加某个符号
到这里我们的目的基本上达成了,比如获取可供登录的账号密码或者练习布尔盲注。
谢谢观看。