dangerous-phpinfo

关于phpinfo()的不适当配置造成的危险漏洞

前言

本文章测试环境基于osx+apache2+php5.6

0x00 session.upload_progress

原理分析

先来看php手册中给的定义 【http://php.net/manual/zh/session.upload-progress.php】

当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。 这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态
当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。 当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据, 索引是 session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。

意味着我们可以通过向服务器POST一个表单,来控制$_session的内容。
构建一个简单的环境来测试。

1
2
3
4
5
<?php
$code=$_GET['code'];
print_r($code);
eval($code);
?>

通过phpinfo获得路径信息,session.upload_progress.name。

然后构造上传文件的表单。直接引用官方的表单

1
2
3
4
5
6
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
<input type="file" name="file1" />
<input type="file" name="file2" />
<input type="submit" />
</form>

稍做修改

1
2
3
4
5
6
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php echo 666;?>" />
<input type="file" name="file1" />
<input type="file" name="file2" />
<input type="submit" />
</form>

抓包后稍作修改,即可把value中的代码写入/tmp/sess_*中,再配合上LFI即可getshell。

CTF实战

http://web.jarvisoj.com:32784/
通过

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

知道使用的序列化处理器为php,通过查看phpinfo可知默认为php_serialize。再看到session.upload_progress.enabled=>on.
很明显我们要通过Session Upload Progress来设置session,触发反序列化。
构造反序列化字符串

1
2
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:38:\"print_r(scandir('/opt/lampp/htdocs'));\";}
//反斜杠防止引号被转义

构造POST文件的数据包成功执行命令

剩下的就是常规操作了

0x01 phpinfo()+LFI

同样是上传文件,POST一个文件上去后可以再phpinfo中看到文件的信息
![]
在tmp目录下生成一个名为phpXXXXXX的文件,内容为POST的文件内容。但是它只会存在一瞬间,所以需要条件竞争来触发它。
我们使用同一个数据包来发送文件并且查看文件。
![]
如果同时存在LFI,我们包含这个这个phpXXXXXXX文件就可以getshell了。

0X02 OPCACHE覆盖

原理

当phpinfo()中opcache.enable => On => On时,
访问网站index.php时,网站会生成index.php.bin。
再次访问时,会加载index.php.bin。而存在上传时,如果可以找到index.php.bin文件所在的目录,我们就可以覆盖index.php.bin,下一次访问index.php时,会加载我们上传的恶意index.php.bin。

CTF实战

见博客https://altmanz.cn/2018/10/10/0ctf-Ezdoor/