php特性

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

从而实现了绕过

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值