IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> [理论-学习]Web安全原理剖析-01 -> 正文阅读

[大数据][理论-学习]Web安全原理剖析-01

声明:

由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。

笔记内容来源于各类网课、书籍。

本章节内容来源:《Web安全攻防渗透测试实战指南》

一、思维导图

二、SQL注入

1. SQL注入基础

1.1 SQL注入介绍

SQL注入指的是:Web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库执行,攻击者可以通过构造不同SQL语句来实现对数据库的任意操作

例如后端的PHP代码如下:

$query = "select * from users where id = $_GET['id']"

由于这里的参数可控,并且带入数据库执行,所有攻击者可以构建SQL语句进行攻击。

例如将id=1 or 1 --+,PHP的查询语句变成:

select * from users where id = 1 or 1 --

就会打印所有users的数据。

1.2 SQL注入原理

SQL注入发生需要两个条件:

  • 参数用户可控:用户可以控制前端传到后端的参数值
  • 参数带入数据库执行:传入的参数拼接到SQL语句,并在带入数据库中执行

参数满足上述条件,攻击者便可以开始测试有无注入漏洞。如果后端对前端传入的参数没有过滤,后端的SQL语句就可能发生注入。

一般的后端SQL语句类型的条件语句(where条件)可分为数字型和字符型(单引号闭合,双引号闭合),常见如下:

where id=1
where id='1'
where id="1"
where id=(1)
where id=('1')
where id=("1")
where id=(('1'))
where id=(("1"))
where id=((('1')))
where id=((("1")))
...

如果后端没有过滤参数,我们使用'、"和注释符(--+、#、%23)来判断有无注入点。?

  • 在数字型后添加'和"都会报错,添加注释符(--+、#、%23)不会报错
  • 在字符型中单引号闭合后添加"不会报错,添加'和注释符会报错
  • 在字符型中双引号闭合后添加'不会报错,添加"和注释符会报错

先判断是数字型还是字符型(闭合符号)在判断外部有无括号和括号数量。之后构建特殊SQL语句进行注入。

1.3 与MySQL注入有关的知识

(1). 在MySQL5.0以后,MySQL默认在数据库中存放一个"information_schema"的数据库。

在该库中存储着所有的数据库信息(数据库名,表名,字段名和相关属性)。其中有三个表尤其重要:schemata,tables,columns。

  • schemata中记录了用户创建的所有数据库名和信息。数据库名的字段名为schema_name
  • tables中记录了用户创建的所有表名和信息。数据库名、表名的字段名分为table_schematable_name
  • columns中记录了用户创建的所有字段名和信息。数据库名、表名、字段名的字段名分为table_schematable_namecolumn_name

(2) MySQL的查询语句,可以使用条件,也可以不使用条件

  • 不使用条件:select colum_name ... from database_name.table_name
  • 使用条件:select column_name ... from database_name.table_name where 条件 [and/or 条件]

(3) Limit的用法

limit格式为Limit m,n,m表示起始位置(从0开始,区别substr从1开始),n表示取几条记录。

例如limit 0,1 表示取出第一条记录开始,取出1条记录。

limit可在SQL注入中用于限制输出的数据数量,在报错注入中,输出的字符有限(受相应的变量控制),我们使用limit控制输出数量,最终全部获取。

(4) 几个函数和系统变量

  • database():当前使用的数据库
  • user():当前登陆的MySQL用户
  • version()/@@version:当前数据的版本

(5) 注释符

  • #
  • --(空格/TAB/换行)
  • /**/

在SQL注入中,可以使用--+,+会被php解释为空格;%23是#的URL编码

(6) 内联注释

内联注释形式为:/*!? code? */其中的代码会被作为SQL语句执行

?在SQL注入中,可用于绕过过滤。

1.4 Union注入攻击

适用条件:

  • 传入的参数使SQL语句报错(或传入参数的值不在范围内),页面返回数据异常(为空等)
  • 对于关键词:union,select,from,order by没有过滤,或可以绕过。

传入参数的值不在范围内:例如user的id从0开始递增,我们取id=-1。

步骤:

测试参数名假定为id。

  1. id可以控制页面:id为不同值,页面返回不同的数据
  2. id可以让SQL语句报错:页面返回数据异常(可能会爆出后台SQL语句)
  3. 可以执行id里面的SQL语句:id=-1 or 1,返回正常的数据,就是执行了or 1的这个语句
  4. 使用order by进行字段数判断:从1开始,依次二分法。
  5. 使用union select确定数据回显位置:一般在页面上,有的在会在img,a等标签的url中。
  6. 使用union select进行数据获取。

存在风险的代码举例:

1.5 Boolean注入攻击

适用条件:

  • 构造报错SQL语句和不在范围内的参数值,页面只会显示两种状态(正常,不正常)
  • 对于关键词:substr,ascii,ord,select,form,limit参数没有过滤,或者可以绕过
  • 过滤了union

可以使用Boolean注入攻击的显著特征就是:页面根据用户的参数输入,只用两种状态

一般使用BurpSuite和编写脚本爆破最便捷。

步骤:

测试参数名假定为id。

  1. id可以控制页面:id为不同值,页面返回不同的数据(页面状态A)
  2. id可以让SQL语句报错:页面返回数据异常(页面状态B)
  3. id = -1 or substr( dataabse()?, 1, 1) ='a' --+ 或 id = -1 or ascii(substr( dataabse()?, 1, 1) )>-0--+ 等进行爆破出数据库名。根据页面显示状态判断,由于-1为假,只用or后为真,才会返回正确的页面(页面状态A)。
  4. 同理使用d = -1 or substr( (select table_name from information_schema.tables wehere table_schema = database() limit $0$,1) , $1$, 1) = 101??--+ 在$0$和$1$进行递增爆破,即可爆破出表名

?存在风险的代码举例:

1.6 报错注入攻击

适用条件:

  • 构造报错SQL语句,也会将报错信息显示(也可能不显示)
  • 让函数报错是,页面一定会显示报错信息。例如updatexml中的参数应符合xpath语法,我们构造的参数让updatexml报错,页面把updatexml的报错信息显示。
  • 对于关键词:concat,cancat_ws,gourp_concat,updatexml,extractvalue参数没有过滤,或者可以绕过

报错注入主要是利用函数报错,将我们需要的信息同时爆处理,但是输出的信息长度受限,需要配合limit进行控制

  1. id可以控制页面:id为不同值,页面返回不同的数据。
  2. 参数中使用报错函数updatexml或extractvalue进行报错,错误可以显示在页面。
  3. 使用id=-1 or (select ( updatexml(1,? ?concat(0x7e, version())? ,1) ) ) --+爆出数据库版本。
  4. 使用id=-1 or (select ( updatexml(1,? ?concat(0x7e,? (select table_name from information_schema.tables where table_schema=database() limit $1$,1)? )? ,1) ) ) --+ 在$1$处进行递增,即可爆破出全部表名。

?存在风险的代码举例:

2. SQL注入进阶

2.1 时间注入攻击

与布尔盲注类型,但是是由于对用用户的参数输入只有一种显示状态,不存在显示异常情况。

我们需要结合函数sleep和if(expr1,expr2,expr3)进行攻击。

在if中如果,expr1为TRUE,则if返回expr2,否则返回expr3。

例如使用:

if(lenght(database()) >1 ,sleep(5) ,1)

表示如果数据库名长度大于1,查询休眠5秒,反应在页面中就是,请求的返回的时间大于5秒(在F12,网络面板可看到)。

使用如下:

if(substr(database(),1,1) ='s', sleep(5), 1)

判断数据库名第一个字符是否是s,如果是页面返回时间大于5s。

后面的爆破操作以此类推。

使用自定义写的脚本爆破效果较好。

2.2 堆叠查询注入攻击

后端获取的参数,使用PDO的方式进行数据查询,但仍将参数拼接到查询语句中,导致PDO没有起到预编译效果,程序任然存在SQL注入漏洞。

例如下面的代码:

使用PDO执行SQL语句,可以执行多条语句,不过这样通常不能直接得到注入结果,因为PDO只会返回第一条SQL语句的执行结果,所以在第二条语句中可以用update更新数据或者使用时间盲注获取数据

令id = 1'; select if (ord(substr(user(),1,1) ==114,sleep(3),1); %23时,执行语句为:

select * from users where id = '1'; select if (ord(substr(user(),1,1)) =114,sleep(3),1); # 

通过后面的时间盲注语句爆出数据。

2.3 二次注入攻击

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

二次注入,可以概括为以下两步:

  • 第一步:插入恶意数据
    进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

  • 第二步:引用恶意数据
    开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

2.4 宽字节注入攻击

  • 使用GBK编码绕过对单引号的过滤。
  • 使用嵌套查询绕过对select中where的条件中单引号过滤。

2.5 cookie注入攻击

注入点在cookie处。

2.6 base64注入攻击

输入的参数转为base64编码进行攻击。

2.7 XFF注入攻击

注入点在X-Forwarded-For处。

3. SQL绕过技巧

3.1 大小写绕过

例如将and,写成AnD,anD,aNd等形式绕过。

3.2 双写绕过

例如将union,写成uniunionon,ununionion等形式。

3.3 编码绕过

对参数进行一次或多次的URL编码。

3.4 内联注释绕过

使用内联注释绕过。例如and写成 /*! and*/。

4. SQL注入修复建议

4.1?过滤危险字符。

采用正则过滤union,sleep,load_file等关键词。

4.2 使用预编译语句

使用PDO预编译语句,不能将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。

附:

文中的风险代码举例来源于《Web安全攻防渗透测试实战指南》第四章

二次注入介绍来源:

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 10:55:57  更:2021-09-10 10:55:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:51:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码