字符?正则?

开卷看题

源码审计题

代码分析

1
2
3
4
5
6
7
8
9
10
11
12
<?php
highlight_file('2.php'); // 显示2.php源码
$key='KEY{********************************}';

// 正则表达式匹配
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);

// 如果正则匹配到结果则输出key
if( $IM ) {
die('key is: '. $key);
}
?>

总结一下:当输入的参数满足正则要求时即可得到答案

精心设计

明白了代码原理之后接下来就是去构造一个符合正则的字符串

强烈推荐一个在线正则验证平台:传送门

将正则表达式拷贝到平台中

结合平台给出的高亮提示可以很清楚的看出正则的结构

先列举一下自定义助记符:

  • c:任意字符
  • cs:任意个数的任意字符
  • +:表示逻辑连接,实际不存在
  • lc:任意小写字母
  • sc:任意特殊字符

key + c + key + 4到7个c + key: + /c/ + cs + key + lc + sc

给出一个我构造的:keykey1234key:/z/keyz@(给是给了,对不对不知道)

拿着我构造的表达式提交一下

嗯???哦,我知道了,再试一下

YES,拿下key

课后问答

Q:为什么要在index提交而不是2.php

Q:为什么要弄出来一个2.php