压缩流协议打文件包含

发布于 2023-07-21  281 次阅读


  • zip:// ,phar:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要压缩包具有标准的后缀名,即使压缩文件的后缀为jpg,png以及其他的时候,这俩协议仍然可以将压缩包里的文件解压读出来

  • 在某些同时具有文件包含漏洞和文件上传漏洞的题目中,因为文件上传一般不会过滤图片格式,可以将木马压缩到压缩包里面,然后改后缀为图片格式,再进行上传.利用文件包含漏洞结合压缩流协议将压缩包里的木马读出来即可实现攻击

基本语法

  • 相较于phar协议可以处理相对路径,zip等协议只能处理绝对路径,但是zip等协议的使用条件更少,看情况选吧
- zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

- phar://[压缩文件路径]//[压缩文件内的子文件名]

- compress.bzip2://[压缩文件绝对路径]

- compress.zlib://[压缩文件绝对路径]
  • 注意 PHP>=5.3.0之后,本地将木马打成压缩包只能压缩成zip,rar不行.不过将木马文件压缩后,改为其他任意格式的文件都可以正常使用,比如改成rar🤣

  • PHAR的使用需要将php.ini设置phar.readonly设置为Off才能用于PHAR对象

  • zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

本地测试

  • 这里拿phar做测试,zip加了绝对路径还是读不出来文件,应该是版本问题

  • 3.php

<?php include($_GET['a']);?>
  • 2.php
<?php phpinfo();?>
  • 将2.php压缩成压缩包2.zip,在3.php的页面传参
?a=phar://2.zip/2.php

  • 将2.rar的后缀改成2.rar.jpg,其他不变
?a=phar://2.zip/2.php

  • 如果压缩包里面压了多个文件,甚至存在多级文件目录呢?这里将木马文件2.php放到目录2ke里面,再将目录和和无关文件1.php.txt压缩得到2.zip,仍然可以包含成功
?a=phar://2.zip/2ke/2.php

[NISACTF 2022]bingdundun~

  • 来一道例题.页面有一个链接,打开后是文件上传的页面,并且有个bingdundun的传参,可以上传压缩包和图片,有这样的特征就要考虑压缩流协议了,但是使用压缩流需要找到文件包含的地方,那么文件包含大概就是bingdundun这个参数了

  • 页面提示了index.php,这里传一个index.php进去,页面并没有发生变化,改一下传index,发现页面全是index.php.

  • 分析一下原因,页面显示index.php的代码是写在index.php里面的,而打印多个index.php显然是因为index.php被重复执行了很多次,结合这里可能的文件包含的函数,可以推测出bingdundun的传参被交给了文件包含函数,导致index.php自己对自己进行了包含导致了重复执行,并且因为传入index.php没有反应,但是传入index却可以包含,说明后端对传入的字符串后面拼接了.php然后进行包含,前面的upload页面也是因为包含了upload.php

  • 这样我们就可以把马打成压缩包然后用压缩流包含了

  • 同时要注意,后端会对传入的字符串末尾加上.php,所以我们自己就不要加
?bingdundun=phar://858d293249e11ed1dcc03c78e3d5451d.zip//2ke//2

届ける言葉を今は育ててる
最后更新于 2024-02-07