Webshell免杀
PHP常见的一句话木马
1 |
|
assert与eval
eval() 不能作为函数名动态执行代码,官方说明如下:eval 是一个语言构造器而不是一个函数,不能被可变函数调用。可变函数即我们上面的第三个代码。
所以我们一般传入的是
1 | 1=assert&2 或者 1=system&2=whoami |
但是在php7之后,assert也和eval一样了,不能这样调用了。
绕过查杀软件
静态查杀,一般是寻找危险函数,然后通过回溯它的变量,如果存在POST
等可控的传入,就进行查杀。
那么如果要绕过查杀,就可以有两个思路
- 找查杀软件没有记录在内的危险函数
- 修改变量,进行加密混淆等。
命令执行函数
eval,assert目标太大,可以换一些命令执行函数使用
- shell_exec()
- system()
- exec()
- passthru()
- 反引号 (反引号底层还是调用shell_exec()函数。)
- pcntl_exec()
- proc_open()
同时也可以关注一些其他获取输入的函数
$_GET
$_POST
$_COOKIE
$_REQUEST
$_SERVER 其中的某些参数可控,如REQUEST_METHOD,QUERY_STRING,HTTP_USER_AGENT等
$_FILE
$GLOBALS
getallheaders()
get_defined_vars()
get_defined_functions()
还有一些匿名函数,动态调用函数,回调函数。
对于$GLOBALS,这是一个数组,所以这里再介绍三个函数
- current() - 返回数组中的当前元素的值。
- next() - 返回数组中下一个元素的值
- end() - 返回数组中的最后一个元素
例
1 |
|
1 |
|
1 |
|
1 |
|
函数别名
php内置的函数别名(PHP7.4.3)
1 | bzwrite->fwrite |
内置函数别名绕过
mb_ereg_replace ===> mbereg_replace
mb_ereg_ireplace ===> mbereg_ireplace
1 | <?php |
我们也可以自己写函数别名进行绕过,如下
1 |
|
监控as语法,回溯这些函数或类,寻找真实名字在进行判断是否为危险函数。
类的继承与动态调用
拼接,简单加密
- substr()
- strtr()
- substr_replace()
- str_rot13()
- base64_encode()
- strrev()
- urlencode()
- bin2hex()
- pack()
……
利用取反,异或,拼接,进制转换,加解密,字符反转等来进行绕过
1 |
|
利用注释符
ReflectionClass::getDocComment — 获取文档注释
1 |
|
利用文件名
利用文件名或者文件夹名
dirname() 返回文件名
$_SERVER[‘PHP_SELF’]
$_SERVER[‘REQUEST_URI’] 访问此页面所需url
$_SERVER[‘SCRIPT_FILENAME’] 当前执行脚本的绝对路径
1 | 文件名为system.php |
函数与类的嵌套调用
1 | // copy from https://xz.aliyun.com/t/5152 |
1 | // copy from https://xz.aliyun.com/t/5152 |
利用一些特殊符号
最常见的是插入null,\n,\t等。
1 |
|
还有一种比较骚的姿势在函数调用中是插入一些控制符[\x00-\x20],PHP引擎会忽略这些控制字符,正确执行PHP函数
1 |
|
最后,既然是🐎,伪装不仅需要骗过查杀工具,也要能骗的过安全人员,至少不能太明显,所以可以把🐎伪装成一个正常的功能,或者写一堆英文,让他以为是配置文件而忽略。