0x00 前言
CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。
0x01 题目描述
文件包含:
(无)
![](https://i-blog.csdnimg.cn/blog_migrate/75085b6f13719f08bbc988b283734156.png)
0x02 解题过程
Ⅰ简单分析网页显示内容中的源代码,可以发现一处代码 include $_GET["file"] ,其中 include 语句可以动态地包含用户发送的 GET 请求。详细的方法将在后续的内容中进行逐步解释。
Ⅱ网页显示内容页面下方有一处英文提示:" i have a shell, how to use it ? "。大致意思是,我有一个 shell ,应该怎么去使用它。点击 shell 英文的超链接,跳转到一个新页面。新页面显示的内容是一句话木马,连接密码是 ctfhub 。
Ⅲ根据网页内容的代码提示,初步判断这是一个文件包含漏洞。这里使用蚁剑测试连接,向网页发送 GET 请求,设置传递参数 file=shell.txt 。这样做就可以将网页链接中的页面包含到主页面 index.php 中。添加链接页面的一句话木马的密码测试连接发现成功连接。
http://challenge-f46df033d876ecf2.sandbox.ctfhub.com:10800/?file=shell.txt
Ⅳ检查目录列表中的文件,发现此题 flag 。
0x03 代码解析
error_reporting(0); //关闭错误报告
代码解析:在 php 语言中, error_reporting(0); 函数表示为关闭错误报告,error_reporting() 函数可以使用其来报告什么类型的 PHP 错误。
实例:
函数 | 说明 |
error_reporting(0); | 关闭错误报告 |
error_reporting(E_ERROR | E_WARNING | E_PARSE); | 报告 runtime 错误 |
error_reporting(E_ALL); | 报告所有错误 |
ini_set("error_reporting", E_ALL); | 等同 error_reporting(E_ALL); |
error_reporting(E_ALL & ~E_NOTICE); | 报告 E_NOTICE 之外的所有错误 |
表格来源于[w3school/PHP error_reporting() 函数]
if (isset($_GET['file'])) {
...
}
代码解析: isset() 函数用于检测变量是否已设置并且非 NULL 。如果检测到用户通过 GET 请求传递了 file 参数,那么则执行代码块中的代码。
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
代码解析:strpos() 函数查找字符串在另一字符串中第一次出现的位置。如果未检测到 $_GET["file"] 参数中出现 flag 字符串,那么则执行文件包含,将用户通过 GET 请求传递的参数包含到当前页面中。否则输出字符串 "Hacker!!!" 。注意 !strpos 中添加了 ! 表示按位取反的意思。
else {
highlight_file(__FILE__);
}
代码解析:如果未检测到用户通过 GET 请求传递了 file 参数,那么执行 highlight_file 函数,此函数对文件进行 PHP 语法高亮显示。用户可以直接在网页中查看到语法高亮显示后的 PHP 代码。
0x04 参考文献
[1].w3school. PHP error_reporting() 函数[EB/OL]. [2023-05-16]. https://www.w3school.com.cn/php/func_error_reporting.asp.
[2].runoob. PHP isset() 函数[EB/OL]. [2023-05-16]. https://www.runoob.com/php/php-isset-function.html.
[3].w3school. PHP strpos() 函数[EB/OL]. [2023-05-16]. https://www.w3school.com.cn/php/func_string_strpos.asp.
0x05 总结
文章内容为学习记录的笔记,由于作者水平有限,文中若有错误与不足欢迎留言,便于及时更正。