从头开始:为啥要“腐化”这个官网?
我得先交代一下背景,不然你们肯定觉得我是吃饱了撑的,没事找事干。这事儿说起来也挺窝火的,跟我以前待过的一个甲方有关系。那个甲方,老板抠门到家,用的那套老系统,说是“官方门户”,就是十年前用*搭起来的一个架子,多少年没更新过了。他们一直觉得没事,说黑客看不上他们这点破烂,安全投入?不存在的。
我当时给他们做渗透测试,报告都写了几十页了,明确指出他们后台文件上传那里有大问题,代码烂得跟豆腐渣一样。结果老板看了一眼,直接甩给我一句话:“少花里胡哨的,功能能用就行,没人能黑掉。”这话把我气得够呛。
后来我辞职了,跟那边的维护小哥还有联系。小哥跟我吐槽,说最近网站老是出一些奇怪的小毛病,慢得要命。我一听就乐了,这不就是我说的那个雷迟早要炸吗?我心里憋着一股气,决定自己动手,把这个“官方门户”给它“腐化”一下,但不是真破坏,而是要拿到能证明他们系统已经彻底裸奔的证据,狠狠打一下那个抠门老板的脸。
启动,侦查,抓取流量
我没用什么高端工具,就用我电脑上常备的那些家伙。第一步,我启动了本地的抓包工具,先摸摸底。我打开那个官网,装作一个普通用户,挨个页面点了一遍,看它跟服务器怎么交互,它给我的响应里都藏了什么东西。
我发现,他们用的Session ID机制,简直是笑话,而且有很多老旧的资源文件路径直接暴露在外面,文件名长得像一坨乱码,一看就是早期开发的遗留产物。我主要盯上了那个客户反馈和文件上传的接口。
我反复尝试:
- 我尝试了最简单的SQL注入,在登录框里塞了一些单引号。
- 结果服务器只是报了一个泛泛的错误,看来他们至少在外层套了个很基础的WAF(虽然很烂)。
- 然后我转头去看那个文件上传的接口。这个接口是给用户上传头像和附件用的,看起来无害。
找到突破口:被遗忘的上传接口
真正的问题出在文件上传。他们的逻辑是这样的:前端的JavaScript会检查你上传的文件是不是图片(.jpg, .png)。如果不是,它会弹个窗告诉你格式不对。但我们搞技术的都知道,前端的检查就是个摆设,骗骗外行还可以,对付我们?那就是笑话。
我马上开始操作。我写了一个很简单的Web Shell文件,就是一句话木马,命名为,内容很简单,就是等我远程发指令。然后我把这个文件的后缀名改成了。
我尝试直接上传这个假图片,果然,前端JS立刻报错。但我没有放弃,我直接利用抓包工具把浏览器发送出去的请求给拦截下来了。
我做了两件事:
- 第一,我改了MIME类型:把请求头里的文件类型从
image/jpeg改回了application/octet-stream(或者直接用它的原始类型)。 - 第二,我改了文件名:在请求包还没发出去之前,我把文件名的后缀从
.jpg又给改回了.asp。
点击发送。我心里狂跳了一下,因为这种低级错误,十年前的系统才会有。不到两秒,服务器响应了。它竟然返回了一个成功的上传路径!我心里狂喜,这简直就是服务器直接给我开了个后门。
腐化实现:拿到了数据库连接串
一旦文件成功上传并被服务器解析执行,我就等于拥有了对服务器的远程控制权限。我立马打开浏览器,访问那个新上传的路径,发送了第一个指令:查看系统配置文件。
指令成功执行,页面上密密麻麻地吐出了服务器的各种配置信息,包括Web服务的运行权限、路径、以及最重要的——数据库连接字符串。我看到了那个老板最宝贝的客户数据,用户名、密码(还是明文的)、IP地址,全部清清楚楚。
我没有动任何数据,只是把这个连接字符串和截图保存下来,作为证据。我随后发了一个删除指令,把我上传的那个彻底从服务器上抹掉了,清理了所有日志记录。
的结果和心得
我把这些截图和过程记录发给了那个维护小哥。小哥彻底傻眼了,他之前还觉得我说的有点夸张,现在看到自己公司的数据库密码都露在外面,吓得连夜把老板叫起来开了个紧急会议。
第二天,老板终于同意,花钱请专业团队进行一次彻底的系统重构和安全加固,据说这回花的钱,比我当时做渗透测试报告的预算多了十倍不止。
所以说,很多时候,安全问题不是技术门槛高不高的问题,而是态度问题。这种所谓“官方”的网站,很多都只是披着光鲜外衣的僵尸系统。我这回的“腐化”实践记录告诉我们一个道理:你越是不重视老系统的漏洞,它就越容易成为别人随手就能推倒的多米诺骨牌。实践出真知,这回的经历,让我对付那些老旧的ASP系统又多了一层心得。