php伪协议

php伪协议利用

一、伪协议利用

1
2
3
4
5
6
7
8
file:// 访问本地文件系统
http:// 访问网址
ftp:// 访问ftp urls
php:// 访问I/O streams 输入/输出流
zlib:// 压缩流
data:// 数据
expect:// 处理交互式的流
phar:// php归档

php:// 文件数据传输的一个通道 php://input php://filter phar://

二、php://filter

这个玩过ctf的时候都知道

如果flag.php文件包含一个1.php

若flag.php代码如下:

1
<?php include($_GET['file']);?>

访问时,假设 http://xxx/flag.php?file=1.php

我们看到的,是1.php的最终内容,无法看到其源代码内容

在ctf里,简单一点的,往往在源代码里有flag或其它线索

一般这是存在 文件包含漏洞

前提

php.ini中,在双off的情况下也可以正常使用

allow_url_fopen : off/on

allow_url_include: off/on

使用1

右键查看源代码

所以使用该伪协议,访问

1
file=php://filter/read/convert.base64-encode/resource=1.php

有一串base64加密的内容,解密即可

使用2

如果是从渗透的角度讲

(这个1.php还是去枚举爆破出来的,作为攻击者是不清楚哪些文件有没有用的,所以一个个尝试,解码后得到想要的信息)

假设这个1.php的内容是一个数据库连接代码,可以知晓其host、user、password

那我们考虑一下进行phpmyadmin的登录,进入后台

没有phpmyadmin也可以打开一下本地mysql,尝试一下远程登录

当然了,如果这里的mysql用户密码仅限本地登录呢

可以考虑,是否有webshell(冰蝎啊,蚁剑啊),工具连接后,切换到终端,再执行mysql的用户密码,也是可以的

三、php://input

可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行

前提

allow_url_fopen : off/on

allow_url_include: on

使用

http://localhost:81/7/flag.php?file=php://input

  • get接收的参数是php://input
  • post接收的参数才是我们传输的值

我的hackbar就触发不了,必须用bp,我笑了

四、phar://

在php中对压缩文件格式的读取

它相对路径,绝对路径都可以用;且支持多级目录

搭配文件上传漏洞,或者进阶的phar反序列化

使用

将一句话木马压缩成zip格式,shell.txt->shell.zip,再上传到服务器,再访问

..?file=phar://temp/shell.zip//shell.txt

主机里直接弄也是可以的,但是配置个虚拟机,这样搞才有渗透的感觉

这里我开了个centos虚拟机,然后假设get.zip上传到该虚拟机了(用xhell工具,直接拖过去,如果权限拒绝,chmmod 777一下),这个zip里面呢,有一个get.txt,就一个phpinfo();代码

当然,实际上给目标服务器写入一个文件

1.想办法上传文件,看浏览器有没有该功能

2.进到目标服务器的命令行去(curl)下载,(要求服务器有访问外网的能力)

在主机去浏览器访问它一下

/opt/lampp/temp/get.zip是绝对路径啊,相对路径貌似

1
http://192.168.1.89/flag.php?file=phar:///opt/lampp/temp/get.zip/get.txt

五、zip://

类似于phar://,只能单级目录,且浏览器访问时,对于目录要用#,且要%23编码

file=zip:///opt/lampp/temp/get.zip%23get.txt

六、data://

数据流封装器,原理与用法类似php://input,发送GET请求参数

前提

allow_url_fopen :on

allow_url_include:on

这里我要设置一下,补充一点,xampp的php.ini在 /opt/lampp/etc/

使用

?file=data://text/plain,一句话木马

?file=data://text/plain,base64,被base64编码后的一句话木马

?file=data://text/plain,<?php%20system("dir");?>

注意哈,<?和php之间不要有空格,不然报错了

syntax error, unexpected ‘system’ (T_STRING) in data://text/plain

然后使用base64编码绕过注意,不要参与 ?>

假如将上面的代码编码。并访问

也就是 ?file=data://text/plain,base64,xxx

这个编译后的 xxx解码过来应该是

<?php%20system("dir"); 没有 ?>,否则报错哈

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信