一、前言
最近学到了代码审计一块的内容,但是使用Seay系统的时候发现一些问题,拿出来一起研究一下下,至于代码审计的流程思路等学完了再写
二、sql注入select 语句匹配不全
首先来看看系统自带的描述:SQL语句select中条件变量无单引号保护,可能存在SQL注入漏洞
,这里需要注意条件是变量无单引号保护
,所以不会匹配到select语句中有单引号包裹变量的情况。
来一个正常的语句,测试一下:select id from user where name='$username'
,结果不匹配,因为这个变量是有单引号保护的:
再来一个应该被匹配到,但是没有被匹配到的语句:mysql_query('select * from user where id = '.$_GET['id'].'')
,结果为:
上面那个sql语句匹配失败了所以进行简化(实际的意思)一下为:select * from user where id = $_GET['id']
,继续匹配一下:
结果一定成功的,因为变量是没有单引号包裹的
那么问题就出在这个语句:mysql_query('select * from user where id = '.$_GET['id'].'')
所以改一改正则匹配的语句就好了:select\s{1,4}.{1,60}from.{1,50}\bwhere\s{1,3}.{1,50}=( *\'\.){0,10}\$\w{1,20}((\[["']|\[)\${0,1}[\w\[\]"']{0,30}){0,1}(\.\'){0,10}
测试一下:mysql_query('select * from user where id = '.$_GET['id'].'')
,结果为:
成功匹配到了,把这个规则添加进去就行了
目前还没有碰到
mysql_query("select * from uesr where id =".$_GET['id']."");
如果出现的话把上面的正则表达式修改一下,在=后面的\' 改为 \"即可
如下:
select\s{1,4}.{1,60}from.{1,50}\bwhere\s{1,3}.{1,50}=( *\"\.){0,10}\$\w{1,20}((\[["']|\[)\${0,1}[\w\[\]"']{0,30}){0,1}(\.\"){0,10}