1. 避开输入过滤

输入过滤存在于外部和内部,外部属于web应用防火墙WAF,入侵防御系统IPS,入侵检测系统IDS,内部属于代码中对输入进行过滤

过滤select,insert等sql关键字和' |,等字符

(1)大小写变种:将关键字变为SeLeCt * FrOm UserINFO   由于过滤是针对全大写或者全小写,很少会对大小写做排列组合进行过滤。若单个过滤则会影响用户正常输入。

(2)使用sql注释:php中使用stristr('a','b')判断b在a中第一次出现并返回,通过

判断输入中是否含有关键字,且大小写不敏感且二进制安全。都紧跟空格进行检查

用/**/代替空格    用like代替=

(3)使用URL编码:URL编码是通过浏览器进行,不同浏览器的编码方式不同。IE11使用GB2312,firefox3.2使用UTF-8,解码却是根据服务器的编码模式进行解码,所以经常开发过程会出现中文未对其进行编码处理就会导致乱码问题,就是浏览器编码和服务器解码不一致问题。这样也会产生get和post的区别,get是由浏览器自动编码。但post是由请求头contentType中的charset决定编码模式,并告诉服务器应对应什么方式进行解码。所以在使用URL编码绕过sql过滤且进行get注入的时候要考虑浏览器的编码模式和服务器的解码模式,随便一个页面就能看出服务器的解码模式。JS的AJAX技术也是一样。escape就是针对GB2312的编码,URLencordCompontent是针对UTF-8的。

有的对于中文查询会在前段进行UTF-8编码再进行UTF-8(ISO-8859-1),在服务器端逆序解码。需要双URL编码。

原始注入:c' and if(current_user()='root@localhost',1,0)#ww

c'%2F%2A%2A%2Fand%2F%2A%2A%2Fif%28current_user%u0023%29%3D'root%40localhost'%2C1%2C0)%3B%23ww

(4)使用动态查询:SQLserver允许用exec('')的方式执行sql语句

exec ('select * from sysobjects')

滥用字符连接绕过sql过滤

exec('s'+'e'+'l'+'e'+'c'+'t'+'/**/*/**/f'+'r'+'o'+'m/**/s'+'y'+'s'+'o'+'b'+'j'+'e'+'c'+'t'+'s')

使用CHAR()构造单个字符,不需要引入任何引号。

sqlsever中可直接使用声明变量,赋值为0x的16进制进行

declare @query varchar(100)

set @query=0x73656C656374202A2066726F6D207379736F626A65637473

exec(@query)

(5)使用空字符:很多IDS或者WAF由C++等原生代码编写。对于空字符即是截断就会停止处理。

%00' UNION SELECT PASSWORD FROM TBLUSERS WHERE USERNAME='ADMIN'--

原生代码指的是直接能靠cpu执行的代码,不需要虚拟机沙箱等外部应用库提供支持。

(6)对于剥离字符串:第一次剥离后不会迭代过滤器,所以可以selselectect进行注入

2. 二阶sql注入

(1) 产生原因: 攻击者需要在第一次注入的时候将目标值或者有用的东西存储在数据库中。再通过第二次查询将目标值读取出来。

应用实例:在添加用户的时候将用户名设置为 '+substring(@@version,1,50)+'

数据库在插入语句则如下:insert into userinfo values (''+substring(@@version,1,50)+'','wwww');

这样就将版本信息插入进入了用户名字段,在随意查看用户名就知道了数据库版本号等信息。

重点考虑的是不同数据库的字符串连接符还闭合前后的引号,使得注入语句能被执行且保存在数据库中。

重点考虑的是用户名等信息在被处理的时候的具体处理方式,过滤还是剥离,或通过编码,大小写等方法一

一尝试

在用户名等插入过程中,常常将用户名设置为xxx' union select count(*),count(*) from xxx 等信息来进行二阶注入,在面对有输入过滤的情况下就进行绕过。

(2) 寻找二阶注入点:常用工具无法扫出,只能通过手工注入。

1. 寻找能被用户操作且存储的数据项

2. 检测非法字符注入的可行性

3. 试试用URL编码,大小写转换等技巧绕过输入过滤

4. 针对程序可能暴露出的敏感信息页面的收集

5. 开发代码验证SQL注入,先显后盲。

防御:所有对数据库提供的操作均使用参数化,对查询结果集结构进行固定。

3. 其他思路

(1) 使用混合攻击:使用跨站和sql注入混合攻击,若id是一个容易被注入的参数则有如下语句

id=123' union select 1,'<script>alert(1)</script>',1

(2) 使用验证过的通道:有的sql注入漏洞是需要利用管理员登陆后才有权限访问的点。所以可以先通过跨站点伪造请求。

(3) 使用ORACLE执行OS命令,通过双引号包含表名,包含恶意shell命令的表名的表则被成功创建。再通过SQL*Plus来执行的时候该脚本会去除引号,将!解析为UNIX命令,$则是windows,VMS。

高级sql注入的更多相关文章

  1. [转]高级SQL注入:混淆和绕过

    ############# [0×00] – 简介[0×01] – 过滤规避(Mysql)[0x01a] – 绕过函数和关键词的过滤[0x01b] – 绕过正则表达式过滤[0×02] – 常见绕过技术 ...

  2. WEB安全--高级sql注入,爆错注入,布尔盲注,时间盲注

    1.爆错注入 什么情况想能使用报错注入------------页面返回连接错误信息 常用函数 updatexml()if...floorextractvalue updatexml(,concat() ...

  3. SQL注入专题

    SQL注入专题--整理帖 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被 ...

  4. (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。

    原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...

  5. Sqli-labs 搭建SQL注入平台

    sqli-labs是一款学习sql注入的开源平台,共有75种不同类型的注入. 搭建步骤: 1.在Windows系统中安装WAMP 下载地址:https://pan.baidu.com/s/1HY0hF ...

  6. SQL注入攻击三部曲之高级篇

    SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...

  7. 【渗透攻防Web篇】SQL注入攻击高级

    前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 ...

  8. sql高级手工注入

    非常重要:首先在网站找到管理入口,否则,呵呵就算有用户名和密码,找不到入口,也是白玩.. 注入时,注意通过改变大小写.编码.转换等方式躲过系统检查,顺利执行语句!!! (一)数字型注入 正常步骤: 1 ...

  9. 深入理解SQL注入绕过WAF和过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

随机推荐

  1. 获取QQ缓存图片

  2. Hamilton四元数群的表示

    Hamilton四元数群$Q_8=\mathbb H=\{\pm e,\pm i,\pm j,\pm k\}$满足如下运算法则: $e$为单位元且同号得正.异号得负,此外$e=i^2=j^2=k^2, ...

  3. Restful API

    http://www.ruanyifeng.com/blog/2011/09/restful 参考资料:-------以网络为基础的应用软件的架构设计. Restful API的设计与实践 字数218 ...

  4. 深入理解Java:SimpleDateFormat安全的时间格式化

    这一篇我什么都不写,只推荐一篇大牛的博客,这篇博客给了我很多灵感,让我对多线程理解的更加透彻了; http://www.cnblogs.com/chenying99/articles/3331950. ...

  5. python学习 2数学公式

    递归 def fact(n): if n <= 1: return 1 else: return n * fact(n - 1) 斐波那契数列: 第0项是0,第1项是1,从第2项开始,每一项都等 ...

  6. 转:学习笔记:delphi多线程学识

    学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处 ...

  7. LeetCode 104. Maximum Depth of Binary Tree

    Problem: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along ...

  8. http错误代码含义中英文对照

    Http错误代码含义中文 概要当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字 ...

  9. 封装jdbc 单例模式的应用

    实现增删该查的jdbc封装 import java.io.IOException; import java.io.InputStream; import java.sql.Connection; im ...

  10. python 基础之数据类型

    一.python中的数据类型之列表 1.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 二.列表常用操作 >切片>追加>插入>修改& ...