CTF攻防世界小白刷题自学笔记13
1.fileinclude,难度:1,方向:Web
题目来源:宜兴网信办
题目描述:无
给一下题目链接:攻防世界Web方向新手模式第16题。
打开一看给了很多提示,什么language在index.php的第九行,flag在flag.php中,但事情显然不会这么简单,果然无论是输入flag.php还是index.php都是没有用的。
遇事不决,按F12打开开发者工具,果然暗藏了一段PHP语句,
好吧,我又遇到知识盲区了,现在我又打开大佬的writeup来摆烂了,同时借助GPT来分析。
代码分析
-
错误显示设置:
php
if( !ini_get('display_errors') ) { ini_set('display_errors', 'On'); } error_reporting(E_ALL);
- 这部分代码首先检查 PHP 配置中是否打开了错误显示。如果没有,则将其打开。接着设置错误报告级别为
E_ALL
,意味着将报告所有类型的错误。
- 这部分代码首先检查 PHP 配置中是否打开了错误显示。如果没有,则将其打开。接着设置错误报告级别为
-
处理 Cookie:
php
$lan = $_COOKIE['language']; if(!$lan) { @setcookie("language","english"); @include("english.php"); } else { @include($lan.".php"); }
- 该代码获取名为
language
的 Cookie 值。如果该值不存在,则会设置默认语言为english
并包含english.php
文件。 - 如果 Cookie 已存在,则会根据 Cookie 的值包含对应的语言文件(例如
spanish.php
、french.php
等等,具体取决于该 Cookie 的值)。
- 该代码获取名为
-
读取和输出文件内容:
php
$x=file_get_contents('index.php'); echo $x;
- 这部分代码使用
file_get_contents
函数读取当前目录下的index.php
文件的内容,并将其内容输出到页面。
- 这部分代码使用
潜在问题
-
文件包含漏洞:
- 该代码存在潜在的文件包含漏洞,尤其是在
@include($lan.".php");
行。如果$lan
的值不是经过严格验证的,攻击者可能会利用此针对文件包含的漏洞来包含任意文件,甚至可能导致代码执行。 - 例如,如果攻击者能够设置 Cookie 值为
../../../../../etc/passwd
(假设是个类 Unix 系统),就可能导致服务器包含一个敏感文件,进而泄露信息。
- 该代码存在潜在的文件包含漏洞,尤其是在
-
安全性问题:
- 在使用
include
时不应该直接使用来自用户输入的数据,应该对输入进行验证和过滤,防止包含恶意文件。 - 小心使用
@
符号,它会抑制错误信息的输出,可能会掩盖潜在的问题,增加调试难度。
- 在使用
-
不安全的错误显示:
- 虽然在某些情况下显示错误有助于调试,但在生产环境中开启错误显示可能会泄露敏感信息。
说人话就是利用语句中的cookie竟然敢随便接收数据,好好构造一番然后利用下方的包含语句来让flag.php文件内容显示。
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取。
大佬原话:
在这里,read=convert.base64-encode
意味着将文件内容进行 Base64 编码,从而使文件内容变成可读的字符串。而 resource=flag
指定了要读取的文件为名为 flag
的文件(这里假设存在这个文件)。
因此,在这种情况下,如果攻击者能够成功将 cookie 的值设置为 php://filter/read=convert.base64-encode/resource=flag
,那么当代码执行到 $_COOKIE['language']
这行时,将会读取(方式:php://filter
) flag 文件的内容,并对其进行 Base64 编码后输出到页面上。
这种攻击方式称为 “PHP 命令注入”,并且它能够导致严重的安全问题,因此在编写代码时要进行必要的输入校验和过滤,以避免此类攻击。
说人话:构造以下的cookie
cookie:language=php://filter/read=convert.base64-encode/resource=flag
这样php语句
@include($lan.".php");
实际上执行的是:
php
@include("php://filter/read=convert.base64-encode/resource=flag.php");
解决过程
使用软件 Burp 对发出去的数据包进行抓取,burpsuite抓包详细操作在笔记8CTF攻防世界小白刷题自学笔记8-CSDN博客,安装详细操作在笔记5CTF攻防世界小白刷题自学笔记5-CSDN博客
解密得到 flag
利用hackbar的解码功能得到flag。hackbar的安装和使用请参考我的笔记6第二题CTF攻防世界小白刷题自学笔记6-CSDN博客