一、原理
- 正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
- PHP中的相关函数:
preg_match_all();——匹配字符串中所有的符合正则表达式的字符串,返回匹配次数。
preg_replace();——将符合正则表达式的字符串转换成新的字符串。返回替换后的结果。
preg_match();——匹配字符串中所有的符合正则表达式的字符串,第一次匹配成功后返回。 - 要熟悉并掌握正则表达式的字符、关键字、限定符、修饰符。
二、作业
(一)题目
在靶场中,找到正则表达式题目,并得到题目中的flag
题目代码:
<?php
$key='flag{********************************}';
$Regular= preg_match("/zkaq.*key.{2,9}:\/.*\/(key*key)/i", trim($_GET["id"]), $match);
if( $Regular ){
die('key: '.$key);
}
(二)分析
- 题目最终目的是得到对应的flag。由
$key='flag{********************************}'
和die('key: '.$key);
; 可知我们可以通过控制程序,使程序运行die('key: '.$key);
,从而得到flag。 - 然后我们看到if语句的判定条件是 R e g u l a r , 因 此 , 需 要 控 制 程 序 使 得 Regular,因此,需要控制程序使得 Regular,因此,需要控制程序使得Regular为真。
- 分析
$Regular= preg_match("/zkaq.*key.{2,9}:\/.*\/(key*key)/i", trim($_GET["id"]), $match);
,若使 R e g u l a r 为 真 , 需 要 使 得 p r e g m a t c h 函 数 返 回 为 1 , 即 传 递 的 i d 参 数 ‘ t r i m ( Regular为真,需要使得preg_match函数返回为1,即传递的id参数`trim( Regular为真,需要使得pregmatch函数返回为1,即传递的id参数‘trim(_GET[“id”])中含有符合正则表达式
/zkaq.key.{2,9}😕./(key*key)/i`的子串。 - 分析
/zkaq.*key.{2,9}:\/.*\/(key*key)/i
,设计符合条件的id参数字符串。
- 修饰符
\i
规定匹配时不区分大小写; zkaq
是正常的字符,因此设计的id参数字符串中首先可以是zkaq
;.*
是匹配任意字符任意次,因此设计为空字符;key
为固定的字符串;.{2,9}
是匹配任意字符串2-9次,可以设计为yy
;:
为固定字符;\/
为转义匹配/
;(key*key)
是一个整体,前面匹配字符串ke
,后面匹配字符串key
,中间匹配任意次y,我们可以简单的设计为keykey
;- 经过上面分析,我们得出字符串
zkaqkeyyy://keykey
。
(三)结果
- 将页面URL中的id参数修改为设计好的字符串
zkaqkeyyy://keykey
,请求页面,我们就可以得到flag了。
将key对应的值提交,显示成功。