BUUCTF(15)

81 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

[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

?????