什么是二次注入

​ 二次注入是指已存储(数据库,文件等)的用户输入被读取后再次进入到SQL查询语句中导致注入。可能每一次注入都不构成漏洞,但是如果一起用就可能造成注入。

​ 二次注入类似于存储型XSS,在提交payload的时候不会直接对WEB应用程序产生影响,通过其他的辅助剪辑的对WEB产生危害。

为什么会出现二次注入

​ 本质上和SQL注入一样都是源于信任问题,不同的是二次注入是卡发着可能不信任直接来自于用户的数据,对其进行了严格的过滤和转义后进行了存储。但是对于已存储的数据就不会进行过滤,转义,取出后直接放入SQL语句中导致了二次注入的产生

二次注入的原理

image-20210128204724665

(图片是我白嫖来的,嘻嘻)

核心原理:数据在存入数据库后还原成了用户输入的形式,当在数据库取出的时候,没有再次进行过滤和转义,从而造成了二次注入。

二次注入漏洞与普通注入漏洞的区别:

  • 二次注入是sql注入的一种,但是比普通sql注入难利用,利用门槛高
  • 普通注入数据直接进入到SQL查询
  • 二次注入是输入数据经处理后存储,取出后,再次进入到SQL查询
  • 渗透过程越复杂,不确定因素越多,成功率越低。如果二次注入必须由管理员在后台来被动触发,更加难以实现
  • 二次注入漏洞只能靠人工,需要对应用有一个完整的理解

二次注入可能存在在什么地方

  • 存在转义函数的地方

  • 在回溯数据输入的地方,如修改用户账户密码、修改文章标题

  • 跨语言的应用,容易导致问题。比如前台PHP,后台java

  • 日志相关:存日志时,读取了一些数据库里的信息,比如用户名等,然后又存储了一次

  • 跨程序的数据传递:程序A处理完后存储到数据库,程序B去读取,未进行过滤

如何防御二次注入

  • 预处理+数据绑定
  • 对所有的输入一视同仁,不论输入来自用户还是存储,在进入SQL查询前都对其进行过滤,转义
  • 代码审查的时候,禁止开发用拼接的方式执行sql