数据库相关概念
- 数据Data:在计算机系统中,各种字母、数字、符号的组合,语音、图形、图像等统称为数据
- 数据库Database:数据库是按照数据结构来组织、存储、管理数据的“仓库”
- 数据库管理系统DBMS::一类操纵和管理数据的软件,用于建立、使用、维护数据库。它能对数据库进行统一管理和控制,以保证数据库的安全性和完整性
典型:Access、MSSQL、Oracle、SQLite、MySQL等 - 结构化查询语句SQL:是一种数据库查询和程序设计语言,用于数据的增删改查
- SQL语言包含的六大部分
DQL数据查询语句,如:select * from tb_name;
DML数据操作语句,如:inset插入,update更新,delete删除 from tb_name where name=“user”
DCL数据控制语句,如:grant授权,revoke
DDL数据定义语句,如:create,drop
CCL指针控制语句,如:declare,cursor,fetch
TPL事务处理语句,如:commit,rollback
SQL注入相关概念
- 查询语句
Select * from tb_name;
- 插入语句
Insert into tb_name values(“name”,“password”,“phone”);
- 更新语句
Update tb_name set password="cj123456"where name=“chenj”;
- 删除语句
Delete from tb_name where name = “chenj”;
排序语句:order by 默认升序,但在SQL注入里面,用来判断表有多少列
联合查询:union
select * from tb1union all select * from tb2
- 静态页面 :html/htm,不需要服务器解析脚本
不依赖数据库
灵活性差,交互性差
安全,不存在sql注入漏洞 - 动态页面 :asp/php/jsp等,根据指令来生成静态网页
依赖数据库
灵活性好,维护简单,交互性好,功能强大
存在sql注入等安全风险
SQL注入简介
SQL注入介于客户端Browser向脚本引擎请求这一步。
注入就是把SQL命令插入到Web表单递交或域名或请求查询的字符串中,
最终达到欺骗服务器执行恶意命令。
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,
攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,
在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,
从而进一步得到相应的数据信息。
SQL注入作用
绕过登录验证 获取敏感数据 文件系统操作
注册表操作 执行系统命令
漏洞本质
代码与数据不区分
漏洞成因
服务器未对用户提交的参数数据进行校验和有效过滤,
直接进行SQL语句的拼接,改变原意,传进数据库解析引擎中执行
漏洞危害
包括但不限于 :敏感信息泄露 篡改网站内容 网页植入木马
数据库恶意操作 服务器远程控制
注入漏洞分类
按照注入点分类
- 数字型注入
http:www.example.com/12.php?id=1
类似这种结构,基于此种形式的注入构造出类似如下的sql注入语句进行爆破:
select * from 表名 where id1 and 1=1
http:www.example.com/12.php?id=1 and 1=1
- 字符型注入
http://xwww.example.com/users.php?user=admin
类似这种结构
SQL 语句原型大概为 select * from tb_name where user=‘admin’
构造出类似与如下的sql注入语句进行爆破:
select * from 表名 where user=‘admin’ and 1=1 ’
我们需要将这些烦人的引号给处理掉
SQL手动注入
基本步骤:
带猜测性质,考验经验
-
判断能否注入:通过url后加上 and 1=1,如果现实正常说明有漏洞
and 1=2会报错,那是因为1=2语句本身就报错的,但实际上这条语句还是成功执行了 -
爆字段长度:用order by + 数字 这个语句检测关键字id所在表有多少列
-
检测表存在:id=1 and exists(select * from admin),显示正常说明存在名为admin的表
-
检测字段存在:id=1 and exists(select username/password from admin),显示正常说明存在名为username/password的列
-
匹配字段(union 联合查询:id=1 and 1=2 union select 1,2,3,…,x 回显出错列,可能就是username/password
-
将回显的列替换成username/password 显示管理员账号密码
-
登录后台,一般为ip/admin 或者ip/login
SQL注入利用工具
1.测试连通性(ping)
2.使用sqlmap工具利用具有sql注入漏洞的页面链接(http://192.168.88.135/ProductShow.asp?ID=114)
Sqlmap -u “http://192.168.163.143/ProductShow.asp?ID=114”-dbs
猜解出数据库,数据库名(back-end),数据库类型(Microsoft ACCESS)
Sqlmap -u “http://192.168.163.143/ProductShow.asp?ID=114” -D back-end DBMS --tables
查看数据库中存在哪些表
sqlmap -u “http://192.168.163.143/ProductShow.asp?ID=114” –D back-end DBMS -T admin --columns
查看admin表中有哪些列
sqlmap -u “http://192.168.163.143/ProductShow.asp?ID=114” –D back-end DBMS -T admin -C username,password --dump
猜解username和password这两列的值
字典爆破出账号admin,密码是admin888的md5加密值
SQL注入漏洞如何防御
完善过滤对象
- 用户的输入字符串
- 提交的URL请求中的参数部分
- 从cookie中得到的数据
- 部署防SQL注入的系统或脚本
过滤特殊字符
- 单引号、双引号、斜杠、反斜杠、冒号、空字符等
- 使用str_replace方法把特殊字符替换成空格