凌晨两点十七分,漏洞复现我对着屏幕上一串十六进制字符发呆。漏洞复现那是漏洞复现个老掉牙的CMS系统,官方在2018年就停止了维护,漏洞复现但仍有不少小企业网站还在用它。漏洞复现漏洞编号CVE-2019-18393,漏洞复现一个简单的漏洞复现SQL注入点,藏在前台搜索框的漏洞复现keyword参数里。
复现的漏洞复现第一步永远是最枯燥的——搭环境。下载源码,漏洞复现配置PHP 5.6,漏洞复现MySQL 5.7,漏洞复现Apache。漏洞复现版本不能差,漏洞复现差了行为就不一样。漏洞复现我见过太多人因为环境不一致,复现失败后骂厂商“假漏洞”。其实漏洞就在那里,只是你喂它的数据不对胃口。这就像做菜,配方差一克盐,味道就天差地别。
注入点在搜索功能。输入单引号,页面报错,数据库错误信息直接甩在脸上。那感觉像撬开一扇没上锁的窗户。但报错只是开始,真正要的是数据。用order by判断字段数,试到第5个时报错。好,5个字段。接着用union select替换,把版本函数塞进去。数据库版本5.5.53,老得掉牙,information_schema照常工作。
提权过程没什么戏剧性。找到管理员表,用户名admin,密码是MD5加密的“123456”。彩虹表一查就出。登录后台,找文件上传点,传个PHP一句话木马。整个过程不到二十分钟。说实话,这种级别的漏洞现在几乎绝迹了,但当年它让无数小网站裸奔了好几年。厂商不修,站长不懂,黑客懒得打——便宜的服务器上跑着满是洞的程序,像没人住的旧房子,风吹日晒,门锁早就锈死了。
把复现过程写成报告时,我习惯截图留证。每个步骤都记录,包括报错信息。这不仅仅是给客户交代,更是给自己留底——万一对方说“我们系统没问题”,这些截图就是最直接的打脸证据。做渗透测试这几年,最烦的就是厂商不认账,非说漏洞是“误报”。拿证据说话,比什么都强。
凌晨四点,报告写完。我关掉虚拟机,去阳台抽了根烟。楼下24小时便利店的灯还亮着,店员趴在收银台上打盹。这个城市里无数个网站正在运行,其中不少带着类似的洞。它们不会主动爆炸,但就像定时炸弹,指不定哪天被人踩中引信。
漏洞复现这事,说白了就是替黑客提前走一遍路。走通了,你才知道哪里该修。走不通,也别庆幸——可能是你还没找到正确的姿势。技术这东西,没有侥幸。