记一次EDUSRC实战——从搜索框到数据库的POST型SQL注入
1. 从搜索框到数据库的奇妙旅程那天我像往常一样在高校官网上闲逛突然发现继续教育学院网站有个录取查询功能。出于职业习惯我在搜索框随手输入了一个单引号没想到页面直接给我来了个大礼包——完整的SQL报错信息。这种POST型SQL注入漏洞在高校网站中并不少见但能遇到回显这么详细的确实难得。POST型注入和GET型注入最大的区别在于参数传递方式。GET型注入的参数会直接显示在URL中而POST型则是通过表单提交在地址栏看不到参数。这就好比一个是明信片一个是密封的信件。要测试POST型注入必须借助Burp Suite这类工具来拦截和修改请求。2. 漏洞初探与手工测试2.1 基础测试三板斧我先用最基础的测试语句试水and 11页面正常显示and 12页面内容消失单引号触发数据库报错报错信息直接暴露了关键信息SELECT * FROM baoming_list WHERE shenfenzhenghao 2 AND xingming 11 AND xuexiao_id 15 LIMIT 1不仅看到了表名(baoming_list)和字段(shenfenzhenghao、xingming、xuexiao_id)还知道了网站使用MySQL数据库甚至爆出了绝对路径/www/wwwroot/baomingxxxxxx.com/chaxun.php。2.2 字段数量探测接下来用order by确定字段数量1 order by 19-- 正常 1 order by 20-- 报错确认有19个字段后尝试联合查询1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19#发现页面只显示身份证和姓名字段其他字段虽然存在但不显示。这时候就需要考虑盲注或者报错注入了。3. Burp Suite实战应用3.1 抓包改包的艺术用Burp Suite拦截搜索请求发现是POST到chaxun.php的三个参数typenameuser_id数据没有加密简直是安全测试的理想目标。我把请求发送到Repeater模块方便反复测试。3.2 报错注入技巧当联合查询不显示数据时报错注入就成了利器。我用了经典的extractvalue函数xx and (extractvalue(1, concat(0x5c,(user()),0x5c)))#成功获取到数据库用户baomingxxxxxlocalhost当前数据库baomingxxxxx数据库版本MySQL 5.5.62服务器系统Linux中间件Nginx/1.16.14. sqlmap自动化利用4.1 从手工到自动化把Burp抓到的请求保存为1.txt在注入点参数值前后加上*作为标记type*1*name*test*user_id*123*然后交给sqlmap处理sqlmap -r 1.txt --batch --risk3 --level54.2 数据库信息收集sqlmap确认存在布尔盲注和延时注入漏洞进一步获取所有数据库名指定数据库的表名关键表的列名最终拖取管理员账号密码5. 漏洞修复建议测试完成后我立即向学校相关部门提交了漏洞报告。这类问题的修复其实并不复杂使用预编译语句(PreparedStatement)替代动态SQL拼接对用户输入进行严格过滤和转义配置数据库最小权限原则关闭错误回显高校网站往往存在历史遗留问题但只要有安全意识这类基础漏洞完全可以避免。作为安全研究人员我们既要善于发现问题也要负责任地披露问题。