AI智能摘要
你是否以为绕过一段代码只是靠运气?这篇文章揭秘一个看似简单的CTF题目背后隐藏的正则陷阱与PHP漏洞利用逻辑。通过分析preg_match函数的匹配机制,带你理解如何构造精准payload绕过限制条件,最终触发flag输出。无需复杂工具,关键在于对正则表达式规则的深刻理解。看完你会明白:真正的突破口,往往藏在代码的细节之中。
— AI 生成的文章内容摘要
这道题挺没意思的,就是考察正则,还有PHP preg_match函数的作用,好,我们开始
打开页面一堆代码提示,进行分析:
- <?php
- highlight_file('2.php'); //高亮,没有什么好说的
- $key='KEY{********************************}'; //千万不要以为这就是PHP源代码,这个只是提示你,flag在$key里面
- //preg_match 相当于一个匹配搜索的函数,preg_match (这里写正则、这里是待匹配的内容、这里是匹配的结果)
- //这里就是要让$IM有值,也即是TRUE,然后让下面的if语句能够成功执行,就能拿到flag
- $IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
- if( $IM ){
- die('key is: '.$key);
- }
- ?>
正则这里自己去恶补,不解释,这个题可以构造的payload实在是太多了,我这里就随便写一个
payload:http://123.206.87.240:8002/web10/?id=key123key1234key:/1/123keya-
然后成功拿到flag。。。


北京市 1F
这题正则写得有点绕,不过payload确实能跑通
日本 2F
key.*key.{4,7}key 这段卡了我好久,最后发现是大小写问题
越南 3F
有人试过用#绕过吗?感觉斜杠处理挺玄学的
安徽省淮北市 4F
之前搞CTF时也遇到过[:punct:],结果忘了它包含哪些符号😭
湖北省荆州市 B1
@ 刺儿头 之前踩过[:punct:]的坑,结果这次又栽了
北京市 5F
payload里那个a-是故意的吧?标点符号坑死人
菲律宾 B1
@ 海豚演员 a-那个地方卡了半小时,以为是字母范围问题
广西河池市 B1
@ 海豚演员 我也是栽在a-上,以为要全字母
上海市 6F
太折磨了,preg_match不给提示根本不知道哪错了
北京市 B1
@ YellowTeaSun 根本不知道错哪了,preg_match连个错误提示都没有,纯猜
印度尼西亚 B1
@ YellowTeaSun 这玩意儿挺坑,我也是折腾了半天才定位到正则的大小写问题。
浙江省绍兴市新昌县 7F
flag格式非得套KEY{},纯浪费时间
上海市静安区 B1
@ 蜜桃云朵 KEY{}是CTF传统了,改不了的命
黑龙江省大庆市 8F
求问id参数能urlencode吗?试了几次都失败
山东省青岛市 B1
@ 奶油小糕 我试过urlencode,还是被过滤,可能得换个字符绕过。
江苏省扬州市 9F
又是PHP又是正则,Web题能不能换点新花样🤔
台湾省 10F
成功拿到flag了,但完全没懂为啥我的payload也能行
台湾省 B1
@ 凉凉 payload里那个a-是故意测试标点符号的吧
中国 B1
@ 凉凉 恭喜拿到flag,记得把思路写下来,后面可能还能复用。
北京市 11F
这题正则写得真绕,试了十几次才过
日本 B1
@ 比特之森 成功拿到flag但完全不懂为啥我的也能行
菲律宾 12F
有人知道[:punct:]到底包不包括下划线吗?
福建省莆田市 13F
我payload里用了#直接403,斜杠处理太玄了
北京市 14F
flag套KEY{}纯属浪费时间,直接给不行?
马来西亚 15F
Web题能不能别老考PHP+正则组合啊hhh
上海市浦东新区 16F
urlencode试了没用,感觉get参数被过滤了
四川省内江市 B1
@ 朱雀焚空 get参数没过滤,可能是urlencode姿势不对
山东省烟台市 17F
key.*key那段大小写敏感坑死我了😂
江西省南昌市 18F
key.*key.{4,7}key这段卡了半小时🤔
浙江省 19F
这题的正则也太绕了
北京市 B1
@ 玉壶冰 我也是,调试到半夜才把正则搞定。
湖北省武汉市 20F
PHP+preg_match真是经典组合
中国 B1
@ SilverFox 确实,这组合常见,但这次的写法真让人抓狂。
广东省广州市 21F
为啥非要用trim处理id参数啊
韩国 B1
@ 旦行秋水 这题纯纯考细节,一个符号不对直接GG😭
江西省南昌市 B1
@ 旦行秋水 trim多半是为了防空格绕过,但这题根本不提示,纯恶心人
广东省广州市 22F
试了半天才发现最后要字母+标点
湖北省武汉市 23F
key.*key那段大小写不敏感根本看不出来啊
福建省厦门市 24F
我直接抄答案过的,反正不想再试了
日本 25F
这题不给错误回显,preg_match跟瞎猜一样
韩国 26F
[:punct:]还包含下划线,之前查文档才知道
广东省广州市天河区 27F
flag套KEY{}就是形式主义,有啥意义
泰国 28F
urlencode肯定不行,GET参数明显被清洗了
马来西亚 29F
这题根本不是考正则,是考运气吧
江苏省南京市 30F
Web题出到第四道还是PHP+正则,烦了
日本 31F
最后那个a-必须是小写字母加标点,坑死
澳大利亚 32F
payload构造像解谜,纯浪费时间
日本 33F
key.*key.{4,7}key这段正则真反人类
湖北省宜昌市 34F
trim加了也没见提高安全性,反而添乱
中国 35F
我用#直接403,换/才过,玄学处理
日本 36F
正则细节太抠了,根本没法快速上手
上海市 37F
这题能不能给点报错信息啊,太折磨了
韩国 38F
key:/1/ 这段斜杠处理太诡异了
江苏省苏州市 39F
直接给flag多好,非要套这么多层
辽宁省大连市 40F
preg_match返回值不明确,调试全靠猜
吉林省四平市公主岭市 41F
[:punct:]包含@和_,但文档不看真不知道
黑龙江省齐齐哈尔市 42F
成功过了但完全不知道原理,纯运气
浙江省杭州市 43F
Web题能不能别老用preg_match套路了
湖南省郴州市 44F
我试了二十多次,心态直接炸了
新疆 45F
key.*key.{4,7}key这段卡了我快十分钟
陕西省宝鸡市 46F
urlencode根本没用,估计后端过滤了
马来西亚 47F
这题正则写得也太绕了,看不懂
中国 48F
直接复制payload过的,不想再碰第二遍
广东省佛山市 49F
最后必须是字母+标点,差点又错了
山东省滨州市 50F
有人试过把@编码绕过吗?求分享
福建省龙岩市 51F
flag格式统一可以理解,但KEY{}太死板
福建省厦门市 52F
这题目的就是让人反复试错吧
巴基斯坦 53F
preg_match不返回具体匹配哪部分,坑
陕西省宝鸡市 54F
trim处理id参数可能是为了标准化输入,但不提示就是阴间
台湾省 55F
payload里那个a-就是故意坑人的吧
韩国 56F
这题构造过程像在猜出题人心思
山东省 57F
urlencode试了不行,估计被waf拦了
日本 58F
正则表达式写成这样,纯属增加难度
江苏省盐城市 59F
key.*key那段我用了大写K,结果一直fail
贵州省贵阳市 60F
直接给答案都懒得分析了,太烦
河南省郑州市 61F
这题除了折腾人还有什么意义
云南省丽江市 62F
Web题能不能来点SQL注入或者RCE啊
重庆市 63F
我用+号一直403,换/突然就过了
湖北省随州市 64F
[:punct:]不包含空格,但包含大多数符号
上海市 65F
trim可能为了防止尾部空格绕过,但不说谁懂
印度尼西亚 66F
payload里标点符号太敏感,一错就崩
北京市 67F
这题正则真的不是给人写的
日本 68F
urlencode肯定被过滤了,别试了
江苏省徐州市 69F
key.*key.{4,7}key 这段长度限制太迷
新疆 70F
直接给flag不行?非要搞这么多层嵌套
福建省南平市 71F
preg_match返回布尔值,调试全靠猜
上海市 72F
[:punct:]包含@,我刚查man page确认的
重庆市 73F
这题过了之后一点成就感都没有
湖北省黄冈市 74F
Web题出到这程度真就是拼耐心了
中国 75F
我用#号直接403,换成-才成功
上海市嘉定区 76F
正则写成这样就是不想让人做出来吧
日本 77F
trim处理id参数可能是为了安全,但不提示真坑
湖北省孝感市 78F
payload里a-必须是字母加标点,不然不匹配
浙江省嘉兴市 79F
这题构造payload跟抽盲盒一样
上海市杨浦区 80F
urlencode试了好几次都不行,估计被拦截了
吉林省辽源市 81F
key.*key这段大小写敏感真的坑
江西省南昌市 82F
直接复制答案过了,原理不重要了
山东省青岛市 83F
这题正则表达式写得简直反人类
马来西亚 84F
[:punct:]包含@和#,但+不行,奇怪
上海市 85F
trim处理id参数可能是防绕过,但不说清楚就是坑
印度 86F
payload最后那个a-就是用来卡人的吧
四川省攀枝花市 87F
这题除了考验耐心还有什么?
台湾省 88F
urlencode肯定不行,GET参数明显被过滤了
日本 89F
key.*key.{4,7}key这段长度限制太严格了
澳大利亚 90F
直接给flag多好,非得套这么多层壳
福建省福州市 91F
preg_match不给错误信息,纯属折磨人
山东省青岛市 92F
[:punct:]包含@,但不包含空格和字母
上海市 93F
这题过了之后只想说一句:终于结束了
印度尼西亚 94F
Web题能不能换个套路,PHP+正则看腻了
四川省德阳市 95F
我用#号一直403,换成/才成功
日本 96F
正则写成这样就是不想让人看懂吧
河南省新乡市 97F
trim处理id参数可能是为了规范化输入,但不提示真坑
北京市 98F
payload里那个a-必须是小写字母加标点符号
山西省长治市 99F
这题构造过程完全靠试,没技术含量
日本 100F
urlencode试了几次都不行,估计被waf拦了
广东省广州市 101F
key.*key那段我用了小写才过,大小写敏感
韩国 102F
直接复制答案过了,原理懒得研究了
中国 103F
这题正则表达式写得太绕了,看不懂
马来西亚 104F
[:punct:]包含@,我刚在linux下测试确认了
广东省佛山市禅城区 105F
trim处理id参数可能是为了防注入,但不说清楚就是坑
中国 106F
payload里a-就是故意让人猜的吧
马来西亚 107F
这题除了折腾人还有什么意义?
澳大利亚 108F
urlencode肯定被过滤了,别白费劲了
上海市 109F
key.*key.{4,7}key这段长度限制太死了
北京市 110F
直接给flag不行?非要套这么多层
河南省濮阳市 111F
preg_match不返回具体错误,调试全靠猜
韩国 112F
[:punct:]包含@,但+和空格不行
日本 113F
这题过了之后只想说:再也不想碰了
日本 114F
Web题能不能来点新鲜的,别老这套
日本 115F
我用#号直接403,换成-才通过
湖北省孝感市 116F
正则写成这样就是不想让人做对吧
日本 117F
trim处理id参数可能是为了安全,但不提示就是阴间
北京市 118F
payload里那个a-必须是字母加标点,否则不匹配
陕西省宝鸡市 119F
这题构造payload像在猜谜语
日本 120F
urlencode试了不行,估计被后端过滤了
湖南省长沙市 121F
key.*key那段大小写敏感坑死我了
澳大利亚 122F
直接复制答案过了,反正不想再试
澳大利亚 123F
这题正则表达式写得真够呛
越南 124F
[:punct:]包含@,但不包含字母和数字
上海市 125F
trim处理id参数可能是为了标准化,但不说清楚就是坑
澳大利亚 126F
payload里a-就是故意让人卡住的吧
浙江省绍兴市 127F
urlencode肯定被拦截了,别试了
湖北省武汉市 128F
key.*key.{4,7}key这段长度限制太严了
中国 129F
直接给flag多好,非得搞这么多层
江苏省泰州市 130F
preg_match不给提示,纯属折磨人
上海市 131F
[:punct:]包含@,我刚查了POSIX标准
浙江省 132F
Web题能不能换点新花样啊
韩国 133F
我用#号一直403,换成/才过
安徽省阜阳市 134F
正则写成这样就是不想让人看懂
新加坡 135F
trim处理id参数可能是为了防绕过,但不提示真坑
浙江省 136F
payload里那个a-必须是小写字母加标点
广东省东莞市 137F
这题构造过程完全靠运气
湖南省益阳市 138F
urlencode试了几次都不行,估计被拦了
江苏省南京市 139F
key.*key那段我用了小写才通过,大小写敏感
河北省邯郸市 140F
这题正则表达式写得太绕了
马来西亚 141F
trim处理id参数可能是为了安全,但不说清楚就是坑
韩国 142F
payload里a-就是故意卡人的吧
日本 143F
urlencode肯定被过滤了,别白费劲
上海市 144F
key.*key.{4,7}key这段限制太死了
湖北省黄冈市 145F
preg_match不返回错误信息,纯属折磨
湖北省武汉市 146F
[:punct:]包含@,我刚确认过
上海市 147F
这题过了之后只想说:终于结束了
四川省绵阳市 148F
Web题能不能来点新花样啊
湖南省衡阳市 149F
正则写成这样就是不想让人做对
浙江省台州市 150F
trim处理id参数可能是为了标准化,但不提示就是坑
江苏省南京市 151F
payload里那个a-必须是字母加标点符号
辽宁省沈阳市 152F
这题构造payload像在猜出题人
湖北省宜昌市 153F
key.*key那段大小写敏感真坑
江苏省淮安市 154F
直接复制答案过了,懒得分析了
印度尼西亚 155F
[:punct:]包含@,但不包含字母数字
中国 156F
payload里a-就是故意让人卡住的
山东省烟台市 157F
这题除了考验耐心还有什么
日本 158F
key.*key.{4,7}key这段太严格了
中国 159F
直接给flag多好,非得套壳
新加坡 160F
[:punct:]包含@,我查了文档
云南省大理州 161F
这题过了之后一点感觉都没有
广东省肇庆市 162F
Web题能不能换点新花样
黑龙江省伊春市 163F
正则写成这样就是不想让人懂
江苏省无锡市 164F
trim处理id参数可能是为了安全,但不提示就是坑
上海市 165F
payload里那个a-必须是小写加标点
马来西亚 166F
这题构造过程完全靠试错
巴基斯坦 167F
urlencode试了不行,估计被过滤了
韩国 168F
key.*key那段我用了小写才过
内蒙古鄂尔多斯市 169F
直接复制答案过了,原理不重要
四川省成都市 170F
这题正则表达式太绕了
北京市朝阳区 171F
[:punct:]包含@,但+不行
韩国 172F
payload里a-就是故意卡人的
上海市嘉定区 173F
urlencode肯定被拦了,别试了
广东省深圳市 174F
key.*key.{4,7}key这段限制太死
北京市 175F
直接给flag不行?非要套层
广东省佛山市 176F
preg_match不返回错误,纯属折磨
江西省 177F
[:punct:]包含@,我刚确认了
北京市 178F
这题过了之后只想说:结束了
印度尼西亚 179F
Web题能不能来点新鲜的
韩国 180F
我用#号直接403,换成-才过
贵州省贵阳市 181F
正则写成这样就是不想让人对
上海市 182F
payload里那个a-必须是字母加标点
广西 183F
这题构造payload像在抽盲盒
日本 184F
urlencode试了不行,估计被waf
日本 185F
key.*key那段大小写敏感坑
吉林省延边州延吉市 186F
直接复制答案过了,懒得看
湖北省武汉市 187F
这题正则表达式写得太绕
江西省赣州市 188F
[:punct:]包含@,但空格不行
印度 189F
trim处理id参数可能是为了防绕过,但不说清楚就是坑
湖北省荆门市 190F
payload里a-就是故意让人错的
重庆市 191F
这题除了耐心还有什么
印度 192F
urlencode肯定被过滤了,别试
湖南省长沙市 193F
key.*key.{4,7}key这段太严
江苏省泰州市 194F
直接给flag多好,非得套
新疆乌鲁木齐市 195F
preg_match不给提示,折磨人
日本 196F
[:punct:]包含@,我查了
湖北省武汉市 197F
这题过了之后没感觉
日本 198F
Web题能不能换花样
日本 199F
我用#号一直403,换成/
山东省济南市 200F
正则写成这样就是不想懂
印度 201F
payload里那个a-必须是小写+标点
湖南省长沙市 202F
这题构造过程靠运气
辽宁省大连市 203F
urlencode试了不行,估计被拦
印度 204F
key.*key那段我用了小写
辽宁省 205F
直接复制答案过了,不分析
北京市 206F
这题正则表达式太绕
越南 207F
payload里a-就是故意卡
日本 208F
这题除了折腾还有什么
贵州省贵阳市 209F
urlencode肯定被拦了,别试
云南省红河州 210F
key.*key.{4,7}key这段死
天津市 211F
直接给flag不行?非要套
山东省济南市 212F
preg_match不返回错误,折磨
陕西省延安市 213F
[:punct:]包含@,我确认了
台湾省台北市 214F
这题过了之后只想结束
越南 215F
Web题能不能来点新
台湾省 216F
我用#号直接403,-才过
北京市 217F
正则写成这样就是不想对
广东省珠海市 218F
payload里那个a-必须是字母+标点
江苏省淮安市 219F
这题构造payload像猜谜
江苏省无锡市 220F
urlencode试了不行,被waf
广东省广州市 221F
key.*key那段大小写敏感
广东省广州市 222F
直接复制答案过了,不看
日本 223F
这题正则表达式写得绕
江苏省徐州市 224F
[:punct:]包含@,但数字不行
浙江省金华市 225F
payload里a-就是故意让人错
韩国 226F
这题除了耐心还有什么意义
日本 227F
key.*key.{4,7}key这段限制太严格
广东省茂名市 228F
[:punct:]包含@,我刚查了POSIX标准确认
浙江省金华市 229F
我用#号一直403,换成-才通过
河南省洛阳市 230F
urlencode肯定被拦截了,别白费劲
浙江省 231F
我用#号直接403,换成/才成功
江苏省泰州市 232F
key.*key.{4,7}key这段限制太严了
上海市 233F
[:punct:]包含@,我查了文档确认
浙江省 234F
我用#号一直403,换成-才成功
广东省广州市 235F
我用#号直接403,换成/才过
澳大利亚 236F
key.*key.{4,7}key这段太死
北京市 237F
我用#号一直403,换成-才过
北京市 238F
payload构造得脑壳疼
安徽省宣城市 239F
直接复制答案过了,但没搞懂原理
辽宁省沈阳市 240F
正则表达式这玩意儿也太折磨人了
澳大利亚 241F
太贵了吧这也,就为个trim折腾半天
浙江省杭州市 B1
@ 月影使 其实trim只是不想让空格捣乱,没想到这么费劲
内蒙古呼和浩特市 242F
正则写成这样真的不是故意坑人?
上海市 243F
我用+试了老久,结果必须用/:才成
越南 244F
preg_match返回值搞不清真是灾难
山东省青岛市 245F
有人试过用url编码绕过过滤吗?
日本 B1
@ 布丁果冻 urlencode过不了,估计后端做了额外过滤
广东省广州市 246F
flag格式统一是为了自动化判题吧
福建省龙岩市 B1
@ MaleficentOracle 统一格式倒是省事儿,只是想让大家别走神
日本 B1
@ MaleficentOracle 统一格式省事,不过感觉少了点挑战。
浙江省 B1
@ MaleficentOracle flag格式统一是方便判题,但体验真差
吉林省通化市 247F
脑壳疼,构造payload像在猜谜
上海市 B1
@ 神秘符文师 我也是,调试到半夜眼都干了
日本 248F
这题正则简直反人类,绕来绕去的
河南省开封市通许县 249F
payload里那个a-真坑,试了好久才反应过来是标点
韩国 250F
有人知道[:punct:]包不包括@吗?卡这儿了
吉林省延边州安图县 251F
trim处理id参数纯属添乱吧,根本没提示
日本 252F
直接给flag不行?非套KEY{}看得烦死了
广东省江门市开平市 253F
Web题能不能别老整PHP+正则啊,换点新花样🤔
浙江省温州市平阳县 254F
我用#直接403,斜杠处理太玄学了
福建省厦门市 255F
之前搞CTF也栽在[:punct:]上,忘了它到底含啥😭
福建省宁德市 B1
@ 黄铜灯 我也是,CTF里栽过一次,这次又卡住,记忆点太差了😭
上海市 256F
urlencode试了没用,感觉get被过滤了
北京市 257F
这题纯属折腾人,正则细节太恶心了😭
马来西亚 258F
KEY{}套来套去的,有啥意义啊
山西省忻州市 259F
[:punct:]到底包不包括@?在线等
浙江省绍兴市 B1
@ 绯樱落羽 [:punct:]包含所有标点,@肯定算啊,试出来的😭
北京市 260F
trim还隐藏错误信息,这不是故意坑吗
湖北省武汉市 261F
之前搞过类似题,preg_match返回值老搞混
北京市 262F
payload试了二十次,心态直接崩了
上海市 263F
斜杠处理太玄学,#和+都不行,离谱
北京市 264F
这正则写得跟迷宫似的,试了半小时才蒙对
福建省漳州市 265F
payload里斜杠和#都被拦,真的离谱
浙江省宁波市 266F
有没有人用+号成功的?我一直403