文件上传漏洞全面渗透姿势总结

东方健康网 https://www.9559.org/cn/

0x00 文件上传场景

(本文档只做技术交流,切勿进行违法犯罪操作,请做一个好人,不给别人添麻烦)

文件上传的场景真的随处可见,不加防范小心,容易造成漏洞,造成信息泄露,甚至更为严重的灾难。

比如某博客网站评论编辑模块,右上角就有支持上传图片的功能,提交带有恶意字符串的图片后,就直接可以显示在评论中了,如图:

再次声明:大家在自己的搭建的环境里面测试,不要给别人造成麻烦哈。

文件上传漏洞是进行渗透是比较常见好利用的漏洞,利用它能够直接上传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进行尝试。

0x02 安全小思考

以上防护和绕过姿势基本上都是从业务实战和CTF比赛中总结而来的,更多的时候需要各种信息进行综合利用,安全中攻击和防范永远是在对抗中相互成就的。敬畏前辈先验知识,展露后辈探索精神。

文件上传漏洞全面渗透姿势总结相关推荐

  1. java 文件上传漏洞_文件上传漏洞(绕过姿势)

    文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此 ...

  2. html文件上传漏洞,文件上传漏洞(绕过姿势)

    文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此 ...

  3. 文件上传漏洞---Web渗透学习

    文件上传本身是一个系统的正常需求,但是由于开发人员在开发时欠缺相关的安全知识,在对用户文件上传部分的控制不足或者缺陷,而导致用户越过其本身权限向服务器上传可执行的动态脚本文件. 这里上传的文件可以是木 ...

  4. php黑名单绕过,文件上传漏洞之黑名单检测绕过

    0x00 前言 文件上传是一个很常见的功能,文件上传漏洞也比较普遍,原理简单,造成的危害却很大,是一个入门级别的漏洞.这篇文章主要针对文件上传漏洞中的 黑名单检测绕过 这个点,结合upload-lab ...

  5. tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结

    文末下载上传环境源码 客户端 js检查 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 查看源代码可以看到有如下代码对上传文件类型进行了限制: 我们 ...

  6. [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  7. 网络安全与渗透:文件上传漏洞,一文详解(十)此生无悔入华夏,男儿何不带吴钩

    中华人民共和国网络安全法 阅读本文前,请熟读并遵守中华人民共和国网络安全法: http://gkhy.jiujiang.gov.cn/zwgk_228/jc/zcwj/202006/P02020061 ...

  8. web渗透之文件上传漏洞

    目录 一.原理 二.利用方式 三.文件上传的风险处 四.文件上传漏洞的危害 五.文件上传漏洞常见的绕过方式 1.前端绕过检测 2.mime类型检测绕过 3.黑名单绕过 (1).相似扩展名 (2).ap ...

  9. 渗透测试公司 对网站文件上传漏洞的安全扫描与检测

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 很多客户网站以及APP在上线运营之前都会对网站进行渗透测试,提前检测网站是否存在漏洞,以及安全隐患,避免因为网站 ...

最新文章

  1. 使用 Telnet 仿冒任意邮件
  2. 计算机jsp外文文献,计算机 JSP web 外文翻译 外文文献 英文文献
  3. Swoole学习手记(一)初识Swoole
  4. mysql 存储 事务_MYSQL 可以在存储过程里实现事务控制吗
  5. python 列表与元组的操作简介
  6. sql server存阿拉伯语变成问号_【server@geoserver】WFS只读(readonly)解决办法
  7. mysql运行一下自己就停_MySQL运行一段时间后自动停止问题的排查
  8. 两款工控控件对比评测:Iocomp和ProEssentials
  9. Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(2)
  10. centos,apache运维经验
  11. 【正点原子MP157连载】第二章 STM32MP1简介-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  12. 辽宁省计算机考研排名,2014辽宁省大学研究生教育排行榜
  13. android通过代码设置铃声_iOS、Android数据传输管理工具
  14. Php生成图片的大小单位是cm,php生成图片缩略图代码类
  15. 目录服务器的互联网标准协议,2014年4月自学考试《互联网及其应用》试题
  16. 什么是https证书?
  17. win10 輸入法怎麽切換繁體
  18. HashMap源码阅读启读
  19. Swift 替换字符串
  20. python数值类型教程_Python 基础数据类型-数值类型

热门文章

  1. BugkuCTF 游戏过关
  2. 电商网站怎么挑选高防服务器防御恶意攻击
  3. Tuxera NTFS for Mac2020注册机
  4. 人类数据总量_人类已产生五十亿GB数据 X一代贡献的数据总量最大
  5. 8款令人骄傲的国产软件,让你的电脑好用数倍不止
  6. matlab 复习笔记(基础版)
  7. 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理
  8. CKH IOD选择通过CSG增强其数字批发和物联网客户体验
  9. 赵小楼《天道》《遥远的救世主》深度解析(8)聪明如肖亚文借芮小丹攀缘丁元英到底图的是什么?
  10. android sdl 插件,在Eclipse中配置SDL2.0 for Android