WEB代码审计与渗透测试
5up3rh3i@gmail 80vul
WEB应用程序代码审计
程序的两大根本:变量与函数 漏洞现成的条件:
A、可以控制的变量 【一切输入都是有害的 】 B、变量到达有利用价值的函数[危险函数] 【一切进入函数的变量是有害的】
漏洞的利用效果取决于最终 最终函数的功 最终 能
变量进入什么样的函数就导致什么要的效果
PHP应用程序代码审计
为什么只是PHP? A、跨平台、应用广泛、复杂 B、变量处理灵活[如变量覆盖、全局变量等] C、函数库巨大 [导致漏洞类型多,既有通用的又有特有的] E、代码审计的思路是可以通用的
变量
预定义变量[常规外部提交的变量]
GPC $_ENV/SERVER/SESSION $HTTP_RAW_POST_DATA等
register_globals = on [未初始化的变量]
PHP ? 4.20 默认为off
变量覆盖[未初始化及覆盖前定义的变量]
如:extract() 、遍历初始化变量、parse_str()等 遍历初始化变量、 遍历初始化变量 等
变量的传递与存储[中转的变量]
存储于数据库、文件[如配置、缓存文件等]
危险函数
什么样的函数导致什么样的漏洞! 文件包含 包含漏洞 代码执行 执行任意代码漏洞 命令执行 执行任意命令漏洞 文件系统操作 文件(目录)读写等漏洞 数据库操作 SQL注射漏洞 数据显示 XSS等客服端漏洞 ……
更多的变量处理与危险函数
应用程序漏洞审核技术》 《高级PHP应用程序漏洞审核技术》 高级 应用程序漏洞审核技术 code.google/p/pasc2at/wiki/Simpli fiedChinese
代码审计的本质
找漏洞==找对应变量与函数
变量跟踪的过程
通过变量找函数[正向跟踪变量]
$id=$_GET[‘id’] $sid=$id … 函数($sid)
通过函数找变量[逆向跟踪变量]
函数($sid) $sid=$id … $id=$_GET[‘id’]
变量的传递与二次漏洞
变量存储、提取、传递是一个复杂的立体 的过程 过程中经过多个不一样的函数的处理后继 续传递,最终达到漏洞函数 传递的过程中任意环节可控就可能导致漏 洞 中间函数处理的过程诞生新的变量,新的 变量达到新的漏洞函数 诞生新的漏洞[二 次漏洞]
二次漏洞
什么是二次漏洞?
2006年提出的一个概念 主导思想:通过一个现有漏洞,创造新的漏洞使得 漏洞利用最大化
一个demo
一个典型的文件删除漏洞
[注意:include与require的区别]
二次漏洞
又一个demo
一个注射漏洞 $sql= "select id,filepath,user,name from attachment where fileid=$_GET[‘id’]”; $result = mysql_db_query($dbname, $sql); $file=
mysql_fetch_array($result); 然而: include($file[‘filepath’]); 一个貌似不可以直接控制的新变 量$file[‘filepath’]进入了危险函数 include() ?id=1 union select 1,’80vul/shell.txt’,1,1
当然我们没有那个注射漏洞,只要我们对数据库有控制权限一样可以通过update、 insert控制$file[‘filepath’]。
一个实例: phplist-2.10.4[old ver]远程包含漏洞
//phplist-2.10.4\public_html\lists\admin\ //phplist-2.10.4\public_html\lists\admin\index.php if (!ini_get("register_globals") || ini_get("register_globals") == "off") { ...... //经典的变量覆盖漏洞模式 //经典的变量覆盖漏洞模式 foreach ($_REQUEST as $key => $val) { $$key = $val; } } ...... //覆盖$_SERVER[“ConfigFile”],经过is_file()判断后进入include() //覆盖$_SERVER[“ConfigFile”],经过is_file()判断后进入include() if (isset($_SERVER["ConfigFile"]) &;&; is_file($_SERVER["ConfigFile"])) { is_file($_SERVER["ConfigFile"])) print ''."\n"; ''."\ include $_SERVER["ConfigFile"]; 但是is_file() 但是is_file()是不支持远程文件的,所以到目前代码只是一个本地包含漏洞
\\phplist-2.10.4\publ