RCE命令执行漏洞和代码执行漏洞
RCE漏洞
- 直接用的pikachu对RCE的介绍
命令执行漏洞
命令执行
- 命令执行(Remote Command Execution, RCE)
- Web应用的脚本代码在执行命令的时候过滤不严,从而注入一段攻击者能够控制的代码,在服务器上以Web服务的后台权限远程执行恶意指令
成因
- 代码层过滤不严
- 系统的漏洞造成命令注入
- 调用的第三方组件存在代码执行漏洞常见的命令执行函数
- PHP:exec、shell_exec、system、passthru、popen、proc_open等
- ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
- Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
常用命令执行函数
system函数
- 该函数会将执行的结果输出并将输出结果的最后一行作为字符串返回,如果执行失败则返回false
- 是最常使用到的
1
2
3
4
5
highlight_file(__FILE__);
system('pwd');
system('whoami');
exec函数
- 该函数不会输出结果,但是会返回执行结果的最后一行,可以结合output进行结果的输出。
1
2
3
4
5
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
passthru函数
- 该函数只调用命令,并将运行的结果原封不动的输出,没有相应的返回值。
1
2
3
4
highlight_file(__FILE__);
passthru('ls');
shell_exec函数
- 该函数不会输出结果,返回执行结果
- 使用反引号
(``)
时调用的就是此函数。1
2
3
4
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
命令执行基础
Windows基础命令
1 | ping #测试连通性 |
Linux基础命令
1 | cd #切换目录 |
拼接符
1 | | #只执行|后面的语句 |
实例
DVWA靶场
low级别
- 直接输入127.0.0.1可以得到ping的结果
- 如果直接输入dir,是不会有结果的
- 在指令前加
|
,可以只执行后面的指令,这样就可以无视前面的ping了 - 输入
| dir
- 输入127.0.0.1 && dir就可以都执行
Medium级别
- 可以看见
&&
和;
都被过滤了 - 那就换成
|
或者&
High级别
- 这个级别只能用
|
- 但是它过滤了
|
而没有过滤|
代码执行漏洞
代码执行
- 代码执行漏洞是由于服务器对危险函数过滤不严导致用户输入的一些字符串可以被转换成代码来执行,从而造成代码执行漏洞
成因
- 用户能够控制函数输入
- 存在可执行代码的危险函数常见代码执行函数
- PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
- Javascript: eval
- Vbscript:Execute、Eval
- Python: exec
常用代码执行函数
${}执行代码
- 该执行代码会将中间的php代码进行解析
1
2
3
${<!-- -->phpinfo()};
eval函数
- 该函数会将字符串当作函数进行执行,但是需要传入一个完整的语句,同时必须以
;
分号结尾,也是最常见的函数。1
2
3
eval('echo "hello";');
assert函数
- 该函数是判断是否为字符串,如果是则当成代码进行执行,但是在php7.0.29之后的版本不支持动态调用。
1
2
3
4
5
6
7
8
9//低版本
assert($_POST['a']);
//7.0.29之后
$a = 'assert';
$a(phpinfo());
array_map函数
- 该函数是为数组的每个元素应用回调函数。
1
2
3
4
5
6
7
8
9
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);
//构建的payload
?a=assert&b=phpinfo();
实例
pikachu靶场
- 正常输入符号,无论输入哪个符号都是显示这样的文字
- 尝试输入
phpinfo();
,代码被正常执行了
评论