# phtml 解析审计 + 绕过

总结一下对于以下四种文件类型,可能的绕过方式:

  • .asp : .asa / .cer / .cdx
  • .aspx : .ashx / .asmx / .ascx
  • .php : .php4 / .php5 / .pthml
  • .jsp : .jspx / .jspf

# pthml 解析审计

其中,关于 pthml 可以去看一下 C:\phpStudyB\Apache\conf\httpd.conf 文件中对于 php 文件类型的解析

这里 .pthml 后缀的文件可以被后台解析成 .php

image-20221003151119447

我们以 Pass-03 为例:

上传 backdoor.php,点击上传后,显示 “不允许上传.asp, .aspx, .php, .jsp 后缀文件!

image-20221003151302968

OK,我们看一下源码信息:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空

if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}

以上代码核心干了这么几件事:

当文件上传路径存在时

  • 设置黑名单,过滤 .asp , .aspx , .php , .jsp
  • trim() 函数 过滤 上传文件名的 空格
  • deldot() 函数 删除 文件名 最末尾的点 【这是一种绕过方式,后面的博客会介绍到】
  • strrchr() 函数以 .点 为截断符,获取其右边的字符串,即获取 文件后缀名
  • strtolower() 函数将文件后缀名全部转换成 小写
  • str_ireplace() 函数将去除后缀名当中的 ::$DATA ,是一种 Windows 本地文件系统中的文件流,也是一种绕过方式
  • 再次调用 trim() 函数对后缀名进行 去空格

另外, $img_path 这回使用了 date函数及其格式化 ,再使用了 1000-9999的随机数 作为路径名的组成部分。

date () 函数的第一个必需参数 format 规定了如何格式化日期 / 时间。

可以在字母之间插入其他字符,比如 “/”、"." 或者 “-”,这样就可以增加附加格式了

<?php
echo date("Y/m/d") . "<br>";
echo date("Y.m.d") . "<br>";
echo date("Y-m-d");
?>

上面代码的输出如下所示:
2016/10/21
2016.10.21
2016-10-21

这里列出了一些可用的字符:

  • Y - 代表年 (四位,如 2022)

  • m - 代表月 (01 到 12)

  • d - 代表月中的天 (01 到 31)

  • H - 小时,24 小时格式,有前导零 (00 到 23)

  • i - 有前导零的分钟数 (00 到 59)

  • s - 秒数,有前导零 (00 到 59)

# pthml 解析绕过

审计完上述代码,发现对于文件后缀并没有过滤完整,放出了诸如 php4、php5、pthml 的类型

抓包,送入 Repeater

# 尝试一:修改为.php4

修改为

filename="backdoor.php4"

上传成功

image-20221003154317074

打开页面看看,但并没有解析成 php 执行。

image-20221003154519115

# 尝试二:修改为.php5

filename="backdoor.php5"

上传成功

image-20221003154701928

我们打开网页看看,依旧没有解析成功

image-20221003154727447

# 尝试三:修改为.phtml

filename="backdoor.phtml"

上传成功

image-20221003154847390

打开网页看看,没有原样输出,成功解析。

image-20221003154915997

使用菜刀连接:

①清空缓存库

image-20221003155031987

②添加,输入刚刚上传的后门 url,添加参数

image-20221003155130387

双击,成功连接。

image-20221003155153049

另外,由于解析源码中只罗列了 .php , .phtml ,我们可以添加 .txt 或者 .abcd 都可以。

只要写入了支持解析的类型,重启 Apache 服务,黑客就可以上传对应的后门文件,进行菜刀连接。

至此,演示完毕。