代码审计之审计思路

审计思路

正向

查找可控变量,正向追踪变量传递过程。

逆向

根据敏感关键字回溯参数传递过程。逆向:根据敏感关键字回溯参数传递过程。

  • 优点:只需要搜索相应敏感关键字,既可以快速的挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。
  • 缺点:由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。

寻找敏感功能点

通读功能点代码(查看这些功能的特定文件是怎样存在的,独立的模块还是以插件形式,还是写在一个类里,然后多处调用)

  • 文件上传功能
  • 文件管理功能
  • 登录认证功能
    以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文件简单读一遍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值