本文已参与「新人创作礼」活动,一起开启掘金创作之路。
[BJDCTF2020]Mark loves cat
开局没发现啥,扫一下目录,发现git源码泄露
直接把源码放下面了
flag.php
<?php
$flag = file_get_contents('/flag');
index.py里的关键代码
<?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;
看着有点眼熟,依稀记得以前做过类似的,是变量赋盖漏洞
为了以后方便学习,贴一个备注版的源码
<?php
include'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_GET as $x => $y){ //get传值
$$x = $$y; //漏洞在这里 比如输入 yds=flag 相当于 $yds=$flag
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //判断get传进来的值等不等于flag 如果等于flag则跳过
exit($handsome);
}
}
//检测get是否为flag 或者post是否为flag 必须两方都为假 否则输出$yds
//通过这里我们就可以结合前面的来构造 既然要输出$yds所以我们想办法让$flag的值赋值给$yds
//构造yds=flag GET传输 在经过第一个foreach的时候进行了赋值 等于进行了这样的一个操作$yds=$flag
//所以这个条件为真就可以输出flag了。
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
//
//检测POST flag是否为flag 或者get 是否为flag //至少有一个为真则为真
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
?>
第二个条件最简单,只要保证post的flag和get的flag变量没被用过就行。输出的yds,所以我们只要get请求‘yds=flag‘就行了,就会把yds,所以我们只要get请求yds=flag就行了,所以我们只要get请求‘yds=flag‘就行了
[ASIS 2019]Unicorn shop
网页是一个购买网站,我们出价要大于用户四的1337,我传入个比较大的数字显示只能输入一个数字,
考点unicode编码安全问题
我们可以用别的语言来表示数字
可以在其他网站搜一下
payload
id=4&price=%E2%86%82 //ↂ
[BSidesCF 2019]Futurella
神魔鬼,F12直接flag
?????