二次注入漏洞是Web应用程序中的一种安全风险,其攻击威力与一次注入漏洞相当,但更难以检测。二次注入发生时,数据在首次插入数据库后并未进行进一步的检验与处理,导致在后续查询时,脏数据被直接读取,引发SQL注入。具体原理如下:在第一次数据插入时,特殊字符如单引号会通过转义处理,但在数据库中未被删除,保留原始数据格式。开发者误认为数据可信,未对后续查询进行额外处理。若在第二次使用时,原数据中的特殊字符参与构建SQL查询,便形成了二次注入。实战示例:以SQLIlab lesson-24为例进行演示:1. 打开题目2. 点击“注册新用户”按钮,尝试注册包含“'#”的用户名。3. 注册后登录,尝试修改密码。4. 直接尝试“admin'#”作为用户名登录失败。5. 查看源代码,发现用户名和密码均经过了mysql_real_escape_string函数处理,直接执行SQL语句会被转义“'”,故无法进行注入。6. 注册“test'#”账号,数据库中实际存储了“admin'”的用户名,说明经过处理的数据在数据库中被还原。7. 修改“admin'#”账户密码,实际修改了“admin”账户的密码,而非预期的“admin'#”账户。这是因为在密码修改SQL语句中,“#”作为注释符,导致执行修改了“admin”账户的密码。通过这一过程,即使不知道“admin”账户密码,也能实现密码修改,进而登录并进行注入。