今天在审查项目代码时,发现文件数量虽然不多,但每个文件里都散布着大量SQL注入点,让人目不暇接。如果逐一手动排查,效率极低。于是花时间编写了一套正则表达式,用于快速筛选可疑语句并过滤掉安全的代码,大幅提升了工作效率。
下面分享这套正则的使用方法,主要针对三类常见的SQL操作:SELECT、UPDATE、DELETE。这些正则表达式能帮助开发者高效地进行SQL注入漏洞检测。
1. 检测SELECT、UPDATE、DELETE语句
((select|SELECT|update|UPDATE|delete|DELETE) .*(from|FROM|set|SET) .*(where|WHERE) .*)
该正则表达式的目标非常明确:只要SQL语句中同时包含操作关键字(SELECT/UPDATE/DELETE)、FROM或SET子句以及WHERE条件,就会被筛选出来。因为缺少条件判断的查询通常不会产生注入风险,所以只关注包含WHERE子句的语句即可有效缩小排查范围。
示例如下:
select * from user where ...
2. 数字型SQL注入检测
((select|SELECT|update|UPDATE|delete|DELETE) .*(from|FROM|set|SET) .*(where|WHERE) .*=[ ]?["]?["]?\$)
该正则表达式覆盖了SELECT、UPDATE、DELETE三种语句,并匹配了五种常见的数字型注入写法。以下是几个典型场景的示例:
变量直接传入
select * from guess where id=$subject_id
update guess set is_valid=0 where id=$subject_id
delete from guess where id=$subject_id
等号与变量之间存在空格
select * from guess where id= $subject_id
update guess set is_valid=0 where id= $subject_id
delete from guess where id= $subject_id
变量用双引号包裹
select * from guess where id="$subject_id"
update guess set is_valid=0 where id="$subject_id"
delete from guess where id="$subject_id"
等号与双引号之间存在空格
select * from guess where id= "$subject_id"
update guess set is_valid=0 where id= "$subject_id"
delete from guess where id= "$subject_id"
等号与引号、双引号之间存在空格
select * from guess where id= "$subject_id"
update guess set is_valid=0 where id= "$subject_id"
delete from guess where id= "$subject_id"
实际开发中,将这些正则表达式应用到代码搜索工具中,基本可以覆盖大部分数字型SQL注入的排查需求。当然,字符串型注入还需要另行处理,但优先解决数字型注入,已经能显著提升审计效率。
