Sql注入(手工注入思路、绕过、防御)

一、Sql注入思路

1、判断注入点

GET参数、POST参数、以及HTTP头部等,包括CookieRefererXFF(X-Forwarded-for)UA等地方尝试插入代码、符号或语句,尝试是否存在数据库参数读取行为,以及能否对其参数产生影响,如产生影响则说明存在注入点。

1)、GET 注入

提交数据的方式是 GET,注入点的位置在 GET 参数部分。例如有这样的一个URL:http://xxx.com/news.php?id=1,id是注入点。

2)、POST 注入

使用 POST 方式提交数据,注入点位置在 POST 数据部分,通常发生在表单中。

3)、HTTP 头部注入

注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中,Cookie 字段中等。

2、判断数据库类型

判断网站使用的是哪个数据库,常见数据库如:MySQL、MSSQL(SQLserver)、Oracle、Access、PostgreSQL、BD2等等。

1)、端口扫描

如果可以对主机进行端口扫描,可以根据是否开启对应端口,来大概判断数据库类型。

数据库类型默认端口号
Oracle1521
SQL Server1433
MySQL3306
PostgreSql5432
2)、网站类型与数据库的关系
网站类型数据库类型
aspSQL Server,Access
.netSQL Server
phpMysql,PostgreSql
javaOracle,Mysql
3)、根据数据库特有的系统表判断
数据库类型特有的系统表
OracleSYS.USER_TABLES
SQL ServerSYSOBJECTS
MySQL(MySQL版本在5.0以上)INFORMATION_SCHEMA.TABLES
AccessMSYSOBJECTS
http://127.0.0.1/test.php?id=1 

例如,我们可以根据以上URL,拼接Sql语句来查询数据库特有的系统表数据条目,根据其是否返回查询结果来判断数据库类型:

http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
4)、根据返回的错误判断

如果我们在进行Sql注入的时候,可以看到数据库的错误信息,也可以通过返回的错误信息来判断数据库的类型

3、判断参数数据类型(闭合方式)

通过+1-1and 1=1and 1=2、注释符等与其各种变种,如与各种符号结合的and 1=1and '1'='1等等判断参数数据类型。先判断是否是整型,如果不是整型则为字符型,字符型存在多种情况,需要使用单引号'、双引号"、括号()多种组合方式进行试探。
理论上来说,只有数值型和字符型两种注入类型。SQL的语法,支持使用一个或多个括号包裹参数,使得这两个基础的注入类型存在一些变种,例如:数值型+括号、单引号字符串+括号、双引号字符串+括号等,有时可能会有多个括号包裹。

单引号'注入不成功的时候尝试1%df' 是否为宽字节注入

在这里插入图片描述

4、判断数据库语句过滤情况,从而选择相应的注入方式(联合查询、报错、盲注…)

正常输入Sql语句,通过查看回显来判断语句是否被过滤。如果order by被过滤则尝试绕过,如果无法绕过就无法得到列数,这时就无法使用联合查询注;如果页面没有显示位,同样无法使用联合查询注入;如果没有报错信息返回,则无法使用报错注入。

1)、联合查询注入

联合查询的前提是需要通过order by获取到列数,且页面上有显示位。判断显示位、获取所有数据库名、获取指定数据库所有表名、获取指定数据库指定表中所有字段名、获取具体数据。

2)、报错注入

报错注入的前提是页面会显示数据库报错信息。得到报错信息、获取所有数据库名、获取指定数据库所有表名、获取指定数据库指定表中所有字段名、获取具体数据。

3)、布尔盲注

Sql注入语句执行之后,可能由于网站代码的限制或者Apache等解析器配置了不回显数据,造成数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试。当页面返回结果只有正确和错误这两种情况时,可以使用布尔盲注。

4)、时间盲注

当页面上没有显示位,也没有输出SQL语句执行错误信息。 正确执行和错误执行的返回界面一样,但是加入sleep语句之后,页面的响应速度会明显变慢。此时需要使用时间盲注。因此实际情况下手工时间盲注会花费大量时间,不符合实际,需要用工具或者脚本来进行注入。

5)、DNSlog带外注入

当我们进行注入时,如果页面无回显,且无法进行时间注入,那么就可以利用DNS解析这个通道,把查询到数据通过通道带出去,可以使用DNSlog带外注入。

二、绕过方式

后端语言可能对我们拼接的sql语句,进行过滤,常见的有关键字过滤,一些符号过滤以及函数过滤等。

1、过滤关键字

  • 分割关键字
    最常用的绕过方法就是使用/**/<>分割关键字

    sel<>ect
    sel/**/ect
    
  • 双写绕过
    根据过滤程度,有时候还可以用双写绕过

  • 编码绕过
    有时候可以尝试使用URL编码绕过、16进制编码绕过、ASCII编码绕过

  • 大小写绕过

2、过滤逗号

  • 简单注入可以使用join绕过
    # 原语句:
    union select 1,2,3
    # join语句:
    union select * from (select 1)a join (select 2)b join (select 3)c
    
  • 对于盲注的几个函数substr()、mid()、limit
    # substr和mid()可以使用from for的方法解决
    # 原语句
    substr(str, pos, len)                 # 截取字符串,从pos位置开始,截取字符串str的len长度
    mid(str, pos, len)                    # 截取字符串,从pos位置开始(从1开始),截取字符串str的len位
    # from for语句
    substr(str from pos for len)          # 在str中从第pos位截取len长的字符
    mid(str from pos for len)             # 在str中从第pos位截取len长的字符# limit可以用offset的方法绕过
    limit 1 offset 1                      # "limit 1"表示只返回1行结果,"offset 1"表示从结果集中跳过1行数据,所以表示从结果集中选择第2行,并返回该行作为结果
    

3、过滤空格

  • 使用注释/**/绕过
    # 例如sql查询
    select user() from security
    # 我们用注释替换空格,就可以变成:
    select/**/user()/**/from/**/security
    
    如果在sqlmap中,使用注释绕过,对于mysql数据库需要使用--tamper参数指定注释绕过空格的脚本:
    python sqlmap.py -u http://127.0.0.1/index.php?id=1 --batch --dbs --tamper=space2comment.py
    
  • 使用括号绕过
    # 例如sql查询
    select user() from user where 1=1 and 2=2
    # 如何把空格减到最少?
    # 观察到user()可以算值,那么user()两边要加括号,1=1和2=2可以算值,也加括号,去空格,变成:
    select(user())from user where(1=1)and(2=2)
    # 数据库名两边的空格,通常是由程序员自己添加,我们一般无法控制。所以上面就是空格最少的结果。
    # 在time based盲注中是一个非常实用的技巧
    http://www.xxx.com/index.php?id=(sleep(ascii(mid(user()from(2)for(1)))=109))
    
    在这里插入图片描述

4、过滤等号

当注入语句中把=过滤了,可以使用使用like、rlike、regexp进行绕过

like:不加通配符的like执行的效果和=一致,所以可以用来绕过。
rlike:模糊匹配,只要字段的值中存在要查找的 部分 就会被选择出来,用来取代=时,rlike的用法和上面的like一样,没有通配符效果和=一样
regexp:MySQL中使用REGEXP操作符来进行正则表达式匹配

在这里插入图片描述

也可以用<>来绕过

在这里插入图片描述

5、过滤引号

  • 十六进制编码绕过
    一般会使用到引号的地方是在最后的 where 子句中,比如:

    select * from t_student where name = "admin";
    

    当引号被过滤了的话, 'admin' 或者 "admin" 就没法用了,我们可以用 admin 的16进制 0x61646d696e 代替。

    在这里插入图片描述

  • ASCII编码绕过
    在这里插入图片描述

  • URL编码绕过
    使用URL编码绕过的前提条件是后端在处理接收到的参数进行了URL解码,并且对该URL解码是在使用了过滤函数之后才可以使用URL编码绕过。

6、过滤大于小于号

在使用盲注的时候,会用到二分法来比较操作符来进行操作,如果过滤了比较操作符,那么就需要使用到greatest()lease()来进行绕过。greatest()函数返回最大值,leaset()函数返回最小值。

# 原语句
select * from users where id=1 and ascii(substring(database(),0,1))>64;
# 过滤<、>符号后,使用greatest()后的语句
select * from users where id=1 and greatest(ascii(substring(database(),0,1)),64)=64;

7、等价函数绕过

  • hex()、bin()函数被过滤,可以使用ascii()函数

  • sleep()函数被过滤,可以使用benchmark()函数,函数benchmark(count, expression),参数count表示要执行表达式的次数,expression是要执行的表达式或语句,返回表达式的执行时间。

  • substring()、substr()mid()函数被过滤时,可以使用strcmp()函数strcmp(str1, str2)函数,用于比较两个字符串是否相等。如果 str1 等于 str2,则返回 0。 如果 str1 小于 str2,则返回一个负数。如果 str1 大于 str2,则返回一个正数。

    strcmp(left('password',1), 0x69) = 1 
    strcmp(left('password',1), 0x70) = 0 
    strcmp(left('password',1), 0x71) = -1
    
  • CONCAT_WS()、CONCAT()GROUP_CONCAT() 是用于字符串连接和聚合的函数。CONCAT_WS(separator, str1, str2, ...)函数用于将多个字符串连接在一起,并使用指定的分隔符进行分隔。CONCAT(str1, str2, ...)函数用于将多个字符串连接在一起。与 CONCAT_WS()不同,CONCAT()函数不会插入分隔符。

三、Sql注入的防御方式

1、限制数据类型

Java、C#等强类型语言几乎可以完全忽略数字型注入,例如:请求ID为1的新闻页面,其URL:http://www.secbug.org/news.jsp?id=1,在程序代码中可能为:

int id = Integer.parseInt(request.getParameter("id"));
//接收 ID 参数,并转换为 int 类型
News news= newsDao.findNewsById(id);			//查询新闻列表

攻击者想在此代码中注入是不可能的,因为程序在接收ID参数后,做了一次数据类型转换,如果ID参数接收的数据是字符串,那么在转换时将会发生Exception。因此,数据类型处理正确后,可以防止数字型注入。像PHP、ASP,并没有强制要求处理数据类型,这类语言会根据参数自动推导出数据类型,假设 ID=1,则推导ID的数据类型为Integer、ID=str,则推导 ID 的数据类型为string,这一特点在弱类型语言中是相当不安全的。如:

$id = $_GET['id'];
$sql ="select*from news where id = $id;";
$news = exec($sql);

攻击者可能把id参数变为 1 and 1=2 union select username,password from users;--,这里并没有对$id 变量转换数据类型,PHP自动把变量$id 推导为 string类型,带入数据库查询,造成 SQL注入漏洞。防御数字型注入相对来说是比较简单的,只需要在程序中严格判断数据类型即可。如:使用is_numeric()、ctype_digit()等函数判断数据类型,即可解决数字型注入。

2、特殊字符转义

通过加强数据类型验证可以解决数字型的 SQL 注入,字符型却不可以,因为它们都是 string类型,你无法判断输入是否是恶意攻击。那么最好的办法就是对特殊字符进行转义。因为在数据库查询字符串时,任何字符串都必须加上单引号。既然知道攻击者在字符型注入中必然会出现单引号等特殊字符,那么将这些特殊字符转义即可防御字符型SQL注入。例如,在PHP中最基本的就是自带的magic_quotes_gpc函数

3、使用预编译语句,绑定变量

使用预编译相当于是将数据于代码分离的方式,把传入的参数绑定为一个变量,用?表示,攻击者无法改变 Sql 的结构。

String query="select password from users where username='?' ";

在这个例子中,即使攻击者插入类似 admin' or 1=1# 的字符串,如果不做处理直接带入查询,那么query则变成了

query="select password from users where username='admin' or 1=1 ";

闭合了后面的引号,从而执行了恶意代码。而预编译则是将传入的 admin' or 1=1# 当做纯字符串的形式作为 username 执行,避免了上面说到的 Sql 语句中的拼接闭合查询语句等过程,可以理解为字符串与Sql语句的关系区分开。username 此时作为字符串不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作。

4、框架技术

随着技术发展,越来越多的框架渐渐出现,Java、C#、PHP等语言都有自己的框架。至今,这些框架技术越来越成熟、强大,而且也具有较高的安全性。
在众多的框架中,有一类框架专门与数据库打交道,被称为持久层框架,比较有代表性的有Hibernate、MyBatis、JORM等。

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

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

相关文章

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

设计模式 - 享元模式

目录 一. 前言 二. 实现 一. 前言 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它主要解决的问题是创建大量相似对象时的内存开销问题。该模式通过共享具有相同状态的对象来减少内存使用量。 享元模式的思想是&#xff1a;当需要创建…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③ 第十九章 驱动程序基石③19.5 定时器19.5.1 内核函数19.5.2 定时器时间单位19.5.3 使用定时器处理按键抖动19.5.4 现场编程、上机19.5.5 深入研究&#xff1a;定时器的内部机制19.5.6 深入研究&#xff1a;找到系统滴答 1…

SpringCloud(一)Eureka、Nacos、Feign、Gateway

文章目录 概述微服务技术对比 Eureka服务远程调用服务提供者和消费者Eureka注册中心搭建注册中心服务注册服务发现Ribbon负载均衡负载均衡策略饥饿加载 NacosNacos与Eureka对比Nacos服务注册Nacos服务分集群存储NacosRule负载均衡服务实例权重设置环境隔离 Nacos配置管理配置热…

ESP32设备驱动-OLED-SSD1306(I2C)显示屏驱动

OLED-SSD1306(I2C)显示屏驱动 1、OLED介绍 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一…

C++面试题准备

文章目录 一、线程1.什么是进程&#xff0c;线程&#xff0c;彼此有什么区别?2.多进程、多线程的优缺点3.什么时候用进程&#xff0c;什么时候用线程4.多进程、多线程同步&#xff08;通讯&#xff09;的方法5.父进程、子进程的关系以及区别6.什么是进程上下文、中断上下文7.一…

短期风速预测|LSTM|ELM|批处理(matlab代码)

目录 1 主要内容 LSTM-长短时记忆 ELM-极限学习机 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序是预测类的基础性代码&#xff0c;程序对河北某地区的气象数据进行详细统计&#xff0c;程序最终得到pm2.5的预测结果&#xff0c;通过更改数据很容易得到风速预测结…

WSL2安装历程

WLS2安装 1、系统检查 安装WSL2必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11。 查看 Windows 版本及内部版本号&#xff0c;选择 Win R&#xff0c;然后键入winver。 2、家庭版升级企业版 下载HEU_KMS_Activ…

Django模板加载与响应

前言 Django 的模板系统将 Python 代码与 HTML 代码解耦&#xff0c;动态地生成 HTML 页面。Django 项目可以配置一个或多个模板引擎&#xff0c;但是通常使用 Django 的模板系统时&#xff0c;应该首先考虑其内置的后端 DTL&#xff08;Django Template Language&#xff0c;D…

【Flutter】Flutter Web 开发 如何从 URL 中获取参数值

【Flutter】Flutter Web 开发 如何从 URL 中获取参数值 文章目录 一、前言二、Flutter Web 中的 URL 处理三、如何从 URL 中获取参数四、实际业务中的用法五、完整示例六、总结 一、前言 大家好&#xff01;我是小雨青年&#xff0c;今天我想和大家分享一下在 Flutter Web 开发…

UGUI交互组件Button

一.初识Button对象 从菜单中创建Button对象&#xff0c;Button的文本由子节点Text对象显示&#xff0c;Button对象的组件除了基础组件外&#xff0c;还有Image用来显示Button常规态的图片&#xff0c;还有Button组件用来控制点击过渡效果和点击事件的响应。 二.Button组件的属…

C#,数值计算——Ranq1的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Recommended generator for everyday use.The period is 1.8E19. Calling /// conventions same as Ran, above. /// </summary> public class Ranq1 { …

【2023年11月第四版教材】第17章《干系人管理》(第二部分)

第17章《干系人管理》&#xff08;第二部分&#xff09; 4 过程1-识别干系人4.1 数据收集★★★4.3数据分析4.4 权力利益方格4.5 数据表现&#xff1a;干系人映射分析和表现★★★ 5 过程2-规划干系人参与5.1 数据分析5.2 数据表现★★★5.2.1 干系人参与度评估矩阵★★★ 5.3 …

git_SSL certificate problem: unable to get local issuer certificate解决办法

拉取问题 再拉取代码的时候&#xff0c;报这个错误 这是由于当你通过HTTPS访问Git远程仓库的时候&#xff0c;如果服务器上的SSL证书未经过第三方机构认证&#xff0c;git就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。解决办法就是通过下面的命令将…

【算法分析与设计】回溯法(上)

目录 一、学习要点1.1 回溯法1.2 问题的解空间1.3 0-1背包问题的解空间1.4 旅行售货员问题的解空间1.5 生成问题状态的基本方法 二、回溯法的基本思想三、回溯算法的适用条件四、递归回溯五、迭代回溯六、子集树与排列树七、装载问题八、批处理作业调度问题 一、学习要点 理解回…

操作系统初探 - 进程的概念

目录 预备知识 冯诺依曼和现代计算机结构 操作系统的理解 进程和PCB的概念 PCB中的信息 查看进程信息的指令 - ps pid 进程状态 预备知识 在学习操作系统之前我们需要先了解一下如下的预备知识。 冯诺依曼和现代计算机结构 美籍匈牙利科学家冯诺依曼最先提出“程序存…

POJ 3109 Inner Vertices 离散化+树状数组

一、题目大意 围棋棋盘&#xff0c;如果某个坐标上下左右的四个方向都存在棋子&#xff0c;那么ans1&#xff0c;根据输入的棋子数量&#xff0c;求出ans的数量。 二、解题思路 题目中有说到如果程序不会结束&#xff0c;那么输出-1&#xff0c;这其实是无源之水&#xff0c…

【爬虫】用wget命令爬虫的简易教程

文章目录 1. 获取登录的请求2. 用postman模拟登录请求3. 用wget模拟登录请求并保存cookie4. 开始爬取网站5. 查看爬取结果6. 网站爬虫简易教程 爬取需要登录的网站的资源 背景&#xff1a;对于一些网站需要使用用户名和密码登录并且使用了https&#xff0c;我们如果不通过凭证将…

win10系统任务栏图标变成白色的解决办法

我平时都是用滴答清单进行管理这个自己的日程代办的&#xff0c;但是今天打开的时候发现这个快捷方式突然变成纯白色的了&#xff0c;重启电脑之后&#xff0c;这个图标的样式仍然没有变化。上网查找解决办法之后&#xff0c;终于搞好了&#xff0c;于是就有了下面的教程。 为什…

大数据Flink(九十五):DML:Window TopN

文章目录 DML:Window TopN DML:Window TopN Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。 应用场景