背景介绍
微软对SQL注入的介绍:
- 脚本注入式的攻击
- 恶意用户输入用来影响被执行的SQL脚本
SQL注入产生的直接原因是拼凑SQL,实质就是将恶意的SQL代码注入到特定字段用于实施拖库攻击等。
防御方式主要有三种:
- 字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
- 字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。
- 存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。
实验环境
服务器:win2003+DVWA IP地址:10.1.1.174
测试者:win7,IP地址随机
实验目的
通过该实验熟悉SQL注入的原理和基本利用方法。
实验步骤
步骤一
实验思路:
- 找注入并确认(经典的and 1=1 and1=2)
- 查询基本信息(数据库类型、数据库名、应用程序类型以及系统类型)
- 查表名、字段名,拿到想查询的内容
username:admin
password:password
low等级:User ID为1
时正常回显
low等级:User ID为1 and 1=1
时正常回显
low等级:User ID为1 and 1=2
时报错
这里直接返回了首页,和and 1=1返回的页面不一样,原理是把测试语句代入到了数据库查询,and就是逻辑运算,1=1为真,1=2为假,所以返回不同,要自己去理解。还有好多其他测试方法,这里不再讨论,先理解这两个就行。
根据上面的测试过程,最终要求你拿到数据库的用户名和密码。首先通过报错拿到数据库名等基本信息,然后是表名列名,再拿到数据库。第一步先得到字段数。
现在基本可以说这里存在注入点,下面就是一步一步拿到数据库。
步骤二
利用查询语句找出字段
low等级:User ID为1 order by 2#
时正常回显
low等级:User ID为1 order by 3#
时报错,说明只有两个字段。
由此, 字段数已经判断出来,下面如何进一步判断数据库名和用户名等基本信息。
利用语句查询知道有两个
字段,接着查询数据库名和用户。
查询数据库等基本信息。
UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version())
步骤三
如果是Mysql数据库,更多时候要用到它的系统函数,有时候可以达到事半功倍的效果。
查询表段:
union select 1,table_name from information_schema.tables where table_schema=0x64767761(数据库的十六进制)
查询列名。
union select 1,column_name from information_schema.columns where table_name=0x7573657273(表的十六进制) and table_schema=0x64767761(数据库的十六进制)
课后习题
【解析】数据存储目录
分析与思考
- 注入分为哪几种类型?分类依据是什么?是否唯一?
SQL注入的类型不唯一喔。
- 按注入位置
1、GET请求
2、POST请求
3、HTTP头
4、cookie - 按返回结果
1、time-based blind SQL injection
2、union query SQL injection
3、error-based SQL injection
4、boolean-based blind SQL injection
5、stacked queries SQL injection - 按参数类型
1、数字型注入
2、字符型注入
3、搜索型注入
-
普通注入和盲注的区别是什么?利用方法有什么不同?
SQL普通注入也可以叫SQL显错式注入,因为我们可以根据报错从而达到进入注入的正轨。
盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。 -
尝试自己做出以SQL注入为中心的头脑风暴图。
SQL注入导图