web渗透案例
一个登录框,透案两个参数,透案十五分钟。透案某企业的透案内网就被翻了个底朝天。这不是透案电影情节,是透案我上个月做的一次授权测试。目标是透案一个看似普通的员工考勤系统,页面干干净净,透案连验证码都没有。透案
我先用admin/admin试了一下,透案提示“密码错误”。透案换成admin/123456,透案还是透案错误。但页面返回的透案信息有个细节:用户名不存在时,提示“用户不存在”;密码错误时,透案提示“密码错误”。这就给了枚举用户名的机会。写个脚本跑一遍常见姓名拼音,三分钟拿到十几个有效账号。其中有个叫“zhangwei”的,密码是“zhangwei123”。
登进去之后,界面很简陋,功能就几个:签到、请假、查工资条。工资条那个链接是 /salary_detail?id=1024。我改成1025,页面刷新,出现了别人的工资。改成1026,继续出。一直改到1100,全公司的薪资数据都在我手里了。越权漏洞,水平越权加垂直越权混在一起。普通员工能看所有人的工资,包括老板的。
这还没完。工资条页面有个“导出Excel”按钮,点下去请求是 /export?file=salary_202405.xls。我把文件名改成 ../../../../etc/passwd,服务器直接返回了系统用户列表。路径穿越。再试试 ../../WEB-INF/web.xml,配置文件也读出来了。数据库连接串、后台管理员密码,全在里面躺着。
拿到数据库账号后,我没有直接连。先看web.xml里有没有其他入口。果然,有个 /admin/backup.jsp,访问提示需要管理员Session。但刚才读到的配置文件里有个硬编码的token,backup_token=8f3a...。带上这个token再访问,直接下载了整站源码压缩包。
源码里翻了翻,发现登录逻辑用的是 String sql = "select * from users where username='" + username + "' and password='" + password + "'";。经典SQL注入。但登录框做了过滤,单引号被转义了。不过有个“忘记密码”功能,提交用户名后返回密保问题。那个接口没过滤,直接注入。用sqlmap跑了一下,--os-shell都出来了。
从发现越权到拿到服务器权限,前后不到四十分钟。这个系统的问题很典型:开发觉得“内网系统没人看”,前端校验当安全措施,后端参数不检查,配置文件明文存密码。最离谱的是,那个考勤系统的登录页面底部写着“© 2023 某某科技 版权所有”,但源码里连个版本号都没改,用的还是三年前的框架。
我写报告的时候,客户问我:“你怎么这么快就进来了?”我说:“不是我快,是你们把门都拆了。”
渗透测试这行做久了会发现,大部分漏洞根本不需要什么高深技术。一个参数没校验,一个权限没判断,一个文件没过滤,就足够把整个系统撕开。工具再强,也强不过开发人员随手写的一句 request.getParameter("id") 直接拼进SQL。安全不是加个WAF就完事,得从每一行代码开始较真。
(责任编辑:焦点)
