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