PHP 语言特性与常见绕过机制及相关规则解析

数字与字符串

  • 十进制数字表示法: 数字类型0x十六进制0八进制0b二进制数字e数字都会 自动转化为 等值十进制值
  • 字符串内ascii转义: 双引号字符串中用 \x两位十六进制\三位八进制转义字符 可代表对应ascii码的字符
  • 自动转换截取: 当字符串参与计算或 与数字/纯数字字符串 进行判断时, 会将字符串截取为数字 (如'123a'==123 '123a'>12 '0x00'=='0',但'123a'!=='123b' '123a'!===123不是所以不相等) 系统会从开头开始截取数字 (开头若为空白符会跳过空白符), 直到遇到字符串或第二个小数点
  • 纯数字字符串: 若一直截到字符串结束, 则为纯数字字符串 php<7时, 截取的格式包括 数字e数字 0x十六进制 0八进制 0b二进制 以及在数字前的+与-php>=7时, 截取的格式只有 数字e数字 以及在数字前的+与-若运用格式, 可不截取到结束(因有特殊字符结束截取), 但并不为纯数字字符串 数字e数字前面数字不能有字符, 而后面数字有字符会结束截取
  • (int)转化: 与自动转换截取相同 不同: php<7时, int不识别截取的格式, php>=7时, 识别数字e数字 以及在数字前的+与-

变量覆盖

  • $$变量覆盖: 当$$变量名变量名可控时, 则可操控任意变量, 只需将变量名改为对应名称
  • parse_str: 将以 url查询字符串格式的字符串解析为变量并设置到当前作用域 (有result参数则存在该数组, 且该数组原内容会被覆盖, string中空格必须转换为+)
  • extract: 从数组中将变量导入到当前的符号表

报错停止执行

  • Fatal报错截断执行: 当报错Fatal时, 这行代码前的执行, 这行代码后的不执行 发生: 结尾没分号 或 语法错误
  • Parse报错不执行: 当报错Parse时, 所有代码不执行 发生: 执行不存在的函数与类
  • 代码执行函数: 在代码执行函数里的代码, 也遵循这样的规则, 但在代码执行函数中的报错Fatal和Parse, 在函数内部遵循上述规则, 但在函数外部的效果都与Fatal相同

索引

  • 在php<8时, 数组索引为字符串时, 使用索引可不使用引号包围 如 $a[a]=1;(其中php为7.4时会warning,但仍可正常执行)
  • 在php>=8时, 数组索引为字符串时, 使用索引必须有引号, 不然会报错 $a['a']=1;

传参参数名替换

  • 特性: 参数名种出现空格时, 会自动将其替换为_
  • 绕过(php<8): 如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号[出现在前面,那么中括号[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_

$_REQUEST绕过

  • 特性: 当$_REQUEST在同时接收GET和POST参数时,POST优先级更高, 会覆盖掉同名GET参数

MD5相等绕过

  • 0e绕过(弱相等)**原理**: 若两边经MD5加密后的值为0exxx形式, 会被当作科学计数法, 而且结果为零,都是相等的
MD5加密后0e开头: QNKCDZO,240610708,s878926199a,s155964671a,s214587387a,s214587387a
sha1加密后0e开头: aaroZmOk aaK1STfY aaO8zKZF aa3OFF9m 0e1290633704 10932435112
双重MD5加密后0e开头: 7r4lGXCH2Ksu2JNT3BYM CbDLytmyGm2xQyaLNhWn 770hQgrBOjrcqftrlaZk
0e开头字符串加密后0e开头: 0e215962017
  • 数组绕过(强相等)(php<8) 原理: md5()与sha1()无法处理数组, 若传入的为数组, 会返回NULL, NULL===NULL
  • NAN绕过(强相等) 原理: NAN与任何数据类型(除了true)做强/弱比较均为false, 包括和NAN比较, 而md5(NAN)为一固定值 利用: 当可以构造NAN时, 即可绕过

正则

  • 修饰符i: 忽略大小写 m: 多行模式, $与^匹配每一行的行尾与行首, 而非整个字符串的尾部与首部 (只识别%0a,而不识别%0d) s: 点号匹配所有字符 x: 忽略空白字符 u: UTF-8模式 A: 强制从目标字符串开头匹配 D: 美元符号仅匹配字符串结尾

相等

  • 弱相等
    1. false 与 true 字符串中 � 和 \ 和 空数组 空对象 与false弱相等, 其它任意字符串 数组 对象 与true弱相等 , if等判断语句中都是将表达式结果与true进行弱相等并根据结果执行
  • 强相等
    1. 强相等 不同进制 但代表值相同 的数(包括科学计数法)强项等, 但当在引号中, 因为不会自动转化为数字, 所以不强相等(但弱相等)

感叹号

  • !null为true, 所以若函数返回值不为bool, 一般函数使用失败时(warning)时返回值为null或false, 若在函数前加上!, 则会变为1
  • !0 ![] !{}等空数据 为true

OR与|| AND与&&

  • 特性: or与and 的优先级 低于 ||与&&, 且or与and的 优先级低于 赋值= 符号

其它

  • php中类名对大小写不敏感
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇