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. Git 小技巧

    分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修改 git rese ...

  2. xcode添加快捷代码块

    添加快捷代码块 在开发过程中,一些常用的代码段,我们可以设置成快捷代码段来快速实现代码的编写. 如上图中的属性的设置,它们都有相同重复的代码@property (nonatomic, strong), ...

  3. 正则-RegExp()构造函数

    上次写了js正则的字面量声明,今天说说RegExp()构造函数声明: var p=/cat/g;   //字面量声明var p=new RegExp('cat','g') //构造函数声明 它两所表达 ...

  4. Oracle入门基础

    使用SQLplus工具登录连接 开始->运行CMD-> C:\Users\Admininstrator> sqlplus 请输入用户名:sys@orcl as sysdba 输入口令 ...

  5. PHP 版本判断 version_compare() 函数

    在度娘中简单的找了下,判断当前PHP的版本是否高于某个版本,或者低于某个版本的方法 显示的结果基本上都是一样的,好吧,要不是我忘记了version_compare()这个函数我才不会去找度娘,果断找以 ...

  6. IIS与Apache共用80端口

    Windows server 2003服务器上安装有默认 IIS 6和Apache两个服务器,IIS运行的一个.net程序,apache运行php程序,现在想让它们同时都能通过80端口访问,设置起来还 ...

  7. SQL谜题(加减符号替代)

    问题:将以下字符串”.1.2.3.4.5.6.7.8.9 = 1“中的符号点(.)更改为符号加(+)或符号(-),有多少种方法?请用SQL解决此问题 计算过程: CREATE TABLE #(VAL ...

  8. asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)

    // 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...

  9. Maven仓库 国内镜像

    <repositories> <repository> <id>repo-mirror</id> <url>http://maven.net ...

  10. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...