太阳集团2138备用网址

  • “12326”民航服务质量监督电话正式开通 2019-04-23
  • 中铁佰和佰樂金婚盛典2017重阳节完美绽放 2019-04-23
  • 保护长江生态环境今年主抓8方面工作——生态环境部部长李干杰回应生态环境保护热点问题 2019-04-23
  • 新疆台办开展走访慰问台商台企活动 2019-04-23
  • 标致301优惠1.5万起 时尚代步经济全面 2019-04-23
  • 欢迎进入红色轨迹党史网站 2019-04-23
  • 【华商侃车NO.28】重磅!为什么315这么多车主维权? 2019-04-23
  • “上会神器”造型各异! 2019-04-23
  • 曾经赫赫有名如今艰难生存:华硕的解药到底在哪儿? 2019-04-23
  • 全国政协常委吴晶倡议:唱响《国歌》 激发爱国情怀【图文】 2019-04-23
  • 首届青运会开幕式文体表演简约而不简单 2019-04-23
  • 中国法学会第八次全国会员代表大会在京开幕 2019-04-23
  • 我是谁?我是海关关员 2019-04-23
  • “立委”南北辅选? 韩國瑜:要看时间 2019-04-22
  • 中国—东盟时装周上演马来西亚设计师婚纱礼服秀 2019-04-22
  • 欢迎来到 黑吧太阳集团2138备用网址 是业内专业的游戏平台,为你提供各式各样的精品游戏,最全的游戏项目,同时还为您提供各种游戏专题游戏攻略人气论坛。

    PHP 运行时漏洞检测

    来源:本站整理 作者:佚名 时间:2019-02-28 TAG: 我要投稿

    太阳集团2138备用网址 www.r-island.com 这片博文将简单的介绍我编写的 PHP 运行时漏洞检测系统 prvd 的检测逻辑, 以及该系统在实际测试中的效果。

    0x01 基本知识
    在这里我们先介绍几个常用的词语:

    source数据来源点,可以是:
    网络,例如常规的 Web 参数等
    文件系统
    数据库
    等等其他用户可控或者间接可控的地方
    filter数据过滤处理点,可以是:
    编码解码,例如 base64_decode 等
    常规字符串操作,例如 strtolower 等
    安全过滤,例如 mysqli_escape_string 等
    等等其他会更改字符串内容的地方
    sink漏洞触发点,可以是:
    操作文件相关行为,例如 file_put_content 等
    操作网络相关函数,例如 curl 等
    操作命令相关行为,例如 system 等
    等等其他危险行为
    有些地方既可以是 source 点,也可以是 sink 点,比如说 file_put_content 在参数可控的时候是 sink 点,因为返回的数据也是我们可控的,这里返回的数据也是 source 点。

    0x02 xmark
    我们先简单地介绍一下 xmark,这是一个 PHP7 扩展,能够直接使用 PHP 代码做到:

    对字符串变量进行打标记
    Hook 绝大多数函数/类
    Hook 部分 opcode
    基于 xmark 所提供的功能,即便是我们不熟悉 PHP 内部实现,我们也能够很简单的去实现:

    PHP RASP
    PHP 解密工具,例如 phpdecoder
    PHP 运行时漏洞检测

    因为 PHP 并不像 Python、Ruby 等其他语言可以很方便的 Hook 函数、类,所以我们开发了这么一个扩展来完成类似的功能。

    实际上 xmark 这个项目有不少代码是直接拷贝 taint 的, 那为什么要改这样一个轮子呢?

    taint 的 source 点覆盖不全面,只对 GPC 进行标记
    taint 处理和漏洞相关的逻辑需要在 PHP 扩展中实现
    这里我不打算花太多篇幅介绍 xmark 的实现,直接看代码更方便,更多关于 xmark 的信息可以点这里

    0x03 prvd
    前面说了基于 xmark 我们可以实现挺多好玩的事情, 这里我选择去完成一个 PHP 运行时漏洞检测系统,也就是 prvd 这个项目, 项目名也就是 PHP Runtime Vulnerability Detection 的缩写。

    prvd 有两种模式,一种是 taint 模式, 另外一种是 payload 模式。taint 模式可以选择开启,payload 模式是一直都开启的。 这两种模式都依赖外部来解决执行路径的问题。

    taint 模式

    这种模式下 prvd 和 taint 一样,都是 source 打上一个标记,在某些 filter 中传递这个标记,然后在 sink 点检查对应的参数是否被打上标记。

    比方说:

    Default

    $cmd = $_POST['cmd'];
    $cmd1 .= "fate0";
    $cmd2 = strtolower($cmd1);
    system($cmd2);
    1
    2
    3
    4
    $cmd = $_POST['cmd'];
    $cmd1 .= "fate0";
    $cmd2 = strtolower($cmd1);
    system($cmd2);
    $_POST['cmd'] 一开始就被我们打上了标记,在自赋值的时候将标记传递给了 $cmd1, 在经历 strtolower 这个 filter 的时候继续将标记传递给了 $cmd2, $cmd2 最后进入 sink 点 system 函数的时候被检测被打上了标记,从而确定是否可能存在问题。

    taint 模式可以不需要输入特定的 payload 进行攻击就可能发现一些漏洞点,也不会污染数据,但是在 filter 中判断是否应该继续传递标记比较难处理, 有可能数据已经经过了很好的过滤,但是我们还是继续传递了标记,最终导致误报。也有可能数据处理不当,但我们已经去除了标记,最终导致漏报。

    我们举个漏报的例子:

    Default

    $id = $_POST[ 'id' ];

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    // $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
    1
    2
    3
    4
    5
    6
    7
    $id = $_POST[ 'id' ];
     
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
     
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    // $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
    可控变量 $id 经过 mysqli_real_escape_string 的时候需不需清除其标记呢?

    为了解决这种情况,我编写了另外一种 payload 模式。

    payload 模式

    有时候追踪执行流并没有什么用,整那么多玩意,还不如直接一把梭哈,直接把 payload 打过去,然后在 sink 点观测, 这就是我们的 payload 模式,这个模式的 prvd 可以归类为 IAST 的一种。

    payload 模式相比 taint 模式,优点为:

    误报率比 taint 模式低,使用 payload 模式,从技术上完全把误报率降低到 1% 以下
    可以不关注 source 点和 filter 点,这样即使数据经历多次中转,最后经过 sink 点的漏洞,也有能力去检测,比如说多阶 SQL 注入的情况
    缺点为:

    漏报率可能会比 taint 模式下高,因为可能经过各种 filter 的时候就被 payload 就会拦截下来,也可能需要特定 payload 才能触发漏洞
    需要特别关注 sink 点,在 sink 点中根据各种条件判断是否为漏洞
    会污染数据
    下面简单的介绍一下在 payload 模式下,各种漏洞的检测方法:

    Default

    漏洞类型 检测方法
    SQL 注入 在 prvd_check_sqli 中检测待 SQL 的完整性是否被破坏,是否逃逸了单双引号
    任意文件操作 在 prvd_check_path 中检测文件操作的路径中是否包含 ../xtanzi 字符串
    远程命令执行 在 prvd_check_rce 中检测待执行命令的完整性是否破坏,是否逃逸了单双引号

    [1] [2]  下一页

    【声明】:太阳集团2138备用网址(http://www.r-island.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@www.r-island.com,我们会在最短的时间内进行处理。
    • 最新更新
      • 相关阅读
        • 本类热门
          • 最近下载