文件上传漏洞全面渗透姿势总结(文件上传漏洞常发生在哪些功能点)
itomcoil 2025-05-05 16:31 9 浏览
文件上传的场景真的随处可见,不加防范小心,容易造成漏洞,造成信息泄露,甚至更为严重的灾难。
比如某博客网站评论编辑模块,右上角就有支持上传图片的功能,提交带有恶意字符串的图片后,就直接可以显示在评论中了,如图:
文件上传漏洞是进行渗透是比较常见好利用的漏洞,利用它能够直接上传webshell,进行连接,是比较常见的攻击方式。针对文件上传场景检测和绕过进行了全面姿势总结。
0x01 渗透姿势全面分析
针对一个文件上传场景,首先判断是客户端JS校验还是服务器校验,判断依据:上传非法文件,返回结果是否很快?
1.客户端JavaScript检测
如果上传非法文件,返回结果很快,或者F12打开开发者模式,上传非法文件,发现没有网络请求,但是被拦截了,很有可能就是客户端进行了JS校验检测。这种前端采用JS限制上传类型和大小的方式:
<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
</script>
很是鸡肋,绕过思路:1.直接本地禁用JS,不让其做检测 2.抓包,修改文件后缀名类型,绕过检测限制
2.服务器后端检测
服务器后端检测有较多方式,普遍分为文件类型检测,文件头类型,文件扩展名名单检测,文件内容检测,接下来进行简要分析。
a.文件类型检测
此类检测防护主要是从content-type进行检测,检验请求中content-type是否符合可接受的上传类型(如"image/gif","image/png","image/jpeg")
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
绕过思路:抓包将content-type改为可接受图片形式,即可绕过
b.文件头类型检测
上个文件类型是检测content-type,比较好伪造,这个则是使用getimagesize()函数来获取文件的MIME类型,通过文件头进行判断文件类型
if(file_exists($filename)){
$info = getimagesize($filename);
文件头就是文件特定的标志,如二进制PE文件的4D5A,bmp文件的424D,zip文件的504B0304,各种常见文件的文件头类型大家可以查找了解一下,常见图片文件头如下:
gif: GIF89a
jpg,jpeg: FF D8 FF
png: 89 50 4E 47 0D 0A
绕过思路:针对这种,上传木马恶意文件时,先使用编辑工具在数据最前面添加图片的文件头进行伪造,即可绕过
c.文件扩展名检测
这种类型有基于黑名单检测和白名单检测。通常基于黑名单是很不安全的,黑名单机制:只拦截名单中出现的扩展后缀名,其余默认放行。这就取决于名单中的扩展后缀名覆盖能力范围了,很难把所有的考虑全面,就很容易造成漏洞。
黑名单绕过思路:可以从服务器的解析特性进行分析,如特殊可解析后缀php3,php7,phtml,jspx等 如特殊的解析方式陌生后缀名,带换行后缀名,双后缀名等解析差异造成的漏洞。 还可以从混淆方面出发,后缀名大小写,点绕过,空格绕过,以及上传.htaccess配置控制文件权限和::$DATA数据流的使用
基于白名单相对于黑名单就安全很多了,要求只能是特定扩展名的文件才能够上传。
白名单绕过思路:MIME绕过,修改文件类型为白名单可接受的类型,以及%00,0x00截断绕过,这种场景针对save_path可控。
00截断原理其实很巧妙,利用场景是文件保存路径可控,这样一来我们上传的文件符合白名单就行,真正动手的地方在文件保存路径出,可以放上自己的webshell文件,然后在webshell文件后面添加%00,或0x00,再加一些字符,这样一来,系统在解析碰到00就会截断,后面字符就不起作用,只剩下前面的webshell文件名,就可以在url中进行访问了。%00和0x00的使用区别在于提交get请求时,是%00,会进行url自动解码动作,然后进入验证函数。0x00则是post请求直接进入验证函数。
d.文件内容检测
比较厉害的防护检测,就是针对内容做检测,这种防护能力比较强,但也不是不能绕过。自始至终,攻防都是在对抗中螺旋演进的。
这种检测防护基本都是从webshell具有的代表性敏感字符?或者危险敏感函数。
绕过思路:从特殊敏感字符开始进行Fuzz测试,探测webshell中有多少必要的字符存在被替换,如果构成webshell执行的字符
被替换得较多,剩下未过滤的字符的难以支撑webshell执行,可以换个角度利用系统,调用脚本语言,如<script language='php'>system('ls');<script>。
还有一种更强的基于内容检测机制,对上传的图片进行二次渲染,参考代码如下
//判断文件后缀与类型,合法才进行上传操作
if(($fileext == "jpg") && ($filetype=="image/jpeg")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefromjpeg($target_path);
if($im == false){
$msg = "该文件不是jpg格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".jpg";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagejpeg($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
主要就是后端调用了php的GD库,利用imagecreatefromjpeg()函数提取了文件中的图片数据,然后再重新渲染,这样图片中插入的恶意代码就会被过滤掉了,经过测试发现,不管是直接修改文件头制作图片马,还是利用copy命令制作的图片马,都无法避免其中的一句话被过滤掉。
绕过思路:借鉴二进制中钩子的思想,其实就是想在上传图片中找一块"地方",存储webshell,这块"地方"要求在后端处理后没有被过滤掉。那就上传一个正常的文件,然后下载下来,diff一下,查看哪些位置没有被改动过,然后添加webshell进行尝试。
相关推荐
- PS小技巧 调整命令,让人物肤色变得更加白皙 #后期修图
-
我们来看一下如何去将人物的皮肤变得更加的白皙。·首先选中图层,Ctrl键加J键复制一层。·打开这里的属性面板,选择快速操作删除背景,这样就会将人物进行单独的抠取。·接下来在上方去添加一个黑白调整图层,...
- 把人物肤色提亮的方法和技巧
-
PS后期调白肤色提亮照片的方法。一白遮百丑,所以对于Photoshop后期来说把人物肤色调白是一项非常重要的任务。就拿这张素材图片来说,这张素材图片人脸的肤色主要偏红、偏黄,也不够白皙,该怎样对它进行...
- 《Photoshop教程》把美女图片调成清爽色彩及润肤技巧
-
关注PS精品教程,每天不断更新~~室内人物图片一般会偏暗,人物脸部、肤色及背景会出现一些杂点。处理之前需要认真的给人物磨皮及美白,然后再整体润色。最终效果原图一、用修补工具及图章工具简单去除大一点的黑...
- PS后期对皮肤进行美白的技巧
-
PS后期进行皮肤美白的技巧。PS后期对皮肤进行美白的技巧:·打开素材图片之后直接复制原图。·接下来直接点击上方的图像,选择应用图像命令。·在通道这里直接选择红通道,混合这里直接选择柔光,然后点击确定。...
- 493 [PS调色]调模特通透肤色
-
效果对比:效果图吧:1、光位图:2、拍摄参数:·快门:160;光圈:8;ISO:1003、步骤分解图:用曲线调整图层调出基本色调。用可选颜色调整图层调整红色、黄色、白色和灰色4种颜色的混合比例。用色彩...
- 先选肤色再涂面部,卡戴珊的摄影师透露:为明星拍完照后怎么修图
-
据英国媒体12月17日报道,真人秀明星金·卡戴珊终于承认,她把女儿小北P进了家族的圣诞贺卡,怪不得粉丝们都表示这张贺卡照得非常失败。上周,这位39岁的女星遭到了一些粉丝针对这张照片的批评,她于当地时间...
- 如何在PS中运用曲线复制另一张照片的色调
-
怎样把另一张作品的外观感觉,套用到自己的照片上?单靠肉眼来猜,可能很不容易,而来自BenSecret的教学,关键是在PS使用了两个工具,让你可以准确比较两张照片的曝光、色调与饱和度,方便你调整及复制...
- PS在LAB模式下调出水嫩肤色的美女
-
本PS教程主要使用Photoshop使用LAB模式调出水嫩肤色的美女,教程调色比较独特。作者比较注重图片高光部分的颜色,增加质感及肤色调红润等都是在高光区域完成。尤其在Lab模式下,用高光选区调色后图...
- 在Photoshop图像后期处理中如何将人物皮肤处理得白皙通透
-
我们在人像后期处理中,需要将人物皮肤处理的白皙通透,处理方法很多,大多数都喜欢使用曲线、磨皮等进行调整,可以达到亮但是不透,最终效果往往不是很好,今天就教大家一种如何将任务皮肤处理得白皙通透,希望能帮...
- PS调色自学教程:宝宝照片快速调通透,简单实用!
-
PS调色自学教程:宝宝照片快速调通透。·首先复制图层,然后选择进入ACR滤镜,选择曲线锁定照片的亮部,也就高光位置,其他部位补亮一点,尤其是阴影的部位补亮多一些,让画面的层次均匀一点。·然后回到基本项...
- 【干货】如何利用PS进行人物美化
-
人物图像美化在Photoshop中非常常用,Photoshop作为一款功能强大的图像处理软件,不仅可以对人像进行基本的调色、美化和修复等处理,还可以改变人物的线条和幅度,如调整脸部器官和脸型的大小、调...
- 教大家一种可以快速把肤色处理均匀的方法@抖音短视频
-
快速把肤色处理均匀的方法。今天教大家一种可以快速把肤色处理均匀的方法。像这张照片整体肤色走紫红色,但是局部偏黄缘处理起来非常的麻烦。其实我们只需要新建空白图层,图层混合模式更改为颜色,再选择画笔工具把...
- PS调色教程 利用RAW调出干净通透的肤色
-
要么不发,要么干货。后期教程来噜~用RAW调出干净通透的肤色。这次终于不会原片比PS后好看了吧。如果你依然这么觉得,请不要残忍的告诉我这个事实,泪谢TAT)附送拍摄花絮,感谢各位的支持更多风格请关注m...
- photoshop后期皮肤变白的技巧
-
PS后期皮肤变白的技巧。1.PS后期让皮肤变白的方法有很多种,接下来教你一种非常简单容易上手的方法。2.打开素材图片之后,直接在小太极下拉框的位置添加一个纯色调整图层,颜色设置一个纯白色,点击...
- Photoshop调出人物的淡雅粉嫩肤色教程
-
本教程主要使用Photoshop调出人物的淡雅粉嫩肤色教程,最终的效果非常的通透迷人,下面让我们一起来学习.出自:86ps效果图:原图:1、打开原图复制一层。2、用Topaz滤镜磨皮(点此下载)。3、...
- 一周热门
- 最近发表
- 标签列表
-
- ps像素和厘米换算 (32)
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)