1.preg_match(正则匹配函数)相关

定义: preg_match是一个计算机函数,功能是会被搜索的结果所填充,进行正则表达式匹配。并且只匹配一次,注意与preg_match_all区别。

利用 preg_match(),我们可以完成字符串的规则匹配。如果找到一个匹配,preg_match() 函数返回 1,否则返回 0。还有一个可选的第三参数可以让你把匹配的部分存在一个数组中。在验证数据时这个功能可以变得非常有用

基本语法

正则表达式在线测试工具:正则表达式在线测试 | 菜鸟工具

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

参数说明:

    $pattern: 要搜索的模式,字符串形式。

    $subject: 输入字符串。

    $matches: 可选,用来存放搜索结果,$matches[0]存放所有匹配的字符串,$matches[1]用来存放第一个匹配的字符串,$matches[2]用来存放第三个匹配的字符串,以此类推     $flags:flags 可以被设置为以下标记值:

        PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。

    offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。

(1)数组绕过

if(preg_match("/[0-9]/", $num)){

die("no no no!");

}

else(intval($num)){

echo $flag;

}

注:intval函数可可获取变量的整数值,常用于强制类型转换

要想得到flag,就要赋值num为数字,但是正则匹配又过滤了数字,想要绕过-可以采用数组绕过!

原理:preg_match第二个参数subject要求是字符串,如果传入数组时会返回false,则不会进入if语句

所以可以构造payload:num[]=2

(2)%0a换行符绕过

先来看一个正则表达式:preg_match(’/^gxngxngxn$/’)**

//^和$字符用来匹配字符串的开始和结束,也就是说这个表达式要求我们必须是'gxngxngxn'这个字符串开始和结束。

那么遇到类似的情况,就可以采用%0a换行符绕过。

看上述代码,需要我们传参gxn=gxngxngxn,但是又不能赋值gxngxngxn给gxn,这很明显是个矛盾,这就需要我们用%0a去绕过正则匹配。payload:gxn=gxngxngxn%0a

2.intval函数相关

第二个特性:

说明:当第一个参数为字符串时,第二个参数是指定第一个参数的进制,比如intval("12",5)就是把“12”当成5进制的数,然后把这个5进制的数转换成10进制整数,并返回。例: intval("12",5) = 7; (5进制的12=10进制7) intval("1011",2) = 11; (2进制的1011=10进制11)

(1)进制转换绕过

0b?? : 二进制 0??? : 八进制 0X?? : 十六进制

(2)科学计数法绕过

intval()int函数如果 base为0则var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中表示科学计数法(把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数))

3.MD5绕过相关

(1)php == 弱类型绕过

$a = $GET['a'];

$b = $_GET['b'];

if($a != $b && md5($a) == md5($b))

{

  echo flag;

}

两种方法:1.使用加密后‘oe’开头的字符串来绕过,应为以0e开头的字符串的值都为0。

例如

    QNKCDZO     240610708     byGcY     sonZ7y     aabg7XSs     aabC9RqS     s878926199a     s155964671a     s214587387a     s1091221200a

2.使用数组进行绕过,应为MD5不能加密数组,会报错,返回null,但是null=null返回的值为true

例如: a[]=1&b[]=2

(2)php === 强类型绕过

$a = $GET['a'];

$b = $_GET['b'];

if($a !== $b && md5($a) === md5($b))

{

  echo flag;

}

===会比较类型和值,所以不能用第一种方法来绕过,可以使用第二种方法,原理是相同的

(3)sql注入类的MD5绕过

ffifdyop经过MD5加密后变为'or'6xxx

sql代码:select * from flag where user='amdin' and password='or' '6xxx'  等于  password=''or true == ture

从而实现了绕过

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: