[红日安全]代码审计Day2 - filter_var函数缺陷

本文由红日安全成员: 七月火 编写,如有不当,还望斧正。

前言
大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。现在大家所看到的系列文章,属于项目 第一阶段 的内容,本阶段的内容题目均来自 PHP SECURITY CALENDAR 2017 。对于每一道题目,我们均给出对应的分析,并结合实际CMS进行解说。在文章的最后,我们还会留一道CTF题目,供大家练习,希望大家喜欢。下面是 第2篇 代码审计文章:

Day 2 - Twig
题目叫做Twig,代码如下:在这里插入图片描述

漏洞解析 :

这一关题目实际上用的是PHP的一个模板引擎 Twig ,本题考察XSS(跨站脚本攻击)漏洞。虽然题目代码分别用了 escape 和 filter_var 两个过滤方法,但是还是可以被攻击者绕过。在上图 第8行 中,程序使用 Twig 模板引擎定义的 escape 过滤器来过滤link,而实际上这里的 escape 过滤器,是用PHP内置函数 htmlspecialchars 来实现的,具体可以点击 这里 了解 escape 过滤器, htmlspecialchars 函数定义如下:

htmlspecialchars :(PHP 4, PHP 5, PHP 7)

功能 :将特殊字符转换为 HTML 实体

定义 :string htmlspecialchars ( string $string [, int f l a g s = E N T C O M P A T ∣ E N T H T M L 401 [ , s t r i n g flags = ENT_COMPAT | ENT_HTML401 [, string flags=ENTCOMPATENTHTML401[,stringencoding = ini_get(“default_charset”) [, bool $double_encode = TRUE ]]] )

& (& 符号) =============== &
" (双引号) =============== "
’ (单引号) =============== ’
< (小于号) =============== <

(大于号) =============== >
第二处过滤在 第17行 ,这里用了 filter_var 函数来过滤 nextSlide 变量,且用了 FILTER_VALIDATE_URL 过滤器来判断是否是一个合法的url,具体的 filter_var 定义如下:

filter_var : (PHP 5 >= 5.2.0, PHP 7)

功能 :使用特定的过滤器过滤一个变量

定义 :mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )

针对这两处的过滤,我们可以考虑使用 javascript伪协议 来绕过。为了让大家更好理解,请看下面的demo代码:
在这里插入图片描述我们使用 payload :?url=javascript://comment%250aalert(1) ,可以执行 alert 函数:
在这里插入图片描述
实际上,这里的 // 在JavaScript中表示单行注释,所以后面的内容均为注释,那为什么会执行 alert 函数呢?那是因为我们这里用了字符 %0a ,该字符为换行符,所以 alert 语句与注释符 // 就不在同一行,就能执行。当然,这里我们要对 % 百分号编码成 %25 ,因为程序将浏览器发来的payload:javascript://comment%250aalert(1) 先解码成: javascript://comment%0aalert(1) 存储在变量 $url 中(上图第二行代码),然后用户点击a标签链接就会触发 alert 函数。

实例分析
本次实例分析,我们选取的是 Anchor 0.9.2 版本,在该版本中,当用户访问一个不存在的URL链接时,程序会调用404模板,而这个模板则存在XSS漏洞,具体代码如下:
在这里插入图片描述
该代码在 themes\default\404.php 中,看第4行 code 标签中的 current_url 函数,我们可在 anchor\functions\helpers.php 文件中,看到 current_url 函数是由 Uri 类的 current 方法实现的,具体代码如下:

function current_url() {
return Uri::current();
}
我们跟进到 Uri 类,在 system\uri.php 文件中,我们发现这里调用了 static::detect 方法( statci:: 是在PHP5.3版本之后引入的延迟静态绑定写法)。在这里插入图片描述
在 current 方法下面,我们就可以找到 detect 方法,该方法会获取 S E R V E R 数 组 中 的 ′ R E Q U E S T U R I ′ 、 ′ P A T H I N F O ′ , 、 ′ O R I G P A T H I N F O ′ 三 个 键 的 值 ( 下 图 第 3 − 4 行 代 码 ) , 如 果 存 在 其 中 的 某 一 个 键 , 并 且 符 合 f i l t e r v a r ( _SERVER 数组中的 'REQUEST_URI' 、'PATH_INFO', 、'ORIG_PATH_INFO' 三个键的值(下图第3-4行代码),如果存在其中的某一个键,并且符合 filter_var( SERVERREQUESTURIPATHINFO,ORIGPATHINFO(34)filtervar(uri, FILTER_SANITIZE_URL) 和 parse_url($uri, PHP_URL_PATH) ,则直接将 $uri 传入 static::format 方法(下图第10-14行代码),具体代码如下:在这里插入图片描述
我们跟进 static::format 方法,可以发现程序过滤了三次(下图第3-7行),但是都没有针对XSS攻击进行过滤,只是为了获取用户访问的文件名,具体代码如下:
在这里插入图片描述
由于没有针对XSS攻击进行过滤,导致攻击十分容易,我们来看看XSS攻击具体是如何进行的。

漏洞利用
我们构造payload如下: http://localhost/anchor/index.php/ 部分会嵌入到 标签中,造成XSS攻击,效果图如下:
在这里插入图片描述
修复建议
这对XSS漏洞,我们最好就是过滤关键词,将特殊字符进行HTML实体编码替换,这里给出的修复代码为Dedecms中防御XSS的方法,大家可以在 uploads/include/helpers/filter.helper.php 路径下找到对应代码,具体防护代码如下:
在这里插入图片描述
结语
看完了上述分析,不知道大家是否对 filter_var 函数绕过有了更加深入的理解,文中用到的CMS可以从 这里 下载,当然文中若有不当之处,还望各位斧正。如果你对我们的项目感兴趣,欢迎发送邮件到 hongrisec@gmail.com 联系我们。 Day2 的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:

// index.php
<?php 
$url = $_GET['url'];
if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
    $site_info = parse_url($url);
    if(preg_match('/sec-redclub.com$/',$site_info['host'])){
        exec('curl "'.$site_info['host'].'"', $result);
        echo "<center><h1>You have curl {$site_info['host']} successfully!</h1></center>
              <center><textarea rows='20' cols='90'>"
;
        echo implode(' ', $result);
    }
    else{
        die("<center><h1>Error: Host not allowed</h1></center>");
    }

}
else{
    echo "<center><h1>Just curl sec-redclub.com!</h1></center><br>
          <center><h3>For example:?url=http://sec-redclub.com</h3></center>"
;
}

?>
// f1agi3hEre.php
<?php  
$flag = "HRCTF{f1lt3r_var_1s_s0_c00l}"
?>
题解我们会阶段性放出,如果大家有什么好的解法,可以在文章底下留言,祝大家玩的愉快!

相关文章
Anchor CMS 0.9.2: XSS在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
web安全开发测试指南pdf红日安全是一本关于Web安全开发和测试的指南,由红日安全编写。这本指南主要旨在提供给开发人员和测试人员一些关于如何开发和测试安全的Web应用程序的实用技巧和建议。 这本指南首先介绍了Web应用程序的常见安全威胁和攻击技术,例如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)和SQL注入等。它详细解释了这些威胁和攻击技术的工作原理,并提供了一些防御措施和最佳实践,以帮助开发人员编写更加安全的代码。 指南还介绍了一些常用的Web安全测试工具和技术,包括漏洞扫描器、Web应用程序防火墙(WAF)和代码审计等。它解释了如何使用这些工具和技术来测试和评估Web应用程序的安全性,并提供了一些建议,以帮助测试人员发现和修复潜在的安全漏洞。 除了具体的技术和工具以外,指南还强调了开发团队和测试团队之间的合作和沟通的重要性。它鼓励开发人员和测试人员在整个开发过程中共同努力,共同关注Web应用程序的安全性,从而确保最终构建出安全可靠的Web应用程序。 总之,web安全开发测试指南pdf红日安全为开发人员和测试人员提供了一份实用的指南,帮助他们更好地了解和应对Web应用程序的安全性挑战。这本指南的出版对于促进Web应用程序的安全开发和测试具有积极的推动作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值