php高级代码审核:高级PHP应用程序漏洞审核技术来源: 发布时间:星期三, 2009年9月2日 浏览:14次 评论:0
Ph4nt0m Security Team
Issue 0x03, Phile #0x06 of 0x07 |=---------------------------------------------------------------------------=| |=---------------------=[ 高级PHP应用漏洞审核技术 ]=---------------------=| |=---------------------------------------------------------------------------=| |=---------------------------------------------------------------------------=| |=----------------------=[ By www.80vul.com ]=------------------------=| |=------------------------=[ <www.80vul.com> ]=--------------------------=| |=---------------------------------------------------------------------------=| [目录] 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 2次攻击 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 截断 5.6.1.2 数据截断 5.6.1.3 文件操作里特殊 6. 如何进步寻找新字典 7. DEMO 8. 后话 9. 附录 、前言 PHP是种被广泛使用脚本语言尤其适合于web开发具有跨平台容易学习功能强 大等特点据统计全世界有超过34%网站WebSite有php应用包括Yahoo、sina、163、sohu等大型 门户网站WebSite而且很多具名web应用系统(包括bbs,blog,wiki,cms等等)都是使用php开发 Discuz、phpwind、phpbb、vbb、wordpress、boblog等等随着web安全热点升级php应 用代码安全问题也逐步兴盛起来越来越多安全人员投入到这个领域越来越多应 用代码漏洞被披露针对这样个状况很多应用官方都成立了安全部门或者雇 佣安全人员进行代码审计因此出现了很多自动化商业化代码审计工具也就是这样形 势导致了个局面:大公司产品安全系数大大提高那些很明显漏洞基本灭绝了那些 大家都知道审计技术都无用武的地了我们面对很多工具以及大牛扫描过n遍代码有很 多安全人员有点悲观而有官方安全人员也非常放心自己代码但是不要忘记了“没 有绝对安全”我们应该去寻找新途径挖掘新漏洞本文就给介绍了些非传统技术 经验和大家分享 另外在这里特别介绍说明下本文里面很多漏洞都是来源于网络上牛人和朋友们分享在 这里需要感谢他们:) 2、传统代码审计技术 WEB应用漏洞查找基本上是围绕两个元素展开:变量和也就是说漏洞利用 必须把你提交恶意代码通过变量经过n次变量转换传递最终传递给目标执行还记得 MS那句经典名言吗?“切输入都是有害”这句话只强调了变量输入很多员把“输 入”理解为只是gpc[$_GET,$_POST,$_COOKIE]但是变量在传递过程产生了n多变化导致 很多过滤只是个“纸老虎”!我们换句话来描叙下代码安全:“切进入变量是有害” PHP代码审计技术用最多也是目前主力思路方法:静态分析主要也是通过查找容易导致 安全漏洞危险常用如grepfindstr等搜索工具很多自动化工具也是使用正则来搜 索这些下面列举些常用也就是下文说字典(暂略)但是目前基本已有 字典很难找到漏洞所以我们需要扩展我们字典这些字典也是本文主要探讨 其他思路方法有:通过修改PHP源代码来分析变量流程或者hook危险来实现对应用 代码审核但是这些也依靠了我们上面提到字典 3、PHP版本和应用代码审计 到目前为止PHP主要有3个版本:php4、php5、php6使用比例大致如下: php4 68% 2000-2007No security fixes after 2008/08最终版本是php4.4.9 php5 32% 2004-presentNow at version 5.2.6(PHP 5.3 alpha1 released!) php6 目前还在测试阶段变化很多做了大量修改取消了很多安全选项如magic_quotes_gpc (这个不是今天讨论范围) 由于php缺少自动升级机制导致目前PHP版本并存也导致很多存在漏洞没有被修补 这些有漏洞也是我们进行WEB应用代码审计重点对象也是我们字典重要来源 4、其他原因和应用代码审计 很多代码审计者拿到代码就看他们忽视了“安全是个整体”代码安全很多其他原因 有关系比如上面我们谈到PHP版本问题比较重要还有操作系统类型(主要是两大阵营 win/*nix)WEB服务端软件Software(主要是iis/apache两大类型)等原因这是由于区别系统区别 WEB SERVER有着区别安全特点或特性下文有些部分会涉及 所以我们在做某个公司WEB应用代码审计时应该了解他们使用系统WEB服务端软件Software PHP版本等信息 5、扩展我们字典 下面将详细介绍些非传统PHP应用代码审计些漏洞类型和利用窍门技巧 5.1 变量本身key 说到变量提交很多人只是看到了GET/POST/COOKIE等提交变量值但是忘记了有 把变量本身key也当变量提取给处理 --code------------------------------------------------------------------------- <?php //key.php?aaaa'aaa=1&bb'b=2 //pr_R($_GET); foreach ($_GET AS $key => $value) { pr $key."\n"; } ?> ------------------------------------------------------------------------------- 上面代码就提取了变量本身key显示出来单纯对于上面代码如果我们提交URL: --code------------------------------------------------------------------------- key.php?<script>alert(1);</script>=1&bbb=2 ------------------------------------------------------------------------------- 那么就导致个xss漏洞扩展下如果这个key提交给等或者sql查询 呢?:) + 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:通读代码 + 5.2 变量覆盖(variable-overwrite) 很多漏洞查找者都知道extract这个在指定参数为EXTR_OVERWRITE或者没有指 定可以导致变量覆盖但是还有很多其他情况导致变量覆盖如: 5.2.1 遍历化变量 请看如下代码: --code------------------------------------------------------------------------- <?php //var.php?a=fuck $a='hi'; foreach($_GET as $key => $value) { $$key = $value; } pr $a; ?> ------------------------------------------------------------------------------- 很多WEB应用都使用上面方式(注意循环不定是foreach)如Discuz!4.1WAP部分 代码: --code------------------------------------------------------------------------- $chs = ''; ($_POST && $char != 'utf-8') { $chs = Chinese('UTF-8', $char); foreach($_POST as $key => $value) { $$key = $chs->Convert($value); } un($chs); ------------------------------------------------------------------------------- + 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:通读代码 + 5.2.2 parse_str变量覆盖漏洞(CVE-2007-3205)、mb_parse_str --code------------------------------------------------------------------------- //var.php?var= $var = 'init'; parse_str($_SERVER['QUERY_STRING']); pr $var; ------------------------------------------------------------------------------- 该样可以覆盖变量上面代码是通过$_SERVER['QUERY_STRING']来提取变 量对于指定了变量名我们可以通过注射“=”来实现覆盖其他变量: --code------------------------------------------------------------------------- //var.php?var=1&a[1]=var1%3d222 $var1 = 'init'; parse_str($a[$_GET['var']]); pr $var1; ------------------------------------------------------------------------------- 上面代码通过提交$var来实现对$var1覆盖 + 漏洞审计策略(parse_str) ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找parse_str + + 漏洞审计策略(mb_parse_str) ------------------------- PHP版本要求:php4<4.4.7 php5<5.2.2 系统要求:无 审计策略:查找mb_parse_str + 5.2.3 import_request_variables变量覆盖漏洞(CVE-2007-1396) --code------------------------------------------------------------------------- //var.php?_SERVER[REMOTE_ADDR]=10.1.1.1 echo 'GLOBALS '.()ini_get("register_globals")."n"; import_request_variables('GPC'); ($_SERVER['REMOTE_ADDR'] != '10.1.1.1') die('Go away!'); echo 'Hello admin!'; ------------------------------------------------------------------------------- + 漏洞审计策略(import_request_variables) ------------------------- PHP版本要求:php4<4.4.1 php5<5.2.2 系统要求 0
相关文章读者评论发表评论 |