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. cglib动态新增类方法

    <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> & ...

  2. MySql触发器语法总结

    经过昨天多次失败,今天终于将我要实现的触发器功能写成功了,触发器代码如下: -- use dbfortest; drop trigger if exists tg_before_insert_on_d ...

  3. iOS 微信支付总结

    1.支付流程 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择 ...

  4. 51nod1183(Edit Distance)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 题意:中文题啦- 思路:dp 用dp[i][j]表示从 ...

  5. python之线程进程协成

    线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...

  6. 如何配置pch文件

    pre-Compile Header(预编译头文件) pre-Compile Header简称PCH,由编译器在建立工程时自动生成; 其中存放有工程中已经编译的部分代码; 在以后建立工程时不再重新编译 ...

  7. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  8. python ImportError: No module named builtins

    解决方案: sudo pip install future

  9. RHEL6.5安装11.2.0.3 RAC并打补丁

    [TOC] 一,主机配置 1.修改hosts文件(两节点) #127.0.0.1 localhost localhost.localdomain localhost4 localhost4.local ...

  10. Redis到底该如何利用(三)?

    上两篇受益匪浅,秉着趁热打铁,不挖到最深不罢休的精神,我决定追加这篇.上一篇里最后我有提到实现分级缓存管理应该是个可行的方案,因此今天特别实践了一下.不过缓存分级之后也发现了一些问题,例如下图: 当a ...