目录
一、文件上传漏洞概述
文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。如常见的头像上传,图片上传,oa办公文件传,媒体上传,允许用户上传文件,如果过滤不严格,恶意用户利用件上传漏洞,上传有害的可以执行脚本文件到服务器中,可以获取服务器的权限,或进一步危害服务器。
二、文件上传漏洞原因
任意文件上传:没有限制用户上传的文件类型,导致攻击者可以上传恶意脚本。
有条件的上传漏洞:开发者对文件上传做了简单限制,但这些限制容易被绕过。
权限认证问题:没有对文件上传页面进行权限认证,导致未授权访问。
攻击者寻找目标网站的上传点尝试上传.php .aspx等动态脚本语言文件测试其是否可以直接上传,如果不行再尝试对其进行绕过。
三、常见绕过上传技术
前端JS绕过:通过禁用 JS 或修改前端验证逻辑来上传恶意文件。
content-type绕过:修改 HTTP 请求中的 content-type 来欺骗服务器。
黑名单绕过:利用黑名单逻辑漏洞,如大小写不敏感、空格插入等。
四、实战模拟
首先我们应该了解文件上传的过程:客户端选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径。
服务器接收资源代码:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
客户端文件上传的代码:
<html>
<head></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
我们现在使用2018版本的phpstudy与upload-labs文件上传漏洞靶场以及抓包软件BrupSuite实战模拟学习文件上传绕过技术。
子弹:
<?php
phpinfo();
@eval($_POST['pass']);
?>
PASS1(绕过JS)
查看上传代码要求上传的文件类型是.jpg|.png|.gif,把恶意文件改成 js 允许上传的文件后缀,如 jpg、gif、png 等,再通过抓包工具抓取 post 的数据包, 把后缀名改成可执行的脚本后缀如 php 、asp、jsp、net 等,即可绕过上传。
我们上传rsec.jpg,然后Burp抓取数据包,修改其中的后缀为.php
提交即可成功上传
右键新标签页面打开图片即可查看我们的.php文件
PASS2(绕过contnet-type)
有些上传模块,会对http的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过content-type判断类型,content-type在客户端可被修改。则此文件上传也有可能被绕过的风险;首先进行submit提交判断,再检测文件类型如果是image/jpeg或者image/png即允许上传;
首先进行submit提交判断,再检测文件类型如果是image/jpeg或者image/png即允许上传;
上传rsec.jpg文件,抓包把content-type修改成image/jpeg即可绕过上传
检查方式同PASS1
PASS3(绕过黑名单)
上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名 单进行检测, 如果后缀名在黑名单的列表内,文件将禁止文件上传;
首先是检测 submit 是否有值,获取文件的后缀名,进行黑名单对比,后缀名不在黑名单内, 允许上传;
可以在phpstudy的httpd.conf文件中查看AddType的设置情况。
注:新版的phpstudy貌似没有这个了,实验的话只能使用老版的了。
然后找到AddType application/x-httpd-php .php .phtml,去掉前面的注释符号,重启phpstudy并刷新页面,然后上传rsec.jpg,抓包更改后缀,操作同PASS1、2。
PASS4(htaccess重写解析绕过)
上传的文件后缀名在列表内禁止上传。包括了所有的执行脚本。但是没有过滤.htaccess。
.htaccess文件是Apache服务器中的⼀个配置文件,提供了针对目录改变配置的放法.通过 htaccess文件可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
重要功能:可以指定某个文件当作php文件执行(拿php解析器解析)要htaccess的规则生效 则需要在apache开启rewrite重写模块,因为apache是多数都开启这个模块,所以规则⼀般都效。
上传.htaccess到网站里,该.htaccess将所有的jpg文件解析成php文件再上传恶意的jpg 到.htaccess相同目录里,访问图⽚片即可获取执行脚本;
PASS5(黑名单大小写绕过)
有的上传模块,后缀名采用黑名单判断,但是没有对后缀名的大小写进行严格判断,导致可以 更改后缀大小写可以被绕过。如PHP、Php、phP、pHp;
仔细阅读⿊名单,查看是否有被忽略的后缀名,当前可以使用phP 绕过;上传rsec5.jpg抓包后修改文件名为rsec5.PHp
检查方式同上
PASS6(空格绕过)
上传rsec6.jpg,抓包在后缀名后添加空格。
PASS7(windows系统特征绕过)
在windows中文件后缀名. 系统会自动忽略.所以shell.php.像shell.php的效果⼀样。
源码:同样是黑名单,但是没有删除⽂件末尾的点的判断条件;上传rsec7.jpg,抓包后修改在后缀名后加上.即可绕过;
PASS8(NTFS交换数据流::$DATA绕过)
如果后缀名没有对::$DATA进⾏判断,利用windows系统NTFS特征可以绕过上传 ;
上传rsec8.jpg,burpsuite抓包修改后缀名为.php::$DATA ;
PASS9(嵌套绕过.空格.)
上传rsec9.jpg,抓包后后缀改为.php. .
五、实战总结
我总结了漏洞利用实战的步骤:
信息收集:确定目标站点允许的文件类型和上传点。
上传尝试:尝试上传恶意文件,观察服务器响应。
抓包分析:使用代理工具抓取上传请求,分析验证逻辑。
绕过验证:根据分析结果,修改请求以绕过客户端和服务器端验证。
文件上传:成功上传恶意文件后,尝试执行以获取控制。
文件上传漏洞的利用和防御是一个持续的过程,需要不断学习最新的安全技术和攻击手段。通过实战经验的积累和安全意识的提升,可以更有效地保护系统安全。
标签:网络安全,文件,jpg,后缀名,漏洞,绕过,php,上传 From: https://blog.csdn.net/weixin_71208450/article/details/140269520