任意代码执行

简介

定义

当应用在调用一些能将字符串转化成代码的函数时,未考虑用户是否能够控制此字符串,从而产生代码注入漏洞

  • php中:
    eval
    assert
    preg_replace('/*/e','$ret="\\1";',$data);

  • asp中:
    eval
    execute
    executeglobal

  • jsp中:
    jsp中没有php中的eval函数,但是可以使用反射机制,使用基于反射机制的表达式引擎,例如:
    0GNLSpELMVEL


漏洞存在原因

应用有时会考虑代码的简洁性、灵活性,在代码中调用eval之类的函数。
即:应用的所有配置都在数据库中存储,通过此函数,直接读取配置,而不需要使用正则之类的来一点一点读取配置
例如在phpcms中使用string2array()

1
2
3
4
5
6
7
8
# $data表示字符串数组
function string2array($data) {
if($data == '') {
return array();
}
@eval("\$array = $data;");
return $array;
}


漏洞利用

查找漏洞站点

例如:
由于thinkphp存在代码执行漏洞,可以使用Google Hacing搜索此类网站

1
inurl:think.php

学会代码审计技巧,自行寻找


利用

简单代码执行:

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

利用方式:
其中 ${}代表变量

1
2
3
$data=1");phpinfo();//
http://localhost/?data=${phpinfo();}
http://localhost/?code=${@eval($_POST[1]);}


防御

常用方法

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

命令执行

漏洞危害

  • 继承Web应用程序的权限,执行系统命令
  • 读写文件
  • 反弹Shell
  • 控制整个网站和服务器
  • 进行内网渗透

Jsp的Strtus2框架

strtus2框架一直出现安全问题,大多都是命令执行问题
例如:
s2-037s2-045s2-048

可以去github寻找pocexp


防御方法

  1. 尽量不使用系统执行命令
  2. 在进行执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义
  3. 在使用动态函数之前,确保使用的函数是指定的函数之一
  4. 对PHP语言来说,不能完全控制的危险函数最好舍弃

常用系统命令与功能

Windows下同时执行多条命令

语法格式:

命令格式 含义
command1 & command2 顺序执行1、2,无论1执行否成功
command1 && command2 顺序执行1、2,只有1执行成功时才执行2
command1 $temp2 command2 顺序执行1、2,只有1执行失败时才执行2
command1 $temp1 command2 管道符,将1的执行作为输入传递给2

由于MarkDown表格语法对管道符|冲突,此处
$temp2 代表 ||
$temp1 代表 |


Linux下同时执行多条命令

命令格式 含义
command1 ; command2 顺序执行1、2,无论1执行否成功
command1 && command2 顺序执行1、2,只有1执行成功时才执行2
command1 $temp2 command2 顺序执行1、2,只有1执行失败时才执行2
command1 $temp1 command2 管道符,将1的执行作为输入传递给2

由于MarkDown表格语法对管道符|冲突,此处
$temp2 代表 ||
$temp1 代表 |


补充

单引号内变量不传值
启动魔术引号gpc后,单引号会被转义

php弱类型,去数字1abcd只取第一个‘1’

使用/e参数会先执行再匹配,导致危险代码执行
preg_replace(“/test/e”,$data,”test”);


Kali破解Hash

1
john passwd

网络检测功能任意命令注入(DI-7100(Beat 1022))

您的支持是我前进的动力!