WP027——CTF赛题解析-字符?正则?

65 阅读1分钟

时效性

2025年8月15日

题目来源

ctf.bugku.com/challenges/…

题目描述

image.png

<?php 
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
#其结构非常简单,就是找到一个能够匹配上对应的正则表达式的字符就行
if( $IM ){ 
  die('key is: '.$key);
}
?>

WriteUp

表达式分解(不区分大小写):

  1. key:匹配字符串 "key"
  2. .*:匹配任意字符(除换行符)0次或多次
  3. key:再次匹配 "key"
  4. .{4,7}:匹配任意字符4到7次
  5. key:\/.\/:匹配 "key:/X/"(X为任意单个字符)
  6. (.*key):匹配任意字符0次或多次后跟 "key"
  7. [a-z]:匹配一个小写字母
  8. [[:punct:]]:匹配一个标点符号(如!, ., ?等)

构造步骤:

  1. 开头部分:以 key 开头,后跟任意内容(如123),再跟 key。 → 示例:key123key
  2. 中间部分:添加4到7个任意字符(如aaaa),然后加上 key:/X/X为任意字符,如b)。 → 示例:aaaakey:/b/
  3. 结尾部分:添加任意内容(如test),后跟 key、一个小写字母(如x)和一个标点符号(如.)。 → 示例:testkeyx.

最终构造的Payload:

id=key123keyaaaakey:/b/testkeyx.

image.png