审计 SQL 注入风险,核心目标是发现代码中“用户输入未被安全处理就拼接到 SQL 语句”的地方。下面从方法论 → 具体做法 → 工具 → 报告四个层面说明。
SQL 注入产生的必要条件:
审计重点就是找:
不可信数据 → SQL 语句 的传递路径
先找所有“执行 SQL”的代码:
PreparedStatement、Statement、MyBatis、Hibernatemysqli_query、PDO、ORMcursor.execute、SQLAlchemymysql.query、sequelize关键词搜索示例:
SELECT, INSERT, UPDATE, DELETE
execute, query, raw, createSQL
+
concat, +, format, f-string, %
✅ 安全示例:
String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
❌ 危险示例:
String sql = "SELECT * FROM user WHERE name = '" + name + "'";
审计结论:
? / 命名参数 → 基本安全关注输入入口:
例如:
Controller.getParameter("id")
→ Service
→ DAO
→ SQL(拼接)
只要中间没有安全处理,就是注入点。
ORDER BY ${column}
参数化无法解决,必须用白名单
LIKE / IN
需要特殊处理 % 和 _
存储过程 / 动态 SQL
EXEC('SELECT * FROM ' + @table)
stmt.execute("SELECT *; DROP TABLE user")
示例(Semgrep):
- pattern: $DB.query("SELECT ... " + $INPUT)
sqlmap -u "http://site.com?id=1" --risk=3 --level=5
| 情况 | 等级 |
|---|---|
| 拼接 + 用户输入 + 可执行 | 高危 |
| 拼接 + 内部参数 | 中危 |
| 参数化 | 低危 |
审计 SQL 注入 = 找“用户输入”如何进入“SQL 语句”,并确认是否参数化。
如果你愿意,可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。