Archive for the ‘Web安全’ Category

海洋CMS(SEACMS)v6.55执行任意代码漏洞及其补丁绕过方法

概述

最近我们的一名安全托管客户反应,其服务器遭受到攻击,被黑客上传了webshell并篡改网页内容。经过我们为客户安装云锁防护软件后,拦截到一个针对海洋CMS(SEACMS)的0day漏洞。
海洋CMS是一套专为不同需求的站长而设计的视频点播系统,在影视类CMS中具有很高的市场占有率,其官方地址是:http://www.seacms.net/

海洋CMS(SEACMS)几个老漏洞及其修补方法

在2017年2月,海洋CMS 6.45版本曾爆出一个前台getshell漏洞,漏洞具体内容参见:http://blog.csdn.net/qq_35078631/article/details/76595817。该漏洞成因在于search.php没有对用户输入内容进行过滤,导致攻击者提交的order参数可进入parseIf函数中执行eval。
官方在6.46版中修复了该漏洞,修复方法是对用户输入的参数进行过滤并限制长度为20个字符。但这种修复方法并没有完全修复漏洞,因为在替换操作过程中用户输入的几个参数可以进行组合,因此补丁被绕过。
随后官方又在8月7日发布了6.54版本再次修复漏洞,这次修复增加了一句:

$order = ($order == "commend" || $order == "time" || $order == "hit") ? $order : "";

即限制了order参数只能是固定内容,这样虽然避免了通过order参数进行的攻击,但是却没有解决其他参数进入parseIf函数的问题。

海洋CMS(SEACMS)0day漏洞分析

我们抓取到的攻击payload如下:

POST /search.php HTTP/1.1
Host: www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 
阅读全文
Posted on 十月 17, 2017 at 下午4:29 by admin · Permalink · Comments Closed
In: Web安全

PHP垃圾回收机制UAF漏洞分析

作者:天择实验室wuhj@jowto.com
转载请注明出处:http://blog.jowto.com

1.PHP垃圾回收机制简介

因为PHP当中存在循环引用,仅以refcount计数器作为垃圾回收机制是不够的,因此在PHP5.3中引入了新的垃圾回收机制。
<?php
$a = array('one');
$a[] = &$a;
unset($a);
?>

在PHP5.2及以前的版本中,无法回收变量$a的内存。

在PHP5.3以后的新垃圾回收机制算法,以颜色标记的方法来判断垃圾:

  1. 将所有数组和对象zval节点放入gcrootbuffer,并标记为紫色(潜在垃圾,已放入缓冲区)。当节点缓冲区被塞满(默认为10000)或调用gccollectcycles()时,开始进行垃圾回收。
  2. 以深度优先对zval及其子节点所包含的zval进行refcount减1操作,并标记为灰色(已减一)。
  3. 再次以深度优先判断每一个节点包含的zval的值,如果zval的refcount等于0,那么将其标记成白色(垃圾)。如果zval的refcount大于0,那么将对此zval以及其子节点进行refcount加1还原,同时将这些zval的颜色变成黑色(正常)。
  4. 遍历zval节点,将C中标记成白色的节点zval释放掉。

垃圾回收算法代码如下:
Zend/zend_gc.c
ZEND_API int gc_collect_cycles(TSRMLS_D)
{
[...]
gc_mark_roots(TSRMLS_C);
gc_scan_roots(TSRMLS_C);
gc_collect_roots(TSRMLS_C);
[...]
/* Free zvals */
p =
阅读全文

Posted on 一月 10, 2017 at 下午3:12 by admin · Permalink · Comments Closed
In: Web安全, 漏洞分析

ob_start用于菜刀的可行性分析

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

 

传统的ob_start马是这样用:

<?php
ob_start('assert'); 
echo $_REQUEST['pass']; 
ob_end_flush();
?>

经过本人测试这种方法在PHP5.4.X以上版本可以执行代码,但没有任何回显,当然也就不能用于菜刀,那么究竟是什么原因导致的不能回显呢?

分析
ob_start(“assert”)的意思设置assert作为ob操作结束时回调函数,ob_start要求回调函数接收两个参数,而在PHP 5.4.8以下版本assert只接受一个参数,所以5.3.X这样用都不能成功执行代码。恰好本人在做一个基于污点跟踪的webshell监控的玩意,测试这个时候始终不能执行,百思不得其解之后发现是版本问题,汗
5.4.8以上版本的PHP可以成功执行,但是assert执行内容不能有print/echo等ob输出,看PHP源代码找到原因:
main\output.c

PHPAPI void php_end_ob_buffer(zend_bool send_buffer, zend_bool just_flush TSRMLS_DC)
{

    OG
阅读全文
Posted on 一月 4, 2016 at 下午5:22 by admin · Permalink · Comments Closed
In: Web安全

ASP下一句话木马的动态拦截技术

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

        一句话木马如<%eval request(“MH”)%>,攻击者通过组织好的参数访问木马,就可以让参数中的恶意脚本在服务器端执行。为了防止执行恶意脚本,可以在IIS脚本引擎中拦截EVAL函数来过滤非法请求。

以下分析都在windows server 2003 x86下调试:
w3wp.exe是在IIS(Internet Information Server)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行。当需要解析ASP脚本时会加载vbscript.dll,通过IDA搜索vbscript.dll中和“eval”有关的函数,找到

VbsEval(VAR *,int,VAR *) .text 7337da95

在windbg中调试发现脚本执行Eval函数时都会调用到VbsEval,见下图:
URL:

localhost/test.asp?MH=1*2

test.asp:

<%eval request("MH")%>

windbg:

image001

在内存中可以看到eval函数执行的脚本。现在只需要将此脚本与URL中请求参数内容对比,如果内存中执行的EVAL脚本在URL中存在则可以认为是URL请求试图调用一句话木马并执行。如上图截取的底层执行代码为1*2,判断1*2是否在localhost/test.asp?MH=1*2中存在,如果存在则直接返回恶意代码提示,最终效果如下图:

image003

HOOK住vbscript!VbsEval很容易截取到要执行的脚本,现在的问题是任何脚本执行eval都要调用vbseval函数,那么怎么才能找到当前执行脚本是由哪个URL触发的呢?如果无法取到URL则不能与EVAL中执行脚本对比,过滤是无从谈起的。

现在从vbseval函数往上看整个脚本解释执行的流程!

image005下asp!CViperAsyncRequest::OnCall断点,堆栈回溯如下:

image007

可以看出脚本执行eval函数是通过启动线程调用回调函数来触发的。但是下新建线程的API都断不下来,需要换个思路。通过上图可以看到线程启动后最先执行函数是asp.dll里的asp!CViperAsyncRequest::OnCall,查看asp.dll的导出函数如下图:image009

通过这3个导出函数可以判断asp.dll是ISAPI中的ISA。ISA简介如下:

ISA(Internet Server Application)也可称为ISAPI DLL,其功能和CGI程序的功能直接相对应
,使用方法和CGI也类似,由客户端在URL中指定其名称而激活。

ISA和服务器之间的接口主要有两个:GetExtentionVersion( )和HttpExtentionProc( )。任何
ISA都必须在其PE文件头的引出表中定义这两个引出函数,以供Web服务器在适当的时候调用。
ISA大概工作流程如下:

1、当服务器刚加载ISA时,它会调用ISA提供的GetExtentionVersion( )来获得该ISA所需要的服
务器版本,并与自己的版本相比较,以保证版本兼容。… 阅读全文

Posted on 十一月 5, 2014 at 下午2:04 by admin · Permalink · Comments Closed
In: Web安全
友情链接