深究.htaccess的原理,和用户利用其恶意篡改服务器配值导致的深层安全问题
首发合天
前言
搞过ctf的师傅们大多都了解到,文件上传的时候经常使用.htaccess进行攻击;但是只了解那浅层的概念在很多时候是行不通的,比如下面这个题;我先把源码贴出来;(在写之前,首先膜我怀哥一波;.)
先来审计代码,代码逻辑不是很难;但是如果对.htaccess理解不够透彻的话。做出这个题还是有点难度的;这个题是一道好题;服务器首先对目录进行遍历,然后扫描目录下的文件,如果不是index.php的话就删除掉;然后包含了一下fl3g.php;接下来就是我们传入的文件内容和文件的名字了,后面对文件的内容和名字都做了过滤;最后在我们写的文件内容之后换行并且加入了无关的字符;
这里官方给了三个解;一个预期解,另外两个非预期;据官方交代,18个队伍做出了此题;只有一队用的是预期解;
探究
什么是.htaccess
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的''AllowOverride''指令来设置。 这里简明扼要的说一下,.htaccess说白了就是apache服务器中的一个配置文件;只不过它负责的是相关目录之下的网页配置;
.htaccess可以做什么
我们通过.htaccess文件可以做到的有:网页301重定向,自定义404错误页面,改变文件拓展名,禁止目录列表等等;;这里来拿改变文件拓展名来说一下;一般的新手文件上传问题;可以上传.htaccess的;我们可以在.htaccess中写入如下的内容;
如此我们上传一个名为s1mple的文件;里面写入然后上传,服务器就会将s1mple文件当作php来解析,因为我们上传的s1mple文件和.htaccess文件在同一个目录之下,然而.htaccess文件已经改变了我们这个目录和子目录的配置;所以我们的s1mple文件可以成功被解析利用;或者写入
AddType application/x-httpd-php .jpg
;将jpg文件当作php来解析;这很简单;不在过多的赘述;
.htaccess进阶研究
利用.htaccess构成后门;
1.文件包含;php_value auto_prepend_file +文件绝对路径(默认是当前上传的目录);看代码故名思意是预先包含我们的那个指定的文件;进阶一下::如果我们预先包含了.htaccess文件;那么造成的效果就是我们插入的恶意代码就会被任意包含;那么会有怎样的效果?我们可以构造如下的代码php_value auto_prepend_file ".htaccess"%0a#
直接在我们的.htaccess中写入恶意代码,直接包含;我们本地测试一下;拿着上面的那道题来测试一下;传入;?filename=.htaccess&content=php_value%20auto_prepend_fi\%0ale%20".htaccess"%0a%23 \
我们看看回显;当我们第一次传入的时候,发现没有触发phpinfo。那么服务器做了什么?我们本地打开相应的文件夹看看;
原来是第一步生成了.htaccess;还没有预加载,这里我们刷新一下页面,成功利用;我们反观一下.htaccess看看里面生成了什么;
这里我们可以清晰的看到里面的内容;试想,我们如果面对的是上传的问题。并且上传了这样的内容,那么也就可以不用传入其他的文件,就可以直接生成后门(本地测试过,成功);我们利用这个直接写入一句话木马,那么可以直接利用;这里直接包含了.htaccess导致了所有文件都包含了木马;
两张图片证明利用成功;dir可以列出很多敏感信息;打码打码~~~~;buu的题,用这种方法直接日穿;;附图如下:
这就是解决这个问题的方法一;;;;;;
2..htaccess造成的xss;
这种情况就比较有意思;我们在我们的.htaccess中加入这样的代码;php_value highlight.html '">'
然后访问index.php.这里发现成功弹窗;
这里只能弹一次,因为我们的index.php中有一个unlink函数,这个函数可以删除我们该目录之下的非index.php文件,所以我们的.htaccess也就被删除了;
下面检测很多都可以进行xss;
(还有一个highlight.string 也可以进行弹窗,这里随后才加的,就没有复现;师傅们可以复现试试;)
经过测试,如上的都可以进行弹窗进行xss;(这里highlight.comment这个方法,在我的环境中无法弹窗,猜测可能是php版本的问题;)
3.htaccess篡改引擎导致源码泄露;
实验一下,比如我删除这个题中的高亮显示的代码;这样就不会显示源码,这里我们通过篡改服务器解析引擎,来进行显示源码,这里其实我们只需要将解析引擎关掉就可;在.htaccess中键入如下的代码;
实验看到这里代码已经显示出来了;我们删除了箭头指向的地方;那里原本是highlight_file(__FILE__)
现在删除了之后还可以显示代码,是因为我们关闭了php的处理引擎,使其不能工作,所以这里就显示了源码;这里代码里还有个unlink函数,但是刷新多遍代码依然没有执行,是因为.htaccess依然存在,存在的原因就是我们代码失去了工作引擎,导致不会被解析;也就不会删除我们的.htaccess代码;可见.htaccess是神兵利器;!!!
4.htaccess重定义报错文件和自定义包含路径;
这种方法也是这道题的另外一种解法,是标准的解法;
先来探究一下自定义报错文件的情况,看代码里面是一定会有报错出现的,因为没有fl3g.php的存在;所以我们这里修改.htaccess为php_value error_log G:\phpstudy\tmp\fl3g.php这里刷新页面,然后发现报错;
我们看看效果;进到相关目录之下,发现fl3g.php,打开发现确实是报错的内容;
我们现在思路基本有了,利用error_log自定义报错记录文件,写入shell;那么怎么写入呢?这里我们想到;因为没有fl3g.php文件他会报错,这里我们自定义一个包含的路径,如果没有的话,那么也会进行报错,那么服务器也就会将两个信息同时写入到我们的报错文件之中;我们实验一下,发现确实是的;这里使用utf7进行编码的原因是我们写入报错文件的内容会经过html编码,所以这里用utf7进行编码绕过去;避免其被编码;设置报告级别为32767的原因是报告所有可能出现的错误,确保我们可以写入木马;;
现在我们已经在服务器里留下了一句话木马(如上图),现在就是要触发这个木马了。那就开始我们的第二步;因为我们这里已经有了fl3g.php而且不会被删除,所以这里我们可以自定义包含路径为我们fl3g.php的路径,这里还有个问题,我们的木马怎么被解析,所以这里我们就要首先检验文件是否具有unicode的内容,然后就是自定义编码方式了 php_value zend.script_encoding
配置服务器的相关目录文件内容为utf7编码,然后包含就会进行相应的识别解码;最后就执行了木马;
所以整体的流程就是;首先自定义错误日志进行写马,这里为了全面的写入,采用32767级别的报错;然后绕过<过滤用utf7进行编码绕过;避免被html加密; 接着就是包含木马了,我们自定义包含路径为相关的路径,然后自定义编码方式为utf7;检查是否有unicode;这样就完全的包含了木马;测试一下;
成功利用;
第三种解题方法:
php_value pcre.backtrack_limit 0
php_value pcre.jit 0
上传.htaccess写入如上的内容,解释一下, 设置正则回朔次数来使正则匹配的结果返回为false而不是0 ;从而可以绕过正则;网上有具体的方法,这里不写了 ;;要去复习了,不然挂科了;~~~~