SQL注入攻击介绍

2023-11-15

SQL注入攻击介绍

一、SQL注入攻击简介

SQL注入攻击是指,后台数据库操作时,如果拼接外部参数到SQL语句中,就可能导致欺骗服务器执行恶意的SQL语句,造成数据泄露、删库、页面篡改等严重后果。按变量类型分为:数字型、字符型;按HTTP提交方式分为:GET注入、POST注入、Cookie注入;按注入方式分为:报错注入、盲注(布尔盲注、时间盲注)、堆叠注入等等。

二、SQL注入分类

按变量类型分类:如SQL语句为select *from user where param=1(数字型)、select *from user where param=”abc”(字符型)。
按HTTP提交方式分类:通常GET注入变量在query string里、POST注入变量在body中、Cookie注入变量在Cookie中。
按注入方式分类:报错注入是指利用数据库的某些机制,故意制造错误条件,使得查询结果出现在错误信息中;盲注是指数据不能回显到前端页面,需要利用一些方法进行判断或者尝试。返回true或flase(布尔盲注),返回延时sleep()(时间盲注);堆叠注入是指多条SQL语句一起执行。

POST注入

三、SQL注入利用

对于循环SQL语法的数据库而言,SQL注入的原理基本相似,但由于语法、函数的不同,也存在许多细微的差异。对于不同数据库注入时,思路、方法不可能完全一样。下面SQL注入利用以MySQL 5.7.26为例。先介绍几个MySQL的特性。

1:通过注释获取版本信息
MySQL支持3种注释风格:
#:注释从“#”字符到行尾;
--:注释从“--”序列到行尾。
/* */:注释从/*序列到后面的*/序列中间的字符。
其中,“/* */”注释存在一个特点,在“/*!*/”中感叹号是有特殊意义。如果“!”后面不加入版本号,MySQL将会直接执行SQL语句;若MySQL版本号高于或等于!后的版本号,语句将会执行SQL语句。
如:

请添加图片描述

因此对于MySQL可利用该特性进行SQL注入获取版本信息。再根据当前版本是否有安全漏洞,进一步做利用。
2:获取元数据
MySQL 5.0及其以上版本提供了INFORMATION_SCHEMA,INFORMATION_SCHEMA是信息数据库,它提供了访问数据库元数据的方式。如下面几个例子:
查询用户数据库名称:
select SCHEMA_NAME from INFORMATION_SCHEMA.SCHEMATA(show databases的结果从SCHEMATA表取)

请添加图片描述

查询当前数据库表:
select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = database()

请添加图片描述

查询指定表的所有字段:
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = "user"

请添加图片描述

3:UNION查询
即使连接的select语句的数据类型不匹配,但也能正常执行。而SQL Server、Oracle则会认为语句错误,无法执行。如下(select username, password from test_user union select 1, 2):

请添加图片描述

攻击者对数据库注入,无非是利用数据库获取更多的数据或者更大的权限,那么利用方式可以归为一下:查询数据、读写文件、执行命令

1.查询数据

在这里插入图片描述
请添加图片描述

注入点在user参数,传参时使用单引号闭合前一个单引号,使用#注释后面的引号。结合MySQL结合MySQL的特性2、3可以查询用户数据库名称、当前数据库表、指定表的所有字段。由于前后查询字段的编码方式不同,需要做转换后才能正常执行。

请添加图片描述

MySQL存在报错注入,通过updatexml、extractvalue、floor函数利用。Updatexml(返回替换的XML片段)、extractvalue(使用XPath表示法从XML字符串中提取值),用法如下:

请添加图片描述

两个函数的第二个参数为xpath,如果语法错误,则会从错误的语法开始报错。利用concat拼接想要获取的数据库内容到第二个参数,第一个参数为错误的语法开始,报错时则会输出内容。floor函数报错注入则是利用group by时会建立虚拟表,而插入虚拟表的前后rand都会执行,导致插入数据冲突而报错。

2.读写文件

MySQL提供了load_file()函数,可用于读取文件,文件路径可用16进制转换或char(ASCII码)的方式传入。MySQL也提供了into outfile写文件的操作,写入内容也可以使用char(ASCII码)的方式表示。

请添加图片描述

如果读不到文件,可能是因为mysql的secure_file_priv的值默认为NULL,可通过 show global variables like '%secure%' 查看,然后在mysql配置文件下的[mysqld] 下添加条目:"secure_file_priv =",并重启mysql即可。

请添加图片描述

3.执行命令

MySQL的system函数可以执行系统命令,但这仅限本地执行。如果使用windows远程连接mysql root身份登录时,则无法执行shell。
Linux本地:

请添加图片描述

Windows远程连接:

在这里插入图片描述

通常是通过UDF提权、MOF提权进行利用。UDF是用户自定义函数,通过文件写入,利用UDF创建一个执行命令的函数。MOF只适用在WinServer2003,原理是C:/Windows/system32/wbem/mof目录下的mof文件每隔一段时间都会被系统执行,同样也是通过文件写入进行利用。条件和场景比较复杂,此处不做展开,有兴趣可以自行了解。

4.宽字节注入及长字符截断

php配置的magic_quotes_gpc(魔术引号)启用时,接收到的“’”、“””、“\”和NULL字符都会被自动加上反斜线转义,这样就无法闭合单引号,造成字符型注入。如果mysql使用GBK编码,则会认为两个字节是一个汉子,前一个ascii要大于128,故如果输入“%df’”经过php转义为“%df\’”后,“%df\”会被mysql识别为中文,从而绕过转义。

请添加图片描述

MySQL的sql_mode选项默认值对插入超长值并不会报错,导致了一些截断问题。

请添加图片描述
请添加图片描述

5.时间盲注及二次SQL注入

如果SQL查询的结果并不会返回给前端页面,往往只能通过盲注,即页面无差异的注入。时间盲注则是一种盲注。在语句中使用if及sleep函数,猜测数据内容。

请添加图片描述

二次SQL注入是一种非常难以防范的SQL注入攻击。如下面的例子:在数据插入时由于php转义了单引号,故插入的SQL语句没有注入。但在查询时,直接从数据库获取数据,而数据库数据存在单引号,造成注入。

请添加图片描述

6.使用Sqlmap工具

1.首先验证漏洞是否存在:id=2 and 1=1页面返回,id=2 and 1=2页面返回为空。

请添加图片描述
请添加图片描述

2.使用sqlmap扫描后台数据库:sqlmap.py -u "http://www.xxx.com/xxx.php?id=2" --dbs
返回:[*] hdm1060277_db    [*] information_schema

请添加图片描述

3.查找存储账号密码信息的表:sqlmap.py -u "http://www.xxx.com/xxx.php?id=2-1" -D hdm1060277_db --search -C user
返回:Table: dl

请添加图片描述

4.查看表内容:sqlmap.py -u "http://www.hechemist.com/hxydetailpro.php?id=2-1" -D hdm1060277_db -T dl -C username7,password7 --dump
返回:hxyuan    | xxx

请添加图片描述

5.登录后台:http://www.xxx.com/hy/mn.php

请添加图片描述

四、SQL注入的防御

根据变量类型可以将SQL注入分为数字型和字符串型。对于数字型注入的防御,只要严格判断数据类型非字符串即可。对于字符串的SQL注入,主要通过预编译&参数化查询、校验白名单或正则匹配进行防御。
预编译语句在创建时已经将SQL语句发送给DBMS,完成了解析、检查、编译等工作,我们需要做的仅仅是将变量传给SQL语句而已。预编译技术可以有效的防御SQL注入。

请添加图片描述

五、NoSQL注入

SQL注入是由于SQL语句拼接了不可信参数导致的,而NoSQL数据库(如:Mongodb)使用JSON格式查询数据交互的方法也同样可能存在不可信参数拼接。因此,即使这些数据库没有使用传统的SQL语法,它们仍然可能的存在NoSQL注入攻击。

对代码感兴趣的,关注公众号“吴花果的吴花火”,输入”sql注入“获取sql注入实例代码的下载链接。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL注入攻击介绍 的相关文章

  • C语言内存函数(memcpy、memmove、memcmp)详解

    一 memcpy string h 1 介绍 memcpy函数为内存拷贝函数 既可以拷贝字符串 也可以拷贝整形数组 浮点型数组等 具有明显的应用优势 destination为目的地空间 source为不可修改 const 的来源空间 num
  • npm WARN saveError ENOENT: no such file or directory解决

    安装完成node js后使用npm安装vue报错如下 C Users lxz gt npm uninstall vueWcsp npm WARN saveError ENOENT no such file or directory open
  • 算法优化

    算法优化 MATLAB实现BO RF贝叶斯优化随机森林算法 目录 算法优化 MATLAB实现BO RF贝叶斯优化随机森林算法 效果一览 基本介绍 模型结构 程序设计 学习总结 参考资料 效果一览 基本介绍 针对集成学习参数众多 缺乏高效准确
  • Rocky Linux ISO国内镜像下载

    Rocky Linux 是 CentOS 的一个分支 它位于 Red Hat Enterprise Linux RHEL 的下游 与 CentOS 一样 它提供了非常适合服务器的稳定版 Linux 它旨在作为 CentOS 的完全兼容替代品

随机推荐

  • SpringBoot整合Gson 整合Fastjson

    SpringBoot整合Gson 整合Fastjson 一 SpringBoot整合Gson 1 pom依赖 在SpringBoot中给我们自带了json解析器 我们需要移除SpringBoot自带的jackson 在添加Gson依赖
  • JSP 解决illegal to have multiple occurrences of contentType with different values错误

    JSP 解决illegal to have multiple occurrences of contentType with different values错误 在一个项目jsp文件中包含了另一个jsp文件 proCitySelAll j
  • vue elementUi便利el-form-item配置校验

  • 了解一款新的单片机

    MCU价格依然高居不下 各个国产MCU厂商的竞争也是如火如荼 然而好多厂商都是追求硬件甚至软件兼容STM32 但是兼容性好的芯片用的人也多 最终供不应求 还是会导致价格上涨 与其这样 不如干脆选一款相对冷门的单片机 用的人没那么多 价格也就
  • 机器学习第一周(一)--机器学习引入

    机器学习 监督学习 无监督学习 机器学习 1 机器学习算法主要分为俩大类 监督学习 Supervised Learning 和无监督学习 Unsupervised Learning 监督学习与无监督学习一个最大不同是监督学习的数据是带标签的
  • 调用百度地图5.0出现java.lang.UnsatisfiedLinkError: No implementation found for int

    转载请注明 http blog csdn net seven2729 article details 48289101 调用百度地图 5 0手机报错 黑屏并闪退 报错日志 java lang UnsatisfiedLinkError No
  • java——SpringBoot后台Controller接收数组参数

    1 前台传数组 var ids 1 2 3 4 5 6 ajax url postArray type post dateType json data ids ids success function res console log 数据
  • 状态码415解决

    状态码415 状态码415这是个什么鬼 常见的转态码 是200 204 206 301 302 303 304 400 401 403 404 405 500 503这个HTTP 协议原生的状态码 自己项目封装指定的那就另当别论 415很少
  • git报错“remote: HTTP Basic: Access denied”的解决方法

    使用git推送项目代码或者下载项目代码时出现报错 remote HTTP Basic Access denied 很多时候都是由于用户名和密码没有和注册所填信息保持一致造成的 解决方法是首先在git中输入 git config system
  • IC学习笔记6——单比特信号的跨时钟域处理方法之“打两拍”

    一 打两拍 对于单比特信号的跨时钟域处理问题 通常使用两级的寄存器来同步源寄存器的信号 这样的方法简称打两拍 1 1 电路波形图 如上图所示从源寄存器传递过来的信号adata没有满足目的寄存器的建立和保持时间 发生亚稳态 但是绝大多数的时候
  • 一行代码搞定Http请求,强得离谱~

    大家好 我是乔哥 OKHttpUtil 在Java的世界中 Http客户端之前一直是Apache家的HttpClient占据主导 但是由于此包较为庞大 API又比较难用 因此并不使用很多场景 而新兴的OkHttp Jodd http固然好用
  • jenkins配置测试邮件发送成功但构建邮件发送失败

    以下失败原因只是其中之一 每个人遇到的可能并不一样 希望本文能提供解决思路 在配置jenkins发送邮件的时候按照网上查询的各个步骤配置完毕 邮件测试也可以发送成功 但是当进行项目构建时 日志提示邮件已经发送 但实际并未收到邮件 使用的是Q
  • git clone 下载 其他分支

    总是记不住 可能是因为用得少 如果 已经 clone了 master分支 方法 1 那么 本地 git pull 然后执行 git checkout b 本地分支名 origin 远程分支名 这样就能下载 到远程分支 并建立本地关联 方法2
  • 【模拟】不高兴的津津

    题目 不高兴的津津 rqnoj20 题目描述 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且
  • loadrunner agent process进程

    LoadRunner Agent Processer是LR的代理进程 有很大的用处 比如当一台机器要分担一定 负载的时候 这个LoadRunner Agent Processer是必须启动的 在LR安装后一般是开机启动的 可以关掉 就象个地
  • git 使用总结

    1 本地安装git 略 2 创建github账号 略 3 本地配置 配置用户名和邮箱 git config global user name xiaobuisme git config global user email 81954469
  • Codemonkey 编码冒险课程

    转自 https blog csdn net mmh19891113 article details 80704745 Codemonkey 编码冒险课程 1 200 关卡 我们并没有按照他们官方的来划分关卡 官方是1 100 101 20
  • 在struts框架下实现文件的上传

    由于jspsmartupload上传文件 当前端页面没有file控件时 后端用jspsmartupload控件upload时将会走入一个死循环 现在采用struts自己提供的功能实现文件的上传 1 前端页面upload jsp
  • 使用Process Monitor工具监测进程对注册表和文件的操作

    使用Process Monitor工具监测进程对注册表和文件的操作 在C C 中编写代码实现 Process Monitor是一款功能强大的Windows系统工具 它可以用于监测和记录系统中的进程对注册表和文件的操作 通过使用Process
  • SQL注入攻击介绍

    SQL注入攻击介绍 一 SQL注入攻击简介 SQL注入攻击是指 后台数据库操作时 如果拼接外部参数到SQL语句中 就可能导致欺骗服务器执行恶意的SQL语句 造成数据泄露 删库 页面篡改等严重后果 按变量类型分为 数字型 字符型 按HTTP提