| |
|
开发:
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 |
一、思维导图二、SQL注入1. SQL注入基础1.1 SQL注入介绍SQL注入指的是:Web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库执行,攻击者可以通过构造不同SQL语句来实现对数据库的任意操作。 例如后端的PHP代码如下:
由于这里的参数可控,并且带入数据库执行,所有攻击者可以构建SQL语句进行攻击。 例如将id=1 or 1 --+,PHP的查询语句变成:
就会打印所有users的数据。 1.2 SQL注入原理SQL注入发生需要两个条件:
参数满足上述条件,攻击者便可以开始测试有无注入漏洞。如果后端对前端传入的参数没有过滤,后端的SQL语句就可能发生注入。 一般的后端SQL语句类型的条件语句(where条件)可分为数字型和字符型(单引号闭合,双引号闭合),常见如下:
如果后端没有过滤参数,我们使用'、"和注释符(--+、#、%23)来判断有无注入点。?
先判断是数字型还是字符型(闭合符号)在判断外部有无括号和括号数量。之后构建特殊SQL语句进行注入。 1.3 与MySQL注入有关的知识(1). 在MySQL5.0以后,MySQL默认在数据库中存放一个"information_schema"的数据库。 在该库中存储着所有的数据库信息(数据库名,表名,字段名和相关属性)。其中有三个表尤其重要:schemata,tables,columns。
(2) MySQL的查询语句,可以使用条件,也可以不使用条件
(3) Limit的用法 limit格式为Limit m,n,m表示起始位置(从0开始,区别substr从1开始),n表示取几条记录。 例如limit 0,1 表示取出第一条记录开始,取出1条记录。 limit可在SQL注入中用于限制输出的数据数量,在报错注入中,输出的字符有限(受相应的变量控制),我们使用limit控制输出数量,最终全部获取。 (4) 几个函数和系统变量
(5) 注释符
在SQL注入中,可以使用--+,+会被php解释为空格;%23是#的URL编码。 (6) 内联注释 内联注释形式为:/*!? code? */,其中的代码会被作为SQL语句执行。 ?在SQL注入中,可用于绕过过滤。 1.4 Union注入攻击适用条件:
传入参数的值不在范围内:例如user的id从0开始递增,我们取id=-1。 步骤: 测试参数名假定为id。
存在风险的代码举例: 1.5 Boolean注入攻击适用条件:
可以使用Boolean注入攻击的显著特征就是:页面根据用户的参数输入,只用两种状态。 一般使用BurpSuite和编写脚本爆破最便捷。 步骤: 测试参数名假定为id。
?存在风险的代码举例: 1.6 报错注入攻击适用条件:
报错注入主要是利用函数报错,将我们需要的信息同时爆处理,但是输出的信息长度受限,需要配合limit进行控制。
?存在风险的代码举例: 2. SQL注入进阶2.1 时间注入攻击与布尔盲注类型,但是是由于对用用户的参数输入只有一种显示状态,不存在显示异常情况。 我们需要结合函数sleep和if(expr1,expr2,expr3)进行攻击。 在if中如果,expr1为TRUE,则if返回expr2,否则返回expr3。 例如使用:
表示如果数据库名长度大于1,查询休眠5秒,反应在页面中就是,请求的返回的时间大于5秒(在F12,网络面板可看到)。 使用如下:
判断数据库名第一个字符是否是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时,执行语句为:
通过后面的时间盲注语句爆出数据。 2.3 二次注入攻击二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。 二次注入,可以概括为以下两步:
2.4 宽字节注入攻击
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安全攻防渗透测试实战指南》第四章。 二次注入介绍来源:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |