[WAF攻防]从WAF攻防角度重看sql注入
从WAF攻防角度重看sql注入
攻防都是在对抗中逐步提升的,所以如果想攻,且攻得明白,就必须对防有深刻的了解
sql注入的大体流程
- Fuzz测试找到注入点
- 对注入点进行过滤检测,及WAF绕过
- 构建payload,对数据库进行脱裤,甚至getshell
sql注入流程分析
- sql注入,最初没有防护的时候,就只要能成功拼接sql语句,就可以进行sql注入

- 先对注入点进行判断,是字符型还是整型。
对于整型一般是直接拼接sql,而对于字符型的一般是先要闭合掉单引号,或者双引号,还有一种存在利用逻辑漏洞闭合sql语句的,等下一起分析了
所以这里先通过加 " ' 进行判断,得出是字符型注入。
引号闭合方式:1. 利用注释符 mysql中一般用的是--+和#,不过如果是GET传参,需要将#先进行URL编码,不然会被当作url中的hash结构,--+中的+是随意的,只要--后跟一个字符就可以,如果利用的是GET传参,也需要将空格进行url编码,不然会被浏览器自动剔除最末 尾空白符的操作给疑惑到,一般用-- -更方便,反正最后一个-也会被当作sql注释后的内容
2. 利用逻辑,例如 id=' or {payload} or '1'='1 这样的话最后拼接到数据库中就是select * from user where id='$id'>select * from user where id='' or {payload} or '1'='1';从而完成引号闭合 3 其他:利用逻辑将'转义 select * from user where id='$username' and pass='$password';>select * from user where id='asdasd' and pass=' or 1=1#';在这里,由于第二个引号被转义,所以第一个引号和第三个引号和中间字符组成一个字符串,也就是id最终是{ asdasd' and pass= },最终得以绕过
防护1:1. 对于整形数据,php中可以用intval()将输入流先进行转换 2.对于字符型参数,可以用合理利用addslashes()对其中的单引号和双引号进行转义,合理是要求对任何进入程序的输入流都进行先转义,包括数据库,防止二次注入 3.合理利用编码,防止编码注入
- 确认注入点后,确定字段数

确定字段数为3
- 开始构造payload
- id=0' union select 1,2,3--+
确认回显位置为2,3参数的位置 - id=0' union select 1,database(),3--+
获取数据库名 - id=0' union select 1,database(),(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())--+
利用group_concat一下获取该数据库中的所有的表,当然也可以利用limit一个个来,这里最好限定下库名,防止其他库中也有同名的表 - id=0' union select 1,(select group_concat(username) from users),(select group_concat(password) from users)--+
最终成功获取同表中的所有数据

- id=0' union select 1,2,3--+
如果想获取其他表或者其他库中的文件,修改下参数即可,其他库中的表 {库名.表名},而用户都放在mysql数据库中,如果有权限可以任意篡改,甚至还可以写shell,操作多多。
防护2:过滤关键字,如select|information|table|column|from|union等,但黑名单总是存在被绕过的可能
猜想:可不可以利用mysql支持hex编码,先将sql写入到文件,再执行?
sql注入防护-采用预编译
从上面的流程可以看出,最基本的防护就是采用黑名单模式过滤关键字符或字符串,但黑名单往往随着sql语法的支持增加,黑名单的效果会下降。
预编译其实是先通过了编译,建立了AST语法树,所以后续的操作只是像空格中填充东西而不影响句子的执行结构。
用了预编译就一定安全了嘛?你真的会用预编译嘛?
- 错误顺序导致无效的预编译
$query = "select balabala from table1 where 1=$_GET[‘id’]";
$row = $db->prepare($query);
$row->execute();
可以看到在这里,先把变量拼接到sql语句,再进行预编译是无效的,这样对应的恶意语法树还是解析了
- 模拟预编译导致的宽字节注入

PDO中有一个PDO::ATTR_EMULATE_PREPARES配置,用来控制是模拟预编译,其实就是对sql的特殊字符进行了转义
如果该数据的编码是GBK的话,就有可能造成sql的宽字节注入
其实这里我也没明白为什么会搞一个模拟预编译,为了性能?
- 支持多行代码执行的预编译导致的sql注入(没有过滤分号)
Set @x=0x31
Prepare a from “select balabala from table1 where 1=?”
Execute a using @x
由于sql中默认支持hex编码,所以将目标代码进行hex编码绕过检测,然后就可以在预编译时期造成sql执行。
对于动态代码,或支持动态代码的操作或者函数一定要小心。动态代码字符串就可以利用奇奇怪怪的编码造成千人千面的效果,在终点再转换为争取的代码执行,以此来绕过防护
sql注入绕WAF
其实上面说的那么多,很多就是软件WAF的工作原理。
所以这里绕过WAF,也就相当于是对上面的总结。
WAF检测关键字符串和关键字符
对于关键字符串,一般采用替代的方法,sql中有很多不为人知的用法,例如limit 1,1 如果对逗号进行了绕过还可以采用 limit 1 offset 1,如果对limit进行了限制,还可以用from to来,前提是对sql语法足够熟悉。而对于空格,一般直接用Fuzz测试即可过滤了关键的库名
例如上面用的information库,其实sys中的某些表或视图也保存了相关的表名和字段名,也就可以用来做替换利用WAF检测点来绕过
例如某WAF只对GET请求的参数进行了sql检测,而同时后端用的是$_REQUEST来获取参数,这个时候就可以用POST进行绕过,应该$_REQUEST可以也可以获取POST参数,但WAF不会对POST参数进行检测利用WAF的多重解码,进行编码注入
有些WAF为了防止编码注入,会先检测一部分,然后对输入流进行解码,再检测另一部分,利用解码,可以绕过第一部分的恶意字符。除非是对解码前后都进行了相同的完全的过滤。但这样处理编码,无异于对性能是个巨大的浪费。利用WAF只检测部分数据
有些WAF为了性能,不可能对全部的数据进行检测,例如上传一个大的文件,不可能对文件进行全面检测,所以往往只检测前几十个字节,而我们可以把恶意数据放在检测区间的后面,来绕过检测。HTTP协议兼容性:HTTP Body多样性
HPP参数污染
HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染。
在ASPX中,有一个比较特殊的HPP特性,当GET/POST/COOKIE同时提交的参数id,服务端接收参数id的顺序GET,POST,COOKIE,中间通过逗号链接,于是就有了这个idea。
这些都是应对于软件WAF的,还有云WAF和硬件WAF,回头再说
[WAF攻防]从WAF攻防角度重看sql注入的更多相关文章
- 20169214 2016-2017-2 《网络攻防实践》第十一周实验 SQL注入
20169214 2016-2017-2 <网络攻防实践>SQL注入实验 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表 ...
- 《网络攻防》 第十二周作业 SQL注入
SQL注入实践 1.打开seed虚拟机,使用命令sudo service apache2 start启动apache,发现一条提示,意思就是不能可靠地确定域名,如图 即使右下角标着OK,但我还是不放心 ...
- sql注入攻防 以php+mysql为例
随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列.但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上 ...
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
- 【转载】SQL注入攻防入门详解
滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园 首页 博问 闪存 联系 订阅 管理 随笔-58 评论-2028 文章-5 trackbacks-0 站长 ...
- [红日安全]Web安全Day1 - SQL注入实战攻防
本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- 深入了解SQL注入绕过waf和过滤机制
知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...
随机推荐
- 谷歌protobuf(protocol-buffers)各种开发语言数据类型转换说明
官方文档:https://developers.google.cn/protocol-buffers/docs/proto proto2 proto3
- 安装选择msi格式还是zip(windows下Nodejs zip版下载安装及环境变量配置)
安装选择msi格式还是zip((windows下Nodejs zip版下载安装及环境变量配置)) -----以node.js 安装为例: 1,外观对比: ✿ 简单介绍一下node的作用: • node ...
- HDZ城市行深圳站|AIoT时代,如何抓住智联生活的战略机会点?
摘要:2021年12月24日,HDZ城市行深圳站:AIoT引爆全场景应用新机会(智联生活专场)圆满落幕. 2021年12月24日,HDZ城市行深圳站:AIoT引爆全场景应用新机会(智联生活专场)圆满落 ...
- 深入理解Akka Actor模型
Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语". Actor是异步驱动,可以并行和分布式部署及运 ...
- 【LeetCode】1181. Before and After Puzzle 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 保存首尾字符串 日期 题目地址:https://lee ...
- 【LeetCode】934. Shortest Bridge 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS + BFS 相似题目 参考资料 日期 题目地 ...
- wordpress中遇到的问题
在博客园申请了账号,也已经开始写了两篇内容,但还是想要有属于自己的小站.于是将域名续费了几年,又在我之前买的vps上搭建了一个wordpress博客站点,这样以后我就可以同时发布到两个地方. 根据教程 ...
- 【JAVA今法修真】 第七章 洞天风云起,索引混乱平
您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...
- SOFA 数据透析
数据透传: 在 RPC调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以,在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息.业务方可能希望,在 ...
- 使用.NET 6开发TodoList应用(11)——使用FluentValidation和MediatR实现接口请求验证
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在响应请求处理的过程中,我们经常需要对请求参数的合法性进行校验,如果参数不合法,将不继续进行业务逻辑的处理.我们当然可以将每个 ...