sql注入简介(代码片段)

author author     2022-11-30     752

关键词:

一、Sql注入简介

Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

二、Web 程序三层架构

三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

  • 界面层(User Interface layer)
  • 业务逻辑层(Business Logic Layer)
  • 数据访问层(Data access layer)。

区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。
由数据库驱动的Web应用程序依从三层架构的思想也分为了三层:

  • 表示层。
  • 业务逻辑层(又称领域层)
  • 数据访问层(又称存储层)

拓扑结构如下图所示

img

在上图中,用户访问实验楼主页进行了如下过程:

  • 在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。
  • 业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。
  • 脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 Sql 语句。
  • 数据访问层的数据库管理系统返回 Sql 语句执行结果给 Web 服务器。
  • 业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。
  • 表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

在三层架构中,所有通信都必须要经过中间层,简单地说,三层架构是一种线性关系

三、Sql 注入漏洞详解

3.1 Sql 注入产生原因及威胁:

刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

Sql 注入带来的威胁主要有如下几点

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作

3.2 Sql 注入示例一.猜解数据库

接下来我们通过一个实例,让你更加清楚的理解 Sql 注入猜解数据库是如何发生的。
使用DVWA渗透测试平台,作为攻击测试的目标:

img

先输入 1 ,查看回显 (URL中ID=1,说明php页面通过get方法传递参数):

img

那实际上后台执行了什么样的Sql语句呢?点击 view source查看源代码 ,其中的SQL查询代码为:

img

可以看到,实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = \'1\';

我们是通过控制参数Id的值来返回我们需要的信息。
如果我们不按常理出牌,比如在输入框中输入 1\' order by 1#
实际执行的Sql语句就会变成:

SELECT first_name, last_name FROM users WHERE user_id = \'1\' order by 1#`;(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)

这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。

输入 1\' order by 1#1\' order by 2#时都返回正常:

img

img

当输入 1\' order by 3#时,返回错误:

img

由此可知,users表中只有两个字段,数据为两列。

接下来我们使用 union select联合查询继续获取信息。
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
输入1\' union select database(),user()#进行查询 :

  • database()将会返回当前网站所使用的数据库名字.
  • user()将会返回执行当前查询的用户名.

实际执行的Sql语句是 :

SELECT first_name, last_name FROM users WHERE user_id = \'1\' union select database(),user()#`;

img

通过上图返回信息,我们成功获取到:

  • 当前网站使用数据库为 dvwa .
  • 当前执行查询用户名为 root@localhost .

同理我们再输入 1\' union select version(),@@version_compile_os#进行查询:

  • version() 获取当前数据库版本.
  • @@version_compile_os 获取当前操作系统。

实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = \'1\' union select version(),@@version_compile_os#`;

img

通过上图返回信息,我们又成功获取到:

  • 当前数据库版本为 : 5.6.31-0ubuntu0.15.10.1.
  • 当前操作系统为 : debian-linux-gnu

接下来我们尝试获取 dvwa 数据库中的表名。
information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

我们输入1\' union select table_name,table_schema from information_schema.tables where table_schema= \'dvwa\'#进行查询:
实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = \'1\' union select table_name,table_schema from information_schema.tables where table_schema= \'dvwa\'#`;

img

通过上图返回信息,我们再获取到:

  • dvwa 数据库有两个数据表,分别是 guestbook 和 users .

有些同学肯定还不满足目前获取到的信息,那么我们接下来尝试获取重量级的用户名、密码。
由经验我们可以大胆猜测users表的字段为 user 和 password ,所以输入:1\' union select user,password from users#进行查询:
实际执行的 Sql 语句是:

SELECT first_name, last_name FROM users WHERE user_id = \'1\' union select user,password from users#`;

img

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。
直此,同学们应该已经对 Sql 注入有了一个大概得了解,也清楚了 Sql 注入的强大。

4.3 Sql 注入实例二.验证绕过

接下来我们再试试另一个利用 Sql 漏洞绕过登录验证的实例。
使用事先编写好的页面,这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。

img

我们先尝试随意输入用户名 123 和密码 123 登录:

img

从错误页面中我们无法获取到任何信息。
看看后台代码如何做验证的:

img

s

实际执行的操作时:

select * from users where username=\'123\' and password=\'123\'

当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。
按照第一个实例的思路,我们尝试在用户名中输入 123\' or 1=1 #, 密码同样输入 123\' or 1=1 #

img

img

为什么能够成功登陆呢?因为实际执行的语句是:

select * from users where username=\'123\' or 1=1 #\' and password=\'123\' or 1=1 #\'

按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

select * from users where username=\'123\' or 1=1 

由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。
我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:
我们尝试在用户名中输入 123\' or \'1\'=\'1, 密码同样输入 123\' or \'1\'=\'1 (不能少了单引号,否则会有语法错误):

img

img

实际执行的 Sql 语句是:

select * from users where username=\'123\' or \'1\'=\'1\' and password=\'123\' or \'1\'=\'1

看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

还有很多其他 Mysql 语句可以巧妙的绕过验证,同学们可以发散自己的思维进行尝试。

四、判断 Sql 注入点

通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX
对 Sql 注入的判断,主要有两个方面:

  • 判断该带参数的 Url 是否存在 Sql 注入?
  • 如果存在 Sql 注入,那么属于哪种 Sql 注入?

可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

4.1 判断是否存在 Sql 注入漏洞

最为经典的单引号判断法
在参数后面加上单引号,比如:

http://xxx/abc.php?id=1\'

如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
(如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入,因为此为入门基础课程,就不做深入讲解了)

4.2 判断 Sql 注入漏洞的类型

通常 Sql 注入漏洞分为 2 种类型:

  • 数字型
  • 字符型

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

img

4.2.1 数字型判断:

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1and 1=2 来判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
    1. Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:
当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1 

没有语法错误且逻辑判断为正确,所以返回正常。

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。
我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = \'x and 1=1\' 
select * from <表名> where id = \'x and 1=2\' 

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

4.2.2 字符型判断:

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = \'x\'
这种类型我们同样可以使用 and \'1\'=\'1and \'1\'=\'2来判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x\' and \'1\'=\'1 页面运行正常,继续进行下一步。
    1. Url 地址中继续输入 http://xxx/abc.php?id= x\' and \'1\'=\'2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:
当输入 and \'1\'=\'1时,后台执行 Sql 语句:

select * from <表名> where id = \'x\' and \'1\'=\'1\'

语法正确,逻辑判断正确,所以返回正确。

当输入 and \'1\'=\'2时,后台执行 Sql 语句:

select * from <表名> where id = \'x\' and \'1\'=\'2\'

语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证。

如何避免出现sql注入漏洞(代码片段)

简介: 本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。作者|阿里云安全团队... 查看详情

ctfhub——技能树——sql注入(sqlmap)(代码片段)

SQL注入整数型注入sqlmap简介检测注入实战解题字符型注入报错注入布尔盲注时间盲注MySQL结构Cookie注入UA注入Refer注入过滤空格整数型注入sqlmap简介sqlmap支持五种不同的注入模式:1、基于布尔的盲注,即可以根据返回页面... 查看详情

渗透测试自学系列—sql注入分类以及常用注入点(代码片段)

目录4.1.1.注入分类4.1.1.1.简介4.1.1.2.按技巧分类4.1.1.3.按获取数据的方式分类4.1.1.3.1.inband4.1.1.3.2.inference4.1.1.3.3.outofband(OOB)4.1.2.注入检测4.1.2.1.常见的注入点4.1.2.2.Fuzz注入点4.1.2.3.测试用常量4.1.2.4.测试列数4.1.2.5.报错注入4.1.2.5.1.基... 查看详情

sql注入漏洞简介原理及防护

目录1.SQL注入漏洞简介2.SQL注入漏洞原理3.SQL注入的分类4.注入方法5.SQL注入危害6.SQL注入防护措施1.SQL注入漏洞简介SQL注入漏洞是Web层面最高位的漏洞之一。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面... 查看详情

sql注入攻击大全(代码片段)

MYSQL注入攻击大全什么是SQLISQLI基本认识SQLI分类按照注入参数类别分字符型注入单引号闭合双引号闭合数字型注入按照请求方法分GET型注入url注入请求头注入POST型注入按注入手法分判断闭合符类型单引号闭合双引号闭合数字型其... 查看详情

sql注入(代码片段)

注入漏洞前言SQL注入JDBC拼接不当造成SQL注入框架使用不当造成SQL注入防御不当造成SQL注入前言注入漏洞,是指攻击者可以通过HTTP请求将payload注入某种代码中,导致payload被当作代码执行的漏洞。例如SQL注入漏洞,攻... 查看详情

5go与微信开发与web安全(代码片段)

...SRF攻击5.1CSRF简介5.2CSRF的原理5.3预防CSRF6预防session劫持7SQL注入7.1SQL注入简介7.2SQL注入 查看详情

5go与微信开发与web安全(代码片段)

...SRF攻击5.1CSRF简介5.2CSRF的原理5.3预防CSRF6预防session劫持7SQL注入7.1SQL注入简介7.2SQL注入 查看详情

sql注入详解(代码片段)

SQL注入详解1.SQL注入简介​SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。​Sql注入攻击是通过... 查看详情

laravel预防sql注入(代码片段)

阅读目录LaravelSQL注入预防指南什么是SQL注入?LaravelSQL注入示例1:使用RawMethods示例2:使用DB::statement示例3:错误消息博主解决Laravel原生SQL注入的办法LaravelSQL注入预防指南Laravel应用程序上执行SQL注入,并提出一些预防技术。首... 查看详情

laravel预防sql注入(代码片段)

阅读目录LaravelSQL注入预防指南什么是SQL注入?LaravelSQL注入示例1:使用RawMethods示例2:使用DB::statement示例3:错误消息博主解决Laravel原生SQL注入的办法LaravelSQL注入预防指南Laravel应用程序上执行SQL注入,并提出一些预防技术。首... 查看详情

java安全-注入漏洞(sql注入命令注入表达式注入模板注入)(代码片段)

文章目录注入SQL注入JDBC拼接不当造成SQL注入框架使用不当造成SQL注入不安全的反射命令注入代码注入表达式注入Spel表达式注入OGNL表达式注入模板注入注入SQL注入JDBC拼接不当造成SQL注入JDBC有两种方法执行SQL语句,分别为Prepa... 查看详情

sql注入学习笔记(代码片段)

文章目录前言SQL注入是什么?SQL注入具体内容一.攻击思路二.万能密码三.注入分类1、参数类型分类2.注入位置分类3.结果反馈分类SQL注入相关例题总结前言SQL注入漏洞(SQLinjection)是Web层面最高危的漏洞之一。但凡使... 查看详情

史上最详细的sqlmap使用教程(代码片段)

...sqlmap使用教程1.sqlmap简介2.初级扫描方案探测是否存在sql注入漏洞查看数据库信息3.高级扫描方案绕过waf探测等级和危险等级(—level—risk)伪造HttpReferer头部执行指定的SQL语句(—sql-shell)执行操作系统命令(—os-shell)读取服务器文件(... 查看详情

细说——sql注入(代码片段)

目录SQL是什么?什么是SQL注入漏洞原理漏洞原因为什么会有SQL注入注⼊点可能存在的位置漏洞危害提交方法判断注入点判断字符型还是数字型sql注入绕过获取网站路径SQL注入读写文件1.数据库支持文件读写2.当前用户具有文件... 查看详情

ioc框架之ninject简介(代码片段)

...力代表你的现在,学习代表你的将来上篇博客介绍了依赖注入的三种方式:构造方法注入,属性注入,接口注入!详情请参考:学习IOC设计模式前必读:依赖注入的三种实现本篇继续介绍IOC和DI的故事今天将以一个具体的IOC框架... 查看详情

什么是sql注入?怎么预防?(代码片段)

文章目录SQL注入SQL注入概念举个栗子如何解决SQL注入1.严格的参数校验2.SQL预编译SQL注入SQL注入概念SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。好手法!也就是说,在一些... 查看详情

web安全——sql注入漏洞(代码片段)

SQL注入漏洞什么是SQL注入漏洞?一、SQL注入1、常见SQL注入2、错误回显导致SQL注入3、盲注(BindInjection)4、TimingAttackTimingAttack的使用方法:二、数据库攻击技巧1、常见攻击方式2、命令执行3、攻击存储过程4、编码... 查看详情