永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性

学习编程之初就常被告诫:“永远不要相信用户的输入”,但实际编码中,可能因为各种原因而忽略这点,本文尝试以 SQL 注入的角度探寻校验输入的重要性 以下实验均以 SQLI labs 靶场为例 1. 联合注入(Union-Based) 来自:Less-1 这是一个常见的查询页面。http://127.0.0.1/Less-1/?id=1 ,通过 id=1 传递参数。后端常见的 SQL 写法:SELECT * FROM users WHERE id='$id' LIMIT 0,1; 攻击者可以通过构造 id 的参数值,执行任意的 SQL 语句: 其中关键步骤是构造 1' --+: 通过某个具体参数 1 和 单引号 ' 来结束前面的语句:SELECT * FROM users WHERE id=',使其成为合法的 SQL 语句: SELECT * FROM users WHERE id='1' 通过 --+ 来注释后面的 ' LIMIT 0,1"; 基于上面的原理,我们就可以在 1' 和 --+ 之间插入语句了,进行联合注入,具体步骤如下: 通过 order by 测列宽:?id=-1' order by 4 --+,通过不断尝试和错误提示可以得知列宽为 3 判断回显值对应的位置,?id=-1' union select 1,2,3 --+,2 和 3 这两个位置都可供使用 ...

February 25, 2025