[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook

[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cookbook

  • [网鼎杯 2020 朱雀组]phpweb
  • [BJDCTF2020]Mark loves cat
  • [BSidesCF 2020]Had a bad day
  • [NCTF2019]Fake XML cookbook

[网鼎杯 2020 朱雀组]phpweb

这里是使用date函数获取时间

[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第1张图片那么我们可以尝试换成其他函数,如readfile()函数读取源码
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第2张图片[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第3张图片这里的call_user_func会将传入的函数和参数带入执行,但是过滤了很多的函数

因为这里有个function __destruct()(当创建一个对象时,此函数被触发),我们可以利用反序列化来执行到此函数,之后通过此函数执行到call_user_func
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第4张图片

扫目录
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第5张图片在这里插入图片描述

得到flag(这里打印两次,因为创建对象时执行了function __destruct()一次,反序列话后call_user_func执行了一次)
在这里插入图片描述

[BJDCTF2020]Mark loves cat

这里的链接全都指向的首页,看到有抓包后也没发现什么,之后再扫描目录,发现了git泄露(这里buuctf网站会限速,所以要控制扫描速度,如-t 5 -s 0.5
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第6张图片但是禁止访问
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第7张图片无奈只有从wp里找源码了

flag.php

<?php
$flag = file_get_contents('/flag');

分析index.php代码

这里有foreach,并且有参数,我们就能联想到变量覆盖这种情况
<?php
include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){//这里是将post传入的键值赋值给上面两个变量
    $$x = $y;
}

foreach($_GET as $x => $y){
    $$x = $$y;
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}//get传入的flag键要等于$x,并且$x值又不能等于flag,这里本身就是一个矛盾的条件,无法利用

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}//若不存在get的flag参数并且post的flag参数,就退出程序并且输出$yds,那么就可以构造传入的数据,造成变量覆盖。
思路就是post和get都不能存在flag参数这,就可以进行exit,并且需要将$yds变成$flag,
payloay:get:?yds=flag   
经过第二个foreach就变成$yds=$flag,实现变量覆盖

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}//post的flag参数要等于flag或者get的flag参数要等于flag,就退出并输出$is,现在要将$is覆盖成$flag
payload: is=flag&flag=flag
echo "the flag is: ".$flag;

[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第8张图片

[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第9张图片

[BSidesCF 2020]Had a bad day

这里尝试sql注入的时候发现有include函数,再看看能不能读取源码
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第10张图片
读取到源码
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第11张图片解码得到(这里拼接了.php,所以上面读取的时候为index)
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第12张图片因为有文件包含,看看有没有flag之内的
发现包含了flag.php
在这里插入图片描述这是就可以尝试读取文件源码了,但是传入的参数需存在meowers,woofers,index,再进行include
所以可以将伪协议再套一层(上面三个随意选一个)
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第13张图片

[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第14张图片

[NCTF2019]Fake XML cookbook

直接尝试xml实体注入
[网鼎杯 2020 朱雀组]phpweb;[BJDCTF2020]Mark loves cat;[BSidesCF 2020]Had a bad day;[NCTF2019]Fake XML cook_第15张图片

你可能感兴趣的:(xml)