一.知识点
-
.git文件 Git与Git文件导致源码泄露
简述.git文件导致的源码泄露
.git文件是开发人员在开发过程中使用 Git(分布式版本控制系统)做开发时产生的隐藏目录,该文件包含一些版本信息和网站源码,数据库信息等敏感信息。
原理利用
*通常开发人员在开发时,通常将源码提交到远程的托管网站(如Github)方便管理与交互,等到开发最后阶段,再将源码从远程服务器上下载到 web 目录下, 如果开发人员忘记将其中的 .git文件删除,则可以通过 .git文件恢复网站源码,来获取一些敏感信息;
*开发人员对站点使用 Git 对版本进行控制,实现自动部署,如果配置不当,直接将 .git文件加载到线上环境,这样便引起了.git文件泄露。 -
dirsearch的使用:
-u 指定网址
-e 指定网站语言
-w 指定字典
-r 递归目录(跑出目录后,继续跑目录下面的目录)
-random-agents 使用随机UA
python dirsearch.py -u 网址 -e php 或 python .\dirsearch.py -u 网址 -e php
查看响应码为200的目录即可
(一般情况下.zip .7z等压缩文件就是网站源码)
3.linux系统基本操作
4.PHP弱类型:
首先PHP语言中有一些相等的值,如:
’ '0false;
'123'==123;
'abc'==0;
'123a'==123;
'0x01'==1;
[false]==[0]==[NULL]==[' ']
NULL==false==0
'0e1234567890'=='0e987654321';
在PHP语言中比较两个值相等可以用“”或“=”,前者会在比较时自动进行类型转换而不改变原值,遇到这种类型的题目往往还会有MD5碰撞等知识。
二.例题
1.攻防世界-lottery
打开题目发现要猜数字赚钱买flag,先用dirsearch扫描一下
根据扫描的结果:
可以发现有个/robots.txt,打开后看到提示/.git/
推测存在git泄露
接下来使用scrabble扫描URL,把泄露的文件下载下来
打开其中的 “api.php” 文件审计代码,注意到这里有个 buy() 函数,发现numbers这个变量可以操控,函数会以数组的形式提取每位数字,变量在和随机生成的 win_numbers 变量比较时使用的是 “==”,也就是说可以用弱类型来绕过。
由于随机变量是数字,因此我们可以使用 true 来满足比较,但是我们显然不能在输入框输入 7 个 “true”。因此我们考虑修改数据包,通过抓包发现数据的传输是通过传一个映射来上传的,因此抓包之后修改 numbers 变量为一个数组,其中的 7 个变量都是 true。重复几次抓包放包放包之后就能够快速赚钱了,赚够钱后购买得到 flag。
{"action":"buy","numbers":[true,true,true,true,true,true,true]}
2.攻防世界-mfw
通过发现git,用scrabble下载源文件得到flag.php,index.php
分析代码:源码会接收一个 page 参数,输出 flag 要满足以下 2 句代码,注意到第二句代码是个 assert() 断言,它可以将参数作为代码来执行。
$file = "templates/" . $page . ".php";
assert("strpos('$file', '..') === false")
因此我们考虑让断言执行 cat 命令,直接回显目录下的 flag.php 文件,这样就能看到其中的内容了。构造出的 payload 如下,上传得到 flag。
?page=abc') or system("cat templates/flag.php");//
这个参数和上述的 file 变量替换,等同于执行了以下代码。首先因为网页不存在 abc 页面,所以使用 strpos() 函数会返回 false,因此代码会执行 or 后面的 system() 函数。最后认为添加个注释,让后面的代码不要执行。
assert("strpos('templates/?page=abc') or system("cat templates/flag.php");//.php', '..') === false")