0X00
题目比较简单,就给出一段正则的代码:
$match = preg_match("/ket.*key.{4,7}:\/.\/(.*key)/i",trim($_GET['id']),$matchcon);
if($match){
echo $flag;
这个函数
知识补充:
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索subject与pattern给定的正则表达式的一个匹配.
参数
pattern
要搜索的模式,字符串类型。
subject
输入字符串。
matches
如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推
所以这道题目就是id用GET的形式赋值,然后匹配前面的那段正则表达式。
拿出前面的正则表达式进行分析:
/ket.*key.{4,7}:\/.\/(.*key)/i
正则知识补充:
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
ket.*key,它将会匹配最长的以ket开始,以key结束的字符串。这个随便构造ket1454key和ket1key一样的效果所以随便构造。只需要ket开头key结尾。
.{4,7}点号匹配任意字符,.{4,7}就是匹配任意字符4到7次可以是7777,jdijfh等等,随意。
:\/.\/ 前面转意所以加\中间有个点好也是匹配任意字符
(.*key)/i 这个比较明显就是key结尾就是,前面随便写i表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
所以构造patload:
?id=ket1key1111:/1/1key
?id=ket1ghtkey11rt11:/1/fg1key
答案不唯一有很多很多,随便构造!