writeup PwnTheBox php是世界上最好的语言

110 阅读1分钟

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

题目链接: ce.pwnthebox.com/challenges?…

得到题目源码如下

<?php 
show_source(__FILE__);
@include_once 'flag.php';
//前端攻城狮跑路了,不过PHP是最好的语言
    $a = $_GET['a'];
    $b = $_GET['b'];
    $good = false;
    if (sha1($a)===sha1($b)) {
        $good = true;
    }
    else die('bypass');
    if ($good && isset($_GET['key'])){
        $message = json_decode($_GET['key']);
        if ($message->key==$key) {
            echo $flag;
        }    
        else die('还差一点就拿到flag了');
    }

?>

简单分析得到ab赋值相同就可以bypass key这里需要传入json格式的值,我想了好久。 后来,大佬点播之后,遂使用key={"key": 0}刚开始给0加了引号,发现过不了。去掉引号就行了。这里使用的是json_decode绕过

define('key', 'flag{4}');
if (isset($_POST['a'])) {
    $a = json_decode($_POST['a']);
    if ($a->key == $key) {
        echo "flag" . key;
    } else {
        echo "不相等";
    }
 } else{
     echo "a不存在";
 }

输入一个json类型的字符串,json_decode函数解密成一个数组,判断数组中key的值是否等于$key的 值 。 虽 然 $key的值我们不知道,但是可以利用0=="string"这种形式绕过。

payload如下:

https://xxxxxxxxxxx.run/?a=1&b=1&key={"key":0}

在这里插入图片描述

总结: 分析源码发现存在三个判断,

第一个:判断sha1加密后两个变量的值和类型是否相同,相同将good变量值设为true (可以使用数组绕过sha1检测)

第二个:判断good变量的值和key的值是否存在

第三个: 通过对传入的key值进行json 解码,判断key变量中key键的值是否和key变量的值一样 (因为php是弱类型语言,所以数字和字符串进行比较时,字符串会转成数字,如果字符串的第一位不是数字,则字符串被转成0)

payload: ?a[]=1&b[]=1&key={"key":0}