在对某医疗系统进行纯黑盒测试时,由于目标未对WAF添加任何白名单策略,导致IP在发送恶意字符时频繁被封禁。测试过程需采用“飞行模式-访问网站-飞行模式”的间歇性连接策略,以规避检测。幸运的是,其中一个子系统拦截机制相对宽松,得以开展后续测试。
首先映入眼帘的是系统登录框,抓包发现登录过程为明文传输,省去了寻找加解密函数的麻烦。

随意输入“1111”作为用户名和密码,系统返回了明确的“用户名或密码错误”提示,这为用户名枚举创造了条件。

利用自定义用户名字典进行爆破,同时将爆破速率降至每秒一次,避免触发封禁。

最终成功枚举出两个有效用户名。在后续使用数万条密码字典进行慢速爆破时,竟发现其中一个账号存在弱口令,成功登录。

该账号权限较低,仅具备订单查询功能。在查询框尝试基础SQL注入探测,如 or 1=1,发现未触发IP封禁,便深入进行测试。
抓取查询请求数据包,初步测试发现单引号被过滤,导致无法构造闭合。尝试使用CHR()函数绕过未果。在耗时两小时后,转换测试思路,对数据包中另一个未使用百分号和括号的参数进行探测,此时仅需解决单引号问题。
因AI生成的Payload持续包含单引号,故转向测试基于时间盲注的Payload。初次尝试的延迟语句导致数据库连接失败并再次触发封禁。调整策略后,通过资料检索获得了有效的Oracle数据库时间盲注Payload:
' AND CASE WHEN ((SUBSTR((SELECT user FROM dual),1,1))='A') THEN DBMS_PIPE.RECEIVE_MESSAGE('rds',3) ELSE 0 END=0 AND '1'='1
其原理是,利用SUBSTR函数截取当前数据库用户的第一个字符,判断是否等于‘A’,若条件为真则执行DBMS_PIPE.RECEIVE_MESSAGE函数引发3秒延迟,否则无延迟。使用Burp Suite对此Payload进行遍历爆破。

通过时间差成功判断出数据库用户信息,证实了SQL注入漏洞的存在。值得注意的是,直接使用SQLmap或代理池测试在此场景下均告失败。
成功登录的两个账号中,账号A无任何功能菜单,账号B具有订单查询功能。这引发了越权测试的构想:将低权限账号A的Cookie,替换到高权限账号B的查询接口请求中,以验证是否存在水平越权。测试结果表明,系统在此处做了有效的权限校验,越权未成功。


在对账号B的功能进行深入探索时,发现一处文件上传点。

根据经验,此类功能常为前端校验。通过抓包修改文件扩展名,尝试上传JSP文件。

上传成功,这导致了严重的文件上传漏洞,并最终实现了getshell。初步上传的Webshell因特征明显被拦截,后续通过多层Base64编码等方式进行混淆免杀,成功绕过防护。
|