分析SQL执行记录,发现SQL中的注入点
来源:互联网 发布:js date utc gmt 编辑:程序博客网 时间:2024/05/18 20:33
还好最近看到一份针对乌云漏洞库的统计数据(https://zhuanlan.zhihu.com/p/21373306),
其结果明确的指出 SQL注入漏洞仍然是目前WEB应用中数量最多的漏洞。
亡羊补牢,不如思患预防,最完美解决SQL注入的方法是程序中没有SQL注入点。即程序中不使用字符串拼接SQL,而全部使用占位符动态绑定参数。
为了实现上述目标。需要开发工程师的严格自律 (不可信任),和对代码进行严格的review (额外成本). 为了提高发现SQL注入点的效率。我们尝试分析Datahekr审计功能中记录的SQL执行记录,以自动化的方式发现SQL中存在的注入点。分析步骤如下:
1. 分析SQL
以如下SQL为例。
SELECT * FROM city_list WHERE CITY_NAME_EN = 'aaaa' and CITY_NAME_CN = ?SELECT * FROM city_list WHERE substring(CITY_NAME_EN,2,1) = ?SELECT * FROM city_list WHERE substring(CITY_NAME_EN,2,1) = ?SELECT * FROM city_list WHERE CITY_NAME_EN = 'SH' and CITY_NAME_CN = ?SELECT * FROM city_list WHERE CITY_NAME_EN = 'BJ' and CITY_NAME_CN = ?SELECT * FROM city_list WHERE CITY_NAME_EN = ? and CITY_NAME_CN = '上海'
我们先进行SQL的解析。取得SQL中hardcode的数值,并对hardcode的参数进行参数化替换,得到如下结果。
SELECT * FROM city_list WHERE CITY_NAME_EN = ?0 and CITY_NAME_CN = ??0 = 'aaaa'SELECT * FROM city_list WHERE substring(CITY_NAME_EN, ?0, ?1) = ??0 = 2, ?1 = 1, SELECT * FROM city_list WHERE substring(CITY_NAME_EN, ?0, ?1) = ??0 = 2, ?1 = 1, SELECT * FROM city_list WHERE CITY_NAME_EN = ?0 and CITY_NAME_CN = ??0 = 'SH'SELECT * FROM city_list WHERE CITY_NAME_EN = ?0 and CITY_NAME_CN = ??0 = 'BJ'SELECT * FROM city_list WHERE CITY_NAME_EN = ? and CITY_NAME_CN = ?0?0 = '上海'
2. 合并相同结构SQL,并统计hardcode参数中出现的不同参数值。
SELECT * FROM city_list WHERE CITY_NAME_EN = ?0 and CITY_NAME_CN = ??0 = 'aaaa','SH','BJ'SELECT * FROM city_list WHERE substring(CITY_NAME_EN, ?0, ?1) = ??0 = 2, ?1 = 1SELECT * FROM city_list WHERE CITY_NAME_EN = ? and CITY_NAME_CN = ?0?0 = '上海'
在
SELECT * FROM city_list WHERE CITY_NAME_EN = ?0 and CITY_NAME_CN = ?
的参数 ?0 中,出现了3个不同的参数值,所以预测
SELECT * FROM city_list WHERE CITY_NAME_EN = 'aaaa' and CITY_NAME_CN = ?
中 'aaaa' 处存在注入点。
在其他SQL中,虽然也存在hardcode的数值,但是没有出现不同的数值。所以不认为是SQL注入点。
注意点1:
SQL中可能出现枚举类型:
SELECT * FROM city_list WHERE ACTIVE = 1 and CITY_NAME_CN = ?SELECT * FROM city_list WHERE ACTIVE = 0 and CITY_NAME_CN = ?SELECT * FROM city_list WHERE TYPE = 'A' and CITY_NAME_CN = ?SELECT * FROM city_list WHERE TYPE = 'B' and CITY_NAME_CN = ?SELECT * FROM city_list WHERE TYPE = 'C' and CITY_NAME_CN = ?
枚举类型在SQL中常常是hardcode存在的。为了避免将枚举类型误报为SQL注入点。我们需要考虑hardcode参数值样本, 例如超过10个不同的值,才认为是注入漏洞。
注意点2:
对于Mysql,因为默认useServerPrepStmts = false,
(请参考http://blog.csdn.net/axman/article/details/6913527),
导致所有发送到DB的SQL中都不包含动态参数,全部参数值都被替换入SQL文本中. 所以无法通过本文所述的方法进行SQL注入点分析。
请先开启useServerPrepStmts = true, 才可以使用本文的方法进行分析。
结束:
本文提供了一个针对SQL执行记录的大数据分析实例,希望能抛砖引玉,发现更多针对SQL的大数据分析思路,分析出一些有趣的结果。
本文提及的分析方法,已经应用于 Datahekr (SAAS 数据库安全中间件) 中,请大家免费注册试用。
- 分析SQL执行记录,发现SQL中的注入点
- 如何查找SQL注入点
- 寻找SQL注入点
- 寻找SQL注入点
- 寻找SQL注入点
- 手动sql注入记录
- sql注入记录
- spark sql 学习中的几点记录
- SQL注入分析
- SQL注入分析
- SQL注入安全分析
- SQL注入安全分析
- SQL注入攻击分析
- sql注入逻辑分析
- 查看SQL执行记录
- ASP中的SQL注入
- 登陆中的SQL注入
- 如何找到SQL注入点
- 动画不常见属性笔记
- 由图像恢复摄像机的参数
- IOS中UITableViewCell使用详解
- 深入QuickReport(二)
- BAT Android工程师面试流程解析+还原最真实最完整的一线公司面试题
- 分析SQL执行记录,发现SQL中的注入点
- CodeForces 554B Ohana Cleans Up
- kendo ui grid选中行事件,获取combobox选择的值
- 实现每个月一行日历效果的ListView
- Android LayoutInflater详解
- Ubuntu 16.04 LTS下编译GPU版tensorflow
- 海马玩模拟器——搭建React Native环境
- C语言数组作为函数参数及保护数组内容
- Jstl之对取到的时间进行格式化