审计 SQL 注入风险,通常分为代码审计、配置审计、运行态检测、流程与防护审计四个层面。下面给你一套可落地的审计方法。
重点检查是否存在字符串拼接 SQL:
String sql = "SELECT * FROM user WHERE name = '" + name + "'";
$sql = "SELECT * FROM user WHERE id = $id";
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM user WHERE name = ?");
ps.setString(1, name);
审计要点:
${}statement.execute() 动态执行 SQL常见风险点:
<select id="getUser">
SELECT * FROM user WHERE name = '${name}'
</select>
❌ ${} 是字符串替换,有注入风险
✅ #{} 才是参数绑定
重点检查:
ORDER BYGROUP BYLIMIT这些无法使用参数化,必须:
检查是否对所有外部输入做处理:
DROPFILESUPEREXECUTEsql_mode=STRICTmulti-statements常用 payload:
' OR '1'='1
" OR 1=1 --
' UNION SELECT null,version() --
测试位置:
你可以形成类似报告:
风险等级:高
位置:UserDao.java:45
问题:使用字符串拼接 SQL
建议:改为 PreparedStatement 或 MyBatis#{}
如果你愿意,我可以:
你现在是做代码审计、渗透测试,还是合规检查?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。