记Bugku CTF平台解题过程
一、WEB
变量1
题目作者: harry
提 示:
描 述:
题目:启动网页如下,又是一段 PHP 代码提示
1.读一遍 PHP 代码的意思
flag In the variable ! <?php
// 这是一个注释或提示,表明flag存储在一个变量中。PHP代码从<?php开始。error_reporting(0);// 关闭所有PHP错误报告,防止错误信息泄露,但可能隐藏运行时问题。
include "flag1.php";
// 包含名为"flag1.php"的文件。该文件很可能定义了包含flag的变量(如$flag),但内容未直接输出。highlight_file(__file__);
// 高亮显示当前文件的源代码(以HTML格式输出),用于展示代码本身,但可能泄露敏感信息。if(isset($_GET['args'])){
// 检查URL中是否存在GET参数'args'。如果存在,则执行if语句块内的代码。$args = $_GET['args'];// 将GET参数'args'的值赋给变量$args。直接使用用户输入,存在安全风险。if(!preg_match("/^\w+$/",$args)){// 使用正则表达式检查$args是否只包含字母、数字或下划线(即匹配\w字符类)。如果不符合,则执行die语句。die("args error!");// 输出"args error!"并终止脚本执行。在您的图片中,由于args=flag1.php包含点号,触发此错误。}eval("var_dump($$args);");// 使用eval函数执行动态代码。$$args是一个可变变量(variable variable),例如如果$args="flag",则$$args等价于$flag。var_dump会输出该变量的内容和类型。
# 这里如果 $args 是 GLOBALS 的话,则 $$args 就是 $GLOBALS 打印全局所有变量的值。这允许用户转储任意全局变量,可能导致flag泄露。
}
?>
// 结束PHP标签。
117.72.52.127:18729/?args=GLOBALS2.读完以后发现,我们需要在 URL 上拼接? 后面的查询参数字符串,参数名用 args,但是值应该会作为 PHP 里的变量名来使用,并在第 9 行代码输出我们要查询的 PHP 变量的值从而拿到 flag 字符串!下面是测试图片。
3.但是这里难点在于代码里也没提示 flag 字符串保存在 PHP 哪个变量里了,但是 $GLOBALS 这个超全局变量可以打印出当前文件范围内所有变量和值,所以尝试传递 GLOBALS 注意大小写(这样 $args = GLOBALS 字符串了)会带到 PHP 代码里执行
3.发现 flag 字符串的值保存在了 $ZFkwe3 这个变量上,这里已经得到 flag 字符串了,不必再把参数名填写上去请求一次了,如果你想验证,也可以这样,间接证明这道题就是传递 PHP 的变量名称去打印变量的值!
本地管理员
题目作者: harry
提 示:
描 述: 本地管理员
启动场景后,发现是一个管理员系统的登录界面
按照做 web 题的思路,源码,检查,抓包,扫描
1.检查源代码,发现有个特殊字符串,看着像Base64编码过后的字符串,使用随波逐流工具得到:test123(开发或者审计渗透时,有些程序员喜欢把密码 base64 / 其他格式的值,保存在代码里方便他们登录测试用)
2.不清楚这个是账号,还是密码,还是都是,去输入框里填写提交尝试,这里我填写的账号密码都是 test123,会发现多了一句服务器返回的提示:IP 停止访问....
3.这里就需要涉及点网络知识了,我们通过 http 请求的时候
- 如果是客户端直接请求后台服务器:需要通过 TCP 连接,在这一层服务器如果获取,可以拿到我们真实发起请求的设备的 IP 地址
- 如果是客户端通过代理服务器来请求后台服务器:代理服务器通常会携带客户端特定的请求头字段,向服务器传递 IP 地址,一般使用的字段是X-Forwarded-For(服务器通常会先检查代理头字段,如果没有则使用 TCP 的地址)
4.所以,我需要进行抓包,然后自己手动添加一个请求头,将提示本地管理员登录的本地IP地址写成127.0.0.1,于是我们在 burp 工具来个 Repeater 尝试下。
5.发现 IP 可以访问,不过后台提示身份验证信息不正确,那跟身份有关系的暂时只有请求体里的 user 的值了,那我们系统登录的用户名,大部分情况是 admin ,而 linux 系统的一般是 root,这里是网页,所以一般是 admin,如果不对的话(可以找一些管理员用户名的字典,挨个尝试爆破用户名,当然前提假设密码是对的,所以现在后台返回登录提示错误信息都是用户名或密码错误,就是防止猜到密码是对的用户名是错的来爆破)
game1
题目作者: Aman
提 示:
描 述: game1
启动环境后,进来发现是一个小游戏的界面。
1.查看下源码,有样式标签和 JS 代码,标签里没什么有价值的线索,重点读一读 JS 代码,基本都是游戏的逻辑。
2.检查网络选项 / 抓包,发现请求地址score.php,携带了个 ip220.200.239.156,响应返回失败了 3 个字,难道是传递的分数足够高会成功吗?(有同学可能会想你为什么能知道分数呢?因为暂时没其他有用的信息了,只能尝试)
可以看到sign后面两个不一样,zMNTc1==和zMMzAw==
4.使用 burpSuite 工具里的 Decoder 功能,把上图刚刚你红线的 base64 编码值解码试试,发现解析不出来
5.通过检查源代码,搜索sign发现里用的是它网页里自己导入的 Base64 对象里的方法,后来发现它引入了一个 base.js 文件,点击跳转过去里面代码大概读了下确实是编码。所以他的编码只编辑了分数。
6.解码后发现和我得到的分数一样。接着便改一下包把分数改成不可能有的。在他网页打开控制台,直接调用当前网页里函数,传入你刚才的分数。比如8888888
score=8888888
sign=ODg4ODg4OA
base64编码一下,重放后成功获取flag
flag{f0f5fa5d3c6e5d3857902445ba74b2df}
提交成功
源代码
还在继续更新中!!!