0x00 前言
点图片时看到url有变动
直觉觉得像文件包含
协议流读一下
册 还真是
贴一下php源码
<?php
$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.";
}
}
?>
试一下flag.php
真有
想方设法包含一下
本来还想通过花里胡哨的操作把马放上去
试了一下data,发现这个wrapper被禁了…谢特
远程文件包含也被禁了
小tips
strpos( $file, "meowers" ) !== false || strpos( $file, "index")
前后两个判断其实还不太一样
看一下strpos函数
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
注释:字符串位置从 0 开始,不是从 1 开始。
所以前面meowers只要求出现就行
而后面的index是要求出现在非首位的位置
否则 strpos($file,“index”)返回int(0) 判断也过不去
0x01 复现
老实看wp
原来php://filter还能自己套协议呢
poc
php://filter/convert.base64-encode/index/resource=flag
/index/是加上去凑条件过判断的
可以发现当php定位不到我们自己加的filter时会报warning
但并没有影响执行,学到了!
还看到有师傅有相对路径做的
好巧妙
相对路径计算时中间目录不存在并不影响
php://filter/read=convert.base64-encode/resource=woofers/../flag
题目就这样done了!
关于00截断的题外话
but 其实我一开始想用00截断做的
属实是学艺不精了…搜了一下才知道他对php版本要求比较低
(PS:网上很多文章都说版本低于5.3.4,我实测5.3.29都不行!踩坑好久!自己试5.2.x才可以,后面看文章推测应该是5.3.24以前)
那句话咋说…实践是检验真理的唯一标准蛤
但是呢我看到它的报错就比较疑惑
明明存在flag.php这个文件
他居然报错fail opening ‘flag.php’
然后找到一篇醍醐灌顶的源码级理解
师傅tql
https://blog.csdn.net/zhangzhuangtongxue/article/details/78198191
以下截取文章
也就是说当比较时发现长度不一样(存在截断字符串)时会直接输出报错信息
也可以推测出5.3.24之前的php版本都适用00截断了嗝~
0x02 Rethink
刷点前面的题找找自信
快被打自闭了