某次渗透测试项目中,初期进展并不顺利,几乎颗粒无收。但眼看要交差,不得不加把劲。在持续 fuzz 目录结构后,终于通过一个关键备份文件撕开了口子,最终成功拿到 Webshell。这里把完整的过程和思路复盘出来,希望能带来一些启发。
0x01 获取备份文件
起初对目标站点进行常规目录扫描,结果基本都是一些 403 响应,收获不大。

但直觉告诉我这里可能没那么简单,于是重新调整了 fuzz 策略,把目标公司的英文缩写拼接到目录名里继续跑。果然大力出奇迹,最终找到了一个备份压缩包。


解压后进入备份文件夹,里面包含了不少敏感配置和代码目录。

0x02 通过钉钉 KEY 和 SECRET 获取敏感信息
在备份文件里发现了一个环境变量配置文件 env,其中明文存放着微信小程序、公众号、QQ 以及钉钉等多个 IM 通讯平台的 Key 和 Secret。

我逐一尝试利用这些微信相关的凭证,却都因接口可能存在 IP 白名单或其他限制,没能成功拿到 access_token。不过,钉钉的 Key 和 Secret 倒是可以正常利用。通过调用钉钉官方 API 即可获取到 access_token。

拿到 token 之后,能操作的数据空间就一下子打开了。这里仅以“获取部门列表”为例展示一下调用效果。

根据 API 手册调用后,可以成功拉取到组织通讯录的详细信息。

0x03 微信支付宝支付接口信息泄露
在 Web.config 文件中,还找到了微信支付和支付宝的接口配置信息,包括商户私钥、公钥、商户号、应用 AppID 等。

这些支付密钥一旦泄露,潜在的风险非常直接。举例来说,攻击者有可能通过伪造请求,实付 1 元却购买价值 100 元的商品。这是因为系统在校验时,若只验证了签名和商户号是否正确,而缺失了对实际支付金额和订单金额的严格比对,就会导致订单金额被篡改后依然认为支付成功。在许多实际案例中,确实有不少站点因此类逻辑漏洞被“薅羊毛”。

更严重的是,备份文件中还一同泄露了支付证书文件 apiclient_cert.p12。

有了这份证书,就可以调用微信支付中那些安全级别更高的接口了,比如退款、企业红包发放、企业付款等操作。当然,本次测试点到为止,没有进行真实利用。
0x04 接口文档泄露导致 Getshell
在泄露的文件中,还藏着一份接口文档。翻阅后发现其中定义了一个文件上传的接口。

对这个接口进行测试,发现它竟然是未授权访问的,并且可以上传 Webshell 文件。

然而,接口返回的数据里并没有直接给出 Webshell 的完整访问路径。于是继续发扬“大力出奇迹”的风格,开始爆破常见的上传目录。我整理了一批常用路径进行尝试:
file/
fileRealm/
file_manager/
file_upload/
fileadmin/
fileadmin/_processed_/
fileadmin/_temp_/
fileadmin/user_upload/
upload/
filedump/
filemanager/
filerun/
fileupload/
files/
files/cache/
files/tmp/
logfile/
paket-files/
profile/
profiles/
在爆破过程中,留意到 uploadFile 这个路径的响应状态和别的都不太一样。

顺着这个线索最终找到了准确的 Webshell 地址,并使用管理工具成功连接。

0x05 总结
这次能拿到这么多战果,起点全在那个备份文件。关于目录 fuzz 的思路,其实很大程度上借鉴了密码爆破的逻辑。很多人觉得设置了复杂密码就万无一失,但现实中密码的构成往往还是有迹可循的。
这里提供一个简单的小脚本,思路就是针对目标公司或系统的常用缩写,生成一系列带数字、特殊符号后缀的字典,用于口令爆破或目录拼接。脚本本身比较简陋,大家可以根据自己的思路继续完善。
#coding=utf-8
import sys
# 检查命令行参数
if len(sys.argv) < 2:
print("错误:请提供密钥参数")
print("用法:python script.py <key>")
sys.exit(1)
key = sys.argv[1]
f = open("%s.txt" % key, "w")
list1 = [123,321,1234,4321,123456,654321,12345678,123456789,1234567890,888,8888,666,6666,163,521,1314,1,11,111,1111,2,222,3,333,5,555,9,999]
list2 = ['#123','#1234','#123456','@123','@1234','@123456','@qq.com','qq.com','@123.com','123.com','@163.com','163.com','126.com','!@#','!@#$','!@#$%^','098']
for j1 in list1:
pwd1 = key + str(j1) + '\n'
f.write(pwd1)
for j2 in list2:
pwd2 = key + str(j2) + '\n'
f.write(pwd2)
for i in range(1000,2021):
pwd3 = '{}{}{}'.format(key, i, '\n')
f.write(pwd3)
f.close()
print(key + ' password ok')
效果:


另外在密钥的利用上,务必要注意区分是企业内部应用还是第三方应用,这会直接影响接口的选择和权限范围。对于微信密钥的更多利用思路,可以参考业内大佬的这篇分析:https://xz.aliyun.com/t/11092
最后关于文件上传那一步,确实也花了不少时间,在不断尝试和调整后才成功传了上去。回顾整个攻击链,从备份文件中的信息泄露,到逻辑漏洞的分析,再到接口的未授权上传,整个渗透测试过程环环相扣。这种围绕信息泄露进行深度利用的思路,往往能带来意想不到的成果,平时不妨多加留意。