文章总结: 本文记录BugkuCTF题解,涵盖Git泄露、PHP弱类型、MD5碰撞、Burp爆破及代码执行等技术。重点讲解了.git目录恢复、PHP的==与strcmp漏洞、WAF参数绕过技巧,为CTF选手提供了实用的Web安全解题思路与实战参考。 综合评分: 85 文章分类: CTF,WEB安全,渗透测试,代码审计
【从退坑到回坑系列】——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
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
双写绕过+数组绕过或0e绕过
0e绕过:QNKCDZO和240610708
image
还有个绕过方式(禁用数组和0e绕过使用)
?kekeyy1=&amp;amp;amp;kekeyy2=2
原始请求: ?kekeyy1=&amp;amp;amp;kekeyy2=2
↓(WAF 层,只解一次)
看到: kekeyy1=&amp;amp;kekeyy2=2 → 不认为有第二个参数,放行
↓(后端,多次解码或 HTML 解码)
实际解析为: kekeyy1= 和 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,返回小于 0 的值;
如果 str1 大于 str2,返回大于 0 的值;
如果两者相等,返回 0。
用法示例:echo strcmp("Hello", "hello"); 将返回一个大于 0 的值,因为大小写不同。
该函数的比较是基于字符串的 ASCII 值进行的,逐字符比较,直到遇到第一个不同的字符或字符串结束。
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
strcmp绕过:
如果传入的 $v3 是一个 数组(比如 ?v3[]=),那么 strcmp($v3, $flag) 会收到一个 非字符串参数。
在 PHP < 8.0 中,strcmp() 遇到非字符串参数时,不会报错,而是返回 NULL。
而 !NULL 是 true
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:云淡纤尘 SkyAsh SkyAsh《【从退坑到回坑系列】——Bugku刷题记录2》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论