2019SUCTF—CheckIn
尝试
文件上传题,随便传个图片发现回显
- 第一个绕过点 <? , 绕过方法 \
上传一个txt,发现另一种回显
- 第二个绕过点exif_imagetype()函数,添加图片文件头即可绕过,如:
GIF89a
直接上传php显然是不行的,回显illegal suffix!,判断是个黑名单过滤,尝试fuzz其他php后缀发现也都被过滤了。
试试改解析,本来想尝试.htaccess
(分布式配置文件),无奈题目环境是Nginx
解题思路
捋一下思路:
- 黑名单,php脚本无法绕过上传
- 存在文件头检查,这个构造图片文件的文件头可绕过
- <?被过滤,用script方式绕过(注意这个在php7不再支持)
- 考虑上传图片马,但是不被解析,这里用到了
.user.ini
.user.ini
只要是CGI/FastCGI 运行的php都可以用这个方法。(Nginx采用FastCGI正好符合)
在 .user.ini
风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
这里就很清楚了,.user.ini
实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)
实际上,除了PHP_INI_SYSTEM
以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。
Php配置项中有两个比较有意思的项:
auto_append_file
、auto_prepend_file
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。类似于在index.php中插入一句:require(./01.gif);
而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:
1 | auto_prepend_file=01.gif |
所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
利用
构造.user.ini
1 | GIF89a |
构造a.jpg
1 | GIF89a |
上传后访问即可执行命令拿到flag
1 | http://539c61e5-e2cf-4aed-bd40-c905213d5fb1.node1.buuoj.cn/uploads/fd40c7f4125a9b9ff1a4e75d293e3080/index.php?c=system(%27cat%20/flag%27); |
参考p神的文章:http://www.vuln.cn/6001