漏洞复现篇——任意代码命令执行漏洞复现及防御

什么是代码执行:
当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这个字符串,将造成代码注入漏洞。

代码执行函数:

  • 在php中:eval,assert,preg_replace(‘/*/e’, ' r e t = " 1 " ; , ret = "\\1";', data);
  • 在asp中:eval, exevute,executeglobal
  • 在jsp中:jsp中没有php中的eval函数,但是可以使用反射机制,使用基于反射机制的表达式引擎,如0GNL,SpEL,MVEL等

发现漏洞:

由于thinkphp存在代码执行漏洞,我们可以使用谷歌语法来搜索这类网站。
    如:inurl:think.php
学习代码审计,自己找一些代码执行漏洞

实验环境:

  • PHPstudy
  • 火狐浏览器

模拟实验

直接执行——在www目录下创建2个php文件,分别写入简单的代码,url后加?data=phpinfo();即可

eval()函数示例:

<?php
$data = $_GET[ 'data'] ;
eval ("\$ret = $data;") ;
echo $ret;
?>

在这里插入图片描述
preg_replace()函数示例:

<?php 
$data = $_GET['data'] ;
echo preg_replace("/test/e",$data,"jutst test");
 ?>

在这里插入图片描述

简单绕过——输入?data=");phpinfo();//即可

eval()函数示例:

<?php
$data = $_GET['data'];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
?>

在这里插入图片描述

代码执行的防御方法

1、使用json保存数组,当读取时就不需要使用eval了
2、对于必须使用eval的地方,一定严格处理用户数据(白名单、黑名单)
3、字符串使用单引号包括可控代码,插入前使用addslashes转义(addslashes、魔数引号、htmlspecialchars、 htmlentities、mysql_real_escape_string)
4、放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换(preg_replace_callback())
5、若必须使用preg_replace的e修饰符,则必用单引号包裹正则匹配出的对象(preg_replace+正则)

发布了76 篇原创文章 · 获赞 653 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_45728976/article/details/104542070