# 定义:
二次注入是指已存储(数据库,文件等)的用户输入被读取后再次进入到SQL查询语句中导致注入。可能每一次注入都不构成漏洞,但是如果一起用就可能造成注入。
# 成因:
本质上是信任问题。
开发者可能不信任直接来自于用户的数据,对其进行严格的过滤后存储。但是对于已存储的数据就不会进行过滤,转义,取出后直接放入SQL语句中,可能导致注入。
# 危害:
* SQL注入的危害
* 隐蔽性好,不易被发现,更危险
* 数量少
* 攻击位存在于DB上,DB上的操作有限
# 二次注入漏洞与普通注入漏洞的区别:
* 二次注入是sql注入的一种,但是比普通sql注入难利用,利用门槛高
* 普通注入数据直接进入到SQL查询中
* 二次注入是输入数据经处理后存储,取出后,再次进入到SQL查询
* 渗透过程越复杂,不确定因素越多,成功率越低。如果二次注入必须由管理员在后台来被动触发,更加难以实现
* 二次注入漏洞只能靠人工,需要对应用有一个完整的理解
# 二次注入漏洞挖掘:
* 需要理解+细心+耐心;要注意敏感函数是否在使用
* 在回溯数据输入是,需要考虑来自数据库,文件等的输入。回溯这些输入的初始来源,进一步判断是否可控
* 跨语言的应用,容易导致问题。比如前台PHP,后台java
* 在查询函数上打点,断点,或者log都可以。然后回溯代码,观察log
# 防御:
* 预处理+数据绑定
* 对所有的输入一视同仁,不论输入来自用户还是存储,在进入SQL查询前都对其进行过滤,转义
* 代码审查的时候,禁止开发用拼接的方式执行sql
# 易出现二次注入漏洞的功能:
* 日志相关:存日志时,读取了一些数据库里的信息,比如用户名等,然后又存储了一次
* 跨程序的数据传递:程序A处理完后存储到数据库,程序B去读取,未进行过滤