CTF文件上传 upload-labs pass11-20
# uploadlabs11-20
pass11-pass12补充:
- GET路径会自动解析
- POST路径不会自动解析
# pass-11 白名单绕过
查看源码,保存路径是由GET[save_path]定义,可控
上传白名单png/gif/jpg类型文件,打开bp抓包,修改get的保存路径,使用 %00 截断,在路径中,出现%00会舍弃后面内容,例如在此题上传文件时,最终保存结果应该为/upload/1.png,但是通过修改路径,使他保存在/upload/1.php/路径下,后面没有内容,文件名最终变成1.php,作为php文件解析
访问upload/1.php,解析成功
# pass-12
查看源码,使用post定义保存路径,可控
上传白名单文件,bp抓包,修改post路径,同样使用 %00 截断路径名称,但是此时是post传参,%00不会自动解析,选中%00右键url解析
发包,访问'图片'地址,成功解析
pass13-pass16补充
服务器设置白名单,只允许图片类型文件上传时,如果有include包含漏洞,可以将图片马/其他文件类型作为php文件解析
# pass-13
提示包含漏洞,访问include.php能否访问
看到include.php可以通过get传参利用
查看源码,会读取上传文件前两个字节内容,是否属于白名单里的文件类型,上传图片马,通过http://localhost/include.php?file=你的图片马文件名访问,成功解析
# pass-14
查看源码,**getimagesize($filename)**中getimagesize()函数会读取上传文件的头文件是否是图片类型,仍然使用图片马和include包含漏洞上传文件
# pass-15
查看源码,**exif_imagetype($filename)**中exif_imagetype()函数也是检查上传文件是否符合要求,做法同上
# pass-16
略
# pass-17
学到了两个方法
法1:(不太正经)
查看源码,使用了move_uploaded_file()函数,这个函数遇到文件名为 /. 时,会舍弃**/.及后面内容**
上传php文件,bp抓包修改文件名例如1.php/.png,随后上传成功,复制图片路径,使用文件包含访问
法2:
题目先接收文件,再做检查,再服务器检查之前如果能访问(打开)到这个文件,服务器就删不掉了,从而获取权限
解法,使用bp不断发包,但是我的bp出了问题,只发一次...借鉴大佬python脚本跑,脚本实现发包并访问,
代码如下
# coding:utf-8
import requests
from concurrent.futures import ThreadPoolExecutor
def td(list):
url = 'http://localhost/Pass-17/index.php?action=show_code'
files = {'upload_file': ('szm.png', "<?php fputs(fopen('shell.php','w'),'<?php phpinfo(); ?>' ); ?>")}
data = {'submit': '上传'}
r = requests.post(url=url, data=data, files=files)
re = requests.get('http://localhost/include.php?file=upload/szm.png')
if re.status_code == 200:
print('上传成功')
if __name__ == '__main__':
with ThreadPoolExecutor(20) as p:
p.map(td, range(200))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上传php文件,访问这个php文件,访问成功即可连接
上传图片马,配合include.php时,注意上传路径
# pass-18
使用pass-18图片马解法
# pass-19
两种解法
法1:
查看源码,黑名单验证,先检查扩展名,使用png绕过,使用post接收上传地址,地址可控
bp抓包,修改上传地址
注意post传参的地址不会url编码,%00右键编码,上传,复制图片地址即可访问
# pass-20
查看源码
- 检查文件MIME内容是否属于图片类型
- 检查文件名是否为空
- 文件名是否属于数组
先接着获取最后面的扩展名,此时需要传入两个save_name[0],save_name[2],0存放2.php/.利用move_uploaded_file特性舍弃后面,2存放png
再看源码,取数组名(数组第一个)作为文件名,会将文件名数组最后一个作为扩展名,
bp抓包,将文件MIME改为图片类型,save_name[]改为数组
上传访问