【从退坑到回坑系列】——Bugku刷题记录2

admin 2026-01-30 18:37:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录BugkuCTF题解,涵盖Git泄露、PHP弱类型、MD5碰撞、Burp爆破及代码执行等技术。重点讲解了.git目录恢复、PHP的==与strcmp漏洞、WAF参数绕过技巧,为CTF选手提供了实用的Web安全解题思路与实战参考。 综合评分: 85 文章分类: CTF,WEB安全,渗透测试,代码审计


cover_image

【从退坑到回坑系列】——Bugku刷题记录2

原创

SkyAsh SkyAsh

云淡纤尘

2026年1月29日 09:17 山东

Bugku-CTF-source(目录扫描,git操作)

为什么需要先用 wget -r 递归下载 .git 目录?
1. **`.git`** **目录是Git的仓库核心**:

   - `.git` 目录存储了整个项目的版本历史(包括所有提交、分支、文件快照等),但它是**隐藏的、非Web可访问的**(正常情况下不会被直接暴露)。
   - 如果题目中存在 `.git` 目录(通过目录扫描如 `dirb` 发现),说明服务器未正确配置,**将Git仓库的元数据暴露在公网**。
2. **直接访问**  **`.git`** **无法获取内容**:

   - 服务器上的 `.git` 目录是Git的内部存储格式(如 `objects/`、`refs/` 等),**不是可读的源代码**。直接通过浏览器访问会返回403或404,无法直接查看内容。
   - 例如:访问 `http://example.com/.git/` 会返回错误,但下载整个目录后,本地才能解析。
3. **`wget -r`** **的作用**:

   - `wget -r`(递归下载)会将 `.git` 目录下的**所有文件和子目录**完整下载到本地(包括 `objects/`、`refs/`、`logs/` 等关键数据)。
   - 这相当于**将服务器的Git仓库完整拷贝到本地**,为后续分析提供基础。

> ✅ **关键点**:必须先下载 `.git` 目录,否则无法在本地使用Git工具分析历史记录。

---

**为什么需要** **`git reflog`** **查看历史操作记录?**

1. **`git reflog`** **的核心功能**:

   - Git的 `reflog` 记录了**所有分支和HEAD的变更历史**(包括被删除的提交、重置操作等)。
   - 即使提交(commit)被删除(如 `git reset` 或 `git commit --amend`),`reflog` 仍会保留其记录(通常保留90天)。
2. **CTF中的典型场景**:

   - 题目可能故意**删除了包含flag的提交**(例如:`git rm flag.txt` 或 `git commit --amend`),但`reflog` 会保留删除前的提交ID(SHA-1哈希)。
   - 通过 `git reflog` 可以找到**被删除的提交**,然后用 `git checkout` 恢复该版本,从而获取flag。

发现git目录泄露

image

wget目录遍历

wget -r http://171.80.2.169:16774/.git

查看git操作历史

git reflog

查看操作的详细信息

git show 40c6d51

image

Bugku-CTF-矛盾(PHP)

在 PHP 中,当你使用 == 进行比较时,如果比较的两个值类型不同,PHP 会尝试将它们转换为相同的类型,然后再进行比较。也就是说1ailx10 == 1 是成立的。

当 PHP 尝试将 1ailx10 转换成一个数值时,它会从左到右读取,直到遇到第一个非数字字符。因此,1ailx10 会被当作 1 来处理。

image

Bugku-CTF-备份是个好习惯(目录遍历,MD5)

image

<?php
/**
&nbsp;* Created by PhpStorm.
&nbsp;* User: Norse
&nbsp;* Date: 2017/8/6
&nbsp;* Time: 20:22
*/

include_once&nbsp;"flag.php";
ini_set("display_errors",&nbsp;0);
$str = strstr($_SERVER['REQUEST_URI'],&nbsp;'?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo&nbsp;md5($key1);

echo&nbsp;md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
&nbsp; &nbsp;&nbsp;echo&nbsp;$flag."取得flag";
}
?>

双写绕过+数组绕过或0e绕过

0e绕过:QNKCDZO240610708

image

还有个绕过方式(禁用数组和0e绕过使用)

?kekeyy1=&amp;amp;amp;amp;kekeyy2=2

原始请求: ?kekeyy1=&amp;amp;amp;amp;kekeyy2=2
↓(WAF 层,只解一次)
看到: kekeyy1=&amp;amp;amp;kekeyy2=2&nbsp;→ 不认为有第二个参数,放行
↓(后端,多次解码或 HTML 解码)
实际解析为: kekeyy1= &nbsp;和 &nbsp;kekeyy2=2

Bugku-CTF-game1(Burp,编码混淆)

玩游戏,这个题要全程抓包,最终抓到score.php

image

注意sign值,是zM+score的base64+==,这里是被混淆的

image

Bugku-CTF-网站被黑(目录遍历,Burp暴力破解)

扫描

image

看响应,hack长度

image

image

Bugku-CTF-bp (Burp,I正则)

此时也是BP爆破,但是响应包都一样长,那就找响应包特征**bugku10000**,那就增加检索,没有bugku10000的就是

结果是zxc123

image

Bugku-CTF-好像需要密码(Burp)

开爆

image

image

Bugku-CTF-shell(assert命令执行, Burp)

最后执行的命令是:assert($_GET['s'])

在PHP中,assert 是一个语言结构,而不是一个函数。

它用于编写条件测试,如果条件为假,则会产生一个警告或错误。

此外,assert 可以被用来执行任意代码,比如执行ls -l命令:

assert('system("ls -l")');
提示:送给大家一个过狗一句话
$poc="assert";
$poc_1=explode("",$poc);
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];
$poc_2($_GET['s'])

最后执行的命令是:assert($_GET['s'])

注意传参的时候不知能直接用空格,要URL编码 **%20** ****

image

image

Bugku-CTF-eval(代码执行)

其实源码在根目录,第一行代码纯属误导

image

Bugku-CTF-需要管理员(Burp暴力破解)

dirsearch扫一下发现robots.txt

image

image

又要爆破????

?x=admin

image

Bugku-CTF-前女友(strcmp,MD5)

源代码藏东西code.txt

image

strcmp 函数是 PHP 中用于比较两个字符串的内置函数。其基本用法如下:
功能:比较两个字符串,区分大小写。
返回值:
如果 str1 小于 str2,返回小于&nbsp;0&nbsp;的值;
如果 str1 大于 str2,返回大于&nbsp;0&nbsp;的值;
如果两者相等,返回&nbsp;0。
用法示例:echo&nbsp;strcmp("Hello",&nbsp;"hello"); 将返回一个大于&nbsp;0&nbsp;的值,因为大小写不同。
该函数的比较是基于字符串的 ASCII 值进行的,逐字符比较,直到遇到第一个不同的字符或字符串结束。
<?php
if(isset($_GET['v1']) &&&nbsp;isset($_GET['v2']) &&&nbsp;isset($_GET['v3'])){
&nbsp; &nbsp; $v1 = $_GET['v1'];
&nbsp; &nbsp; $v2 = $_GET['v2'];
&nbsp; &nbsp; $v3 = $_GET['v3'];
&nbsp; &nbsp;&nbsp;if($v1 != $v2 && md5($v1) == md5($v2)){
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if(!strcmp($v3, $flag)){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;echo&nbsp;$flag;
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; }
}
?>
strcmp绕过:
如果传入的 $v3 是一个 数组(比如 ?v3[]=),那么 strcmp($v3, $flag) 会收到一个 非字符串参数。
在 PHP <&nbsp;8.0&nbsp;中,strcmp() 遇到非字符串参数时,不会报错,而是返回&nbsp;NULL。
而 !NULL&nbsp;是&nbsp;true


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:云淡纤尘 SkyAsh SkyAsh《【从退坑到回坑系列】——Bugku刷题记录2》

AI部分提示词 网络安全文章

AI部分提示词

文章总结: 该文档内容极其简略,仅包含AI部分提示词标题、对阿乐的问候、2026年1月29日的时间与上海地点,以及图片占位符。文中未提供具体技术细节、解决方案或
评论:0   参与:  0