suctf 2019的web1
buuoj上的环境:https://buuoj.cn/challenges#[SUCTF%202019]CheckIn

一个文件上传,有几个限制:

  • 文件内容不能出现<?,这个可以用老版本的php写法绕过
    1
    2
    3
    <script language="php">
    phpinfo();
    </script>
  • 使用了exif_imagetype来判断上传的是不是图片,添加文件头GIF89a可以绕过
    1
    2
    3
    4
    GIF89a
    <script language="php">
    phpinfo();
    </script>
  • 对上传的文件后缀名有限制,一开始觉得是一个黑名单,用 https://github.com/c0ny1/upload-fuzz-dic-builder 生成的字典去fuzz,发现限制的很死,各种php的后缀都不行
    .htaccess也传不了,就算传上去了也没用,因为用的是nginx而不是apache

这个时候想了些其他的思路:

  • 上传的目录下除了上传的文件外,有一个什么都没有的index.php,应该要利用到
  • 爆破目录,发现确实没有其他页面,没有办法去配合文件包含
  • 尝试去思考文件上传的代码到底是怎么写的,后缀名的限制究竟是怎么做的,发现后缀名只要有ph就会被过滤
  • 不知道怎么绕过这个限制,没办法只能尝试去搜索更多的姿势,在google上搜索

    过滤ph ctf

找到了MIMIC Defense CTF 2019 final writeup(https://www.anquanke.com/post/id/179598) ,里面也有一个后缀中对ph的过滤,文中提到

按照常规思路来说,我们一般会选择上传.htaccess和.user.ini,但很神奇的是,.htaccess因为 apache 有设置无法访问,不知道是不是写进去了。.user.ini成功写入了。但是两种方式都没生效。

去看了下.user.ini(http://www.vuln.cn/6001?tdsourcetag=s_pctim_aiomsg)
发现正好可以配合那个空的index.php使用

  • 上传一个.user.ini
    1
    2
    GIF89a
    auto_prepend_file=01.gif
    这样在上传目录下访问任何php文件时,都会先加载01.gif中的php代码
  • 然后再上传一个01.gif
    1
    2
    3
    4
    GIF89a
    <script language="php">
    system("cat /flag");
    </script>
  • 最后访问上传目录下的index.php拿到flag