BugkuCTF-Web23-字符?正则?

    打开题目坏境,题目源码如下:

    1. <?php
    2. highlight_file('2.php');
    3. $key='flag{********************************}';
    4. $IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
    5. if( $IM ){
    6. die('key is: '.$key);
    7. }
    8. ?>

    构造id符合正则匹配即可获得key。

    解读这段正则表达式,含义如下:

    /key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
    ‘key’+任意单个字符+零个或多个+‘key’+任意单个字符+长度4-7+‘key:/’+任意单个字符+ / +(任意单个字符+零个或多个+‘key’)+英文小写字母一个+匹配‘!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.’中一个字符
    
    1.“key”是表达式直接写出来的字符串,直接利用即可 //?id=key
    2.“.”代表任意字符 //这里我们用a来充当任意字符 ?id=keya
    3.“*”匹配前面的表达式零次或多次,此时“*”前面是“key.”而“.”是字符,所以就是匹配key零次或多次 //这里我们匹配零次 //?id=keya
    4.“key”是表达式直接写出来的字符串,我们直接利用 //?id=keyakey
    5.“.”接下来又是点,我们还用a来充当 //?id=keyakeya
    6.“{4,7}”的意思就是匹配前面的字符4-7次,结合前面的“.”,就是匹配任意字符4-7次 //?id=keyakeyaaaa
    7.“key”是表达式直接写出来的字符串,我们直接利用 //?id=keyakeyaaaakey
    8.“:”也是表达式直接写出来的字符串,我们直接利用 //?id=keyakeyaaaakey:
    9.“\/”代表“/” //?id=keyakeyaaaakey:/
    10.“.”这个点我们还用a来充当 //?id=keyakeyaaaakey:/a
    11.“\/”代表“/” //?id=keyakeyaaaakey:/a/
    12.“(.*key)”这里我们输入key就行 //?id=keyakeyaaaakey:/a/key
    13.[a-z]代表a-z中的任意一个字符,这里我们继续用a //?id=keyakeyaaaakey:/a/keya
    14.[[:punct:]]代表任意一个字符,包括各种符号,输入标点符号即可,这里我们用个分号 //?id=keyakeyaaaakey:/a/keya; 
    15./i代表大小写不敏感
    

    构造poyload如下:

    keyakeyaaaakey:/a/keya.
    

    提交获得flag。

    BugkuCTF-Web23-字符?正则? - 图1