当前位置: 首页 > news >正文

记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 请求的时候

  1. 如果是客户端直接请求后台服务器:需要通过 TCP 连接,在这一层服务器如果获取,可以拿到我们真实发起请求的设备的 IP 地址
  2. 如果是客户端通过代理服务器来请求后台服务器:代理服务器通常会携带客户端特定的请求头字段,向服务器传递 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}

提交成功

源代码

还在继续更新中!!!

http://www.dtcms.com/a/418826.html

相关文章:

  • OceanBase主备库日志传输服务
  • React-props的children属性
  • 济宁做网站的公司邯郸公司网站建设
  • 特别分享:关于Pipeline
  • 速通ACM省铜第十七天 赋源码(Racing)
  • ARM(IMX6ULL)——通信(IIC/I2C)
  • 零基础学AI大模型之LangChain-PromptTemplate
  • FFT去除规律条纹
  • JAVA中的权限修饰符
  • 前端面试十四之webpack和vite有什么区别
  • 小米路由器 做网站银川森林半岛
  • Kafka04-知识速记
  • 【Linux】高级I/O
  • 开源的容器化平台:Docker高级应用与实战案例
  • 3.7 广域网 (答案见原书 P116)
  • 临淄网站制作首选公司seo排名需要多少钱
  • k8s-部署单master节点
  • Python 2025:量子计算编程的新前沿
  • 二级学院网站建设自评报告互联网营销公司有哪些
  • 做网站滨州现在写博客还是做网站
  • 基于 Service Worker 的图书馆资源缓存技术研究
  • php网站后台验证码不显示哈尔滨教育云平台网站建设
  • 银行门户网站是什么意思网页设计代码中字体的颜色如何改
  • 【代码的暴力美学】-- C语言基础编程题_1
  • Java 架构师系列:JVM 与 AI 负载的优化策略
  • 数据分析-Excel-常用函数
  • Python 文件操作
  • Java 大视界 -- Java 大数据机器学习模型在电商产品销量预测与库存优化管理中的应用
  • 陕西开龄建设网站浙江省建设厅网站如何查安全员
  • 使用 Jenkins 的流水线项目实施 CI/CD