手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

来自80sec:XML实体注入漏洞安全警告

文章不长,可以仔细看看,说的是php中的两个函数,其他语言也可能会有类似问题,但simplexml_load_string是PHP比较常用的函数,所以,要注意一下了。
原文地址是:http://www.80sec.com/xml-entity-injection.html

漏洞介绍:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。80sec发现目前一些普遍使用xml的场景中都存在一种古老的XML实体注入漏洞,这 可能导致较为严重的安全问题,使得攻击者可能可以任意访问服务器以及应用所在网络的任何资源;

漏洞分析:XML作为一种使用较为广泛的数据传输格式,在语言内部允许引用外部资源来作为语言的补充,譬如


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE copyright [
<!ELEMENT copyright (#PCDATA)>
<!ENTITY hi80sec SYSTEM "http://www.wooyun.org/">
]>
<wooyun version="2.0">
<whitehats>
&hi80sec; is a legend
</whitehats>
</wooyun>

这将使得xml解析器以当前上下文的环境引用外部的资源www.wooyun.org作为hi80sec实体的内容,从而在实际的应用上下文里将该部分数据引入逻辑流程进行处理。同样,我们可以使用

file:///etc/passwd
file://localhost/etc/password

进行访问本地文件系统的操作。

不同的解析器可能默认对于外部实体会有不同的处理规则,以PHP语言为例,默认处理xml的方法就包括:

xml_parse

simplexml_load

两种不同的方法,这两种不同的方法在底层完全采取不同的底层逻辑实现,xml_parse的实现方式为expat库,而simplexml_load使用 的是libxml库,两个底层库在解析的时候细节并不一样,expat默认对外部实体并不解析,而simplexml_load默认情况下会解析外部实体 等,所以simplexml_load和DOM等函数会受此问题影响,而xml_parse则默认不会受到影响。
我们不止在PHP,在包括Java,Python等处理xml的外部组件及函数中都证明可能存在此问题,而且已经在一些互联网公司的应用及一些使用广泛的开源软件中都发现存在问题。

漏洞证明:我们将在WooYun漏洞报告平台上提交我们发现的已经被证明的安全漏洞

解决方案:检查所使用的底层xml解析库,默认禁止外部实体的解析,同时增强对系统的监控,防止此问题被人利用;我们将在WooYun漏洞报告平台上发布可能受影响的,请及时关注;

转:对Java初学者的忠告

标题很庞大,其实,适用于任何人。不过文中的第一条其实对于PHP开发人员来说真的很痛苦,没有一本系统的好书,那本亚马逊的圣经或许算得上一本好书,但相对于java来说,书籍真的太少了。或许有人说,手册就是最好的书籍,但不是每个初学者看着手册就能一下子开始的。
原文是从博客园贴过来的,对于一个.net社区会有这样的文章,其实也很纳闷。海纳百川?好吧,我就当这么理解了。
URL在这里:http://kb.cnblogs.com/page/132067/ ,这是原文链接,(仔细一看,原来是来自CSDN,我坦然了)

  1) 适合自己的图书才是最好的,最好的书并不一定适合你,看自己的情况。

  如果你是一个Java初学者一上手就捧一本Thinking in Java在手里,我想你的日子是不会好过的,那样的书给有一定基础的人看的,当工具书使用的,当然有一定基础后,可以跟着上边流程学,如果你能学下来,那么你的基础就不用说了。

  2) 看书要用心,多动脑,实践很重要,要抱着怀疑的态度看书。

  再好的书也可能会出现错误,人非圣人吗!多练这个很重要,如果你光看不练,我想你年过几天会就会忘的差不多了!

  3) 遇到问题多查帮助文档,还可以上网站进行搜索。

  现如今的搜索引擎功能十分强大,只要你能用得到就能搜到的,还担心什么,不要碰到一点什么问题,都去烦别人,这样别人会小瞧你的!可以加一些Java交流群,对于初学者可能会有一些作用,如果你已经是高手了,我认为这样的群对你的提高不会很大。 

  4) 忌讳急功近利,越急就越容易走弯路。

  不要急,基础虽然很简单,一个月或半年,甚至是一年,这都很正常。但出来的成效绝对是不一样的,相信你的时间不会白白浪费。

  5) 我们要精而非全,语言都是相通的。

  学精一门语言再转其它语言也会容易的多。基础很重要,不要贪高。(这个就不用说了,如果你精通C++,改学Java还不简单,思想你已经掌握,你要学的就是一点语法,还不容易?) 

  6) 欣赏他人的代码

  初学者不要看,因为理解别人的思路原比自己写要困难的多。认为自己的基础到了一定的程度,可以看看一些开源的软件,因为那都是一些 优秀的杰作,会对提高你的水平有很大帮助。(注意方法:先找主线——>从界面入手——>在纸上画出结构图——>然后再分步分析) 

  7) 在实践中提高自己的能力

  边学边练,别给自己找借口。买一些带实例的书,可以试着做一些日常生活中常用到的小程序,只有在实践中你才会发现更多的问题。 

  8) 培养自己发现、思考、解决问题的能力。

  能自己想办法解决,不求别人!对于初学者很重要。

  9) 心态要平衡,不要总觉得高人一等。

  一个事物的存在总有它的合理性。你的技术比别人牛,这没什么,或许你是学的早,也或许你比别人反应快一点,永远不要自大,计算机是技术更新很快的行业,你不会永远都站在别人的前头的。心态平衡,不断学习,这才是王道! 

  10) 可以下载视频,买书,借书,在线观看。

  如果你是大学生,那么不要浪费资源,一头扎头图书馆里吧。现在网络资源,网上的视频和电子书极多,还愁找不到资源吗? 
  11) 认证的价值不大,在一些企业还不是特殊认可,没必要花费大的精力去考。

  个人没有去学过认证,认为价值不大,但如果你根本不缺那几个钱,又有能力的话,可以考,多少还是会有一定作用的。如果你的经济情况不怎么样,照我说,就先算了。在职学习比较困难,比较忙,压力大,时间紧。

  12) 找工作,基础扎实,有一年开发经验,不用担心。你可能会有3K左右的工资了。 

  13) 做开发不一定要数学好,只不过你不适合做算法方面的工作。(能当程序员的,谁都不白痴,呵呵!) 

  14) 没有什么捷径,如果有的话,价值也就不大了。

  别梦想一步登天,给自己作一个学习过程计划,先学什么,后学什么,合理一点。如果非要说有什么捷径的话,我认为培训不错,条件允许的话,这可以省掉你很多的宝贵时间,当然选择培训机构的时候一定要慎重。因为那不光是Money的问题。

------

按原文的话来说,我觉得最后这三条有点意思,最起码第12条不象是一个老外的忠告。。。WEB程序员,有时候对于算法还真的不需要了解过多。最的一条确实重要,开发不是搞营销,真的没有什么捷径。

Tags: java, php

看到一段歇斯底里的话

看到一段歇斯底里的话:

在该死的程序员生涯中应当遵循的守则:
  1. 保持该死的主线干净!  
  2. 在该死的独立分支上进行该死的新功能的开发!  
  3. 一旦你公布了代码,并且某些人使用了它,那就 TMD 不要修改 API!  
  4. 如果想要或者必须修改 API,修改 TMD 主版本号 并且 在独立于原代码库的新的代码库上进行该死的开发!  
  5. 如果有必要,非常有必要使用某些特别的标签,做分支或提交作为依赖,你得 TMD 用自己 fork 出来的代码库进行 TMD 所需要的提交!  
  6. 哦,还有保持简单,狗娘养的!  

好吧。我看了很恐怖。
当然,顺便说一下taoAPI的SDK,里面有一段居然是:

PHP代码
  1. public function execute($request$session = null)  
  2. {  
  3.     if($this->checkRequest) {  
  4.         try {  
  5.             $request->check();  
  6.         } catch (Exception $e) {  
  7.             $result->code = $e->getCode();  
  8.             $result->msg = $e->getMessage();  
  9.             return $result;  
  10.         }  
  11.     }  
  12. }  

哥,你能不能先定义一下$result = new StdClass;
搞得我IDE里全是血红一片。。。

yii 镜像

Yii Framework有的时候会很容易就被墙。所以,自己给他做了一个反向代理 .
每个月5G流量。访问地址为: http://yii.neatcn.com(跳转)

这样的功能,当然不是我做的。我没有那么多的精力来做这个,我是用了一个现成的网站(Speedy Mirror)处理的。

很方便,这里有一篇中文教程:http://www.ml934.com/archives/204.html

我们知道Speedy Mirror是 一家免费CDN加速服务网站,服务器节点分布在英美,感觉用它给国内的网站做加速意义不大。所以这里只谈用SpeedMirror为GAE做“反向代 理”,准确的说就是做了一个“镜像网站”。我们知道由于GAE被墙,appspot.com是不能在国内访问的,这就导致以GAE做为平台的各种应用无法 正常使用和访问,比如在GAE上搭建的博客,相册,网盘等等。这里我们就正好可以利用其CDN的特性,为你的GAE 站点做个镜像,当我们访问xxxx.appspot.com的时候,就会从Speedy Mirror的服务器上获取缓存内容。Speedy Mirror支持https访问,使用简单,注册后只需填写你要推送的网址,完成设置立刻生效。

先添加一个你喜欢的名称,再填写你要推送的网址,点击Detect and save确定就可以了。然后就会给你一个xxxx.speedymirror.com二级域名(下图,可点击放大查看)

Speedy Mirror默认的缓存更新是7天,你要是更新频繁,你就点击xxxx.speedymirror.com把缓存更新改为1即可。点击Add new mirror,再新添加一个镜像就可以了哦,怎么样?够简单吧,那就时间起来吧,呵呵。

PS:GAE虽然可以通过APPs企业套件绑定域名的方法实现墙内访问,但对于新手来说,步骤繁琐,且反向代理也不好找,远不如 Speedy Mirror简单。唯一的缺憾就是speedymirror.com这个域名太不好记了,简直有点坑爹。老外的东西,没办法了,就凑活着用 吧!

----------

原文中没有说明,其实现在可以cname指向到你申请的那个二级域名的页面的。所以我才变成了yii.neatcn.com

 

Tags: yii

转老王:PHPCheckstyle代码审计与Subversion钩子脚本

之所以要转这一篇文章,是在于有人在THINKINLAMP的googlegroup里提问,说是怎么在svn提交的时候对phpdoc进行检查,需要让他们强制写注释,否则就不让他们提交,于是我说了是在老王的博客上。但后来我看了一下老王新的博客,huoding.com,这篇文章不在(没有迁移到新的博客中)。所以我重新在本地复制了一下他在百度博客里的文章。
原文来自:http://hi.baidu.com/thinkinginlamp/blog/item/17476d22661ee6a94623e8d7.html

PHP代码审计方面的软件越来越多了,PHPCheckstyle算是最近比较活跃的一个。通过SVN钩子脚本的方式来调用PHPCheckstyle,可以强制代码必须符合预先设定的编码标准(比如PEAR编码标准),有助于在多人合作项目中提高代码整体质量。

PHPCheckstyle的设置:

安装真的没什么可说的,属于接插即用型的,唯一需要设置的就是config目录下的配置文件:缺省使用的是default.cfg.xml,你可以编辑它,按照官方文档适当的增减规则。不过PHPCheckstyle项目诞生时间短,不够稳定,截至0.8版本为止还有不少问题,使用前最好逐条规则进行测试。

最简单的运行方法如下:

php run.php --src /path/to/file

这样的话会生成相关的html文档,如果你想直接输出的话,请使用:

php run.php --format console --src /path/to/file

更多选项可以自己看帮助(php run.php就可以查看相关帮助)

Subversion钩子脚本:

下面设置钩子脚本,具体点说是前置钩子,也就是:pre-commit,通过钩子检查后才被允许提交到版本库。只有添加或更新的文件是需要检查的,如果是 要删除的文件,则没有必要检查;还有一个问题,PHPCheckstyle只能检查具体文件的内容,而在提交之前,我们想要检查的文件还不存在,所以我们 得生成一个临时文件,检查完再删除,另外,在生成文件时要注意其唯一性,免得多用户一起提交时发生冲突,注意事项了解的差不多了,可以写钩子脚本了:

代码(at pastebin.com):

01 #!/bin/bash
02
03 REPOS="$1"
04 TXN="$2"
05
06 PHP="/usr/local/php/bin/php"
07 SVNLOOK="/usr/bin/svnlook"
08
09 RUNSCRIPT="/path/to/run/php/script"
10
11 CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | grep '^[U|A]' | awk '{print $2}'`
12
13 for FILE in $CHANGED; do
14     if [[ "$FILE" =~ \.php$ ]]; then
15         TEMPFILE=`mktemp`
16         $SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" > $TEMPFILE
17         MESSAGE=`$PHP $RUNSCRIPT --format console --src $TEMPFILE | head -n -2`
18         if [ ! -z "$MESSAGE" ]; then
19             rm -rf $TEMPFILE
20             echo "$MESSAGE" | sed -e "s|$TEMPFILE|$FILE|" 1>&2
21             exit 1
22         fi
23         rm -rf $TEMPFILE
24     fi
25 done

关于Shell,如果有不清楚的可以自己搜索一下,网上有很多类似的文章

钩子脚本还可以做很多事情,比如核对PHP脚本语法(php -l),而且通过管道符不用生成临时文件:

MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | $PHP -l`

运行后,不用判断MESSAGE是否为空,而是根据退出状态来判断脚本是否有语法问题:

if [ $? -ne 0 ]

PHPCheckstyle配置和使用多少还是有点别扭,有机会试试PHP_CodeSniffer配置钩子脚本更简单

BTW:发现一个PHP Commit Hooks项目,有点意思,可以看看。
-------
---EOF---
最后,我也下载一份PHP COMMIT HOOKS项目 ,有点意思,可以少写很多了

Tags: svn, checkstyle, thinkinlamp