《OWASP代码审计》学习——注入漏洞审计
一、注入的概念
注入攻击允许恶意用户向应用程序添加或注入内容和命令,以修改其行为。这些类型的攻击是常见且广泛的,黑客很容易测试网站是否易受攻击,攻击者也很容易利用这些攻击。如今,它们在尚未更新的遗留应用程序中非常常见。
二、SQL注入漏洞
最常见的注入漏洞是 SQL 注入,也很容易修复和防范。注入漏洞涵盖了 SQL、LDAP、Xpath、OS 命令、XML 解析器
1.漏洞导致的后果
敏感信息泄露
数据完整性受损(SQL注入可修改数据,添加新的数据或删除数据)
权限提升
进入后台
SQL命令不受不可信输入保护,SQL解析器无法区分代码和数据
字符串custQuery=从客户端选择客户名称、地址1,其中客户标识码=' " 请求.GetParameter("id")+" "
在开发人员不考虑安全性的遗留应用程序中,使用字符串连接来生成SQL语句是非常常见的。问题是这种编码技术不能告诉解析器语句的哪一部分是代码,哪一部分是数据,在用户输入被连接到SQL语句的情况下,攻击者可以通过向输入数据添加SQL代码来修改SQL语句。
2.防御方法
(1)HtmlEncode 所有用户输入。
(2)使用静态分析工具。静态的语言分析对.Net,Java,python 都比较准确。然而,当注入来自 JavaScript 和 CSS 时,静态分析可能会成为一个问题。
(3)参数化 SQL 查询。使用编程语言或框架提供的参数化语句的 SQL 方法,以便 SQL 解析器能够区分代码和数据。
(4)使用存储过程。存储过程通常有助于 SQL 解析器区分代码和数据。然而,存储过程可以用来构建动态的 SQL 语句,允许代码和数据混合在一起,导致它容易被注入。
(5)为开发人员提供安全编码最佳实践的培训。
三、盲注
通常,SQL 查询会返回呈现给用户的搜索结果。然而,在某些情况下,SQL 查询是在幕后进行的,这影响了页面的呈现方式。不过,攻击者仍然可以从各种用户界面元素的错误响应中收集信息。SQL 盲注攻击是一种向数据库询问真假问题并根据应用程序的响应来确定答案的攻击。
实际上,攻击者使用 SQL 查询来确定为有效的 SQL 返回哪些错误响应,以及为无效的SQL 返 回 哪 些 响 应 。 然 后 攻 击 者 就 可 以 探 查 真 实 的 数 据 。 例 如 , 审 计 名 为“user_password_table”的表是否存在。一旦他们获得了这些信息,他们就可以使用类似上述的攻击来恶意删除表,或者试图从表中返回信息(用户名“john”是否存在?盲目的 SQL注入也可以使用计时来代替错误消息。例如,如果无效的 SQL 需要 2 秒钟来响应,但是有效的 SQL 在 0.5 秒内返回,那么攻击者可以使用这些信息推断正确的拼接方式
四、参数化的SQL查询
参数化的 SQL 查询(有时称为预编译的语句)允许定义 SQL 查询字符串。以这样一种方式,客户端输入不会被视为 SQL 语法的一部分。例如:
string query = "select id,firstname,lastname from authors where forename = ?";
if(lastname!= NULL && lastname·length != 0)
{
query += "and surname ?";
}
query += ";";
PreparedStatement pstmt = connection.PreparedStatement pstmt(query);
pstmt.setString(1,firtsname);
if(lastname!=NULL && lastname.length !=0)
{
pstmt·setString(2,lastname);
}
这里没有使用lastname的值,不过仍然增加条件判断是否存在,然而,当SQL语句更大并且创建它设计更复杂的业务时,仍然存在风险。以下面的例子为例,该函数将根据名字或姓氏进行搜索
String query = "select id, firstname, lastname FROM authors",
if((firstname!=NULL&&firstname.length!=O)&&(lastname!=NULL&&lastname.length!=O))
{
query +=“WHERE forename =?AND surname =?”;
}
else if(firstname!=NULL&&firstname.length!=O)
{
query += “WHERE forename = ?";
}
else if(lastname!=NULL&&lastname.length!=O)
{query += "WHERE surname =?”;
}
query += “;";
PreparedStatement pstmt = connection.prepareStatement( query)
当给定名字或姓氏时,这种逻辑将是正确的,但是如果两者都没有给定,那么 SQL 状态将没有任何 WHERE 子句,并且将返回整个表。这不是 SQL 注入(攻击者除了没有传递两个值之外,没有做任何事情来导致这种情况),但是最终结果是相同的,尽管使用了参数化 查询,信息还是从数据库中泄露了。 因此,建议避免使用字符串连接来创建 SQL 查询字符串,即使是在使用参数化查询时。尤其是注意当连接涉及在 where 子句中构建任何项时。
五、使用灵活的参数化语句
功能需求通常需要基于用户输入灵活地执行 SQL 查询。
例如,如果最终用户为他们的交易搜索指定了一个时间跨度,那么应该使用这个时间跨度,或者他们可能希望基于姓氏或名字,或者基于两者进行查询。
在这种情况下,可以使用上面的安全字符串连接,但是从维护的角度来看,这可能会让未来的程序员误解安全连接和不安全版本(直接使用输入字符串值)之间的区别。
灵活的参数化语句的一个选项是使用“if”语句根据提供的输入值选择正确的查询,例如:
String query;
PreparedStatement pstmt;
if((firstname!=NULL && firstname.length!=O) && lastname!=NULL &&lastname.length !=O))
{
query = "Select id, firstname, lastname FRoM authors WHERE forename =? and surname=?"
pstmt = connection.prepareStatement( query );
pstmt.setString( 1, firstname );
pstmt.setString( 2, lastname );
}
else if (firstname !=NULL && firstname.length !=O){
query ="Select id, firstname, lastname FROM authors WHERE forename =?";
pstmt =connection.prepareStatement( query );
pstmt.setString( 7, firstname );
}
else if (lastname !=NULL && lastname.length !=O){
query = "Select id, firstname,lastname FROM authors WHeRE surname= ?",
pstmt =connection.prepareStatement( query );
pstmt.setString( 1, lastname);
}
else{
throw NameNotSpecifiedException(); }
六、PHP相关SQL注入
SQL注入攻击包括通过web应用程序中的客户端接口向后端数据库系统注入SQL查询部分。成功利用 SQL 注入的后果各不相同,从仅仅读取数据到修改数据或执行系统命令。PHP 中的 SQL 注入仍然是头号攻击方法,也是数据泄露的头号原因,例如:
<?php$pass = $_GET['pass']$con = mysql_connect('localhost','owasp','abc123');
mysql_select_db("owasp_php",$con)$sql = "select card from users where password = '".$pass."'";$result = mysql_query($sql);
在 PHP 中防止 SQL Injection 最常见的方法是使用诸如 addslashes()和 mysql_ real_escape_string()之类的函数,但是在某些情况下,这些函数也是会导致 SQL注入
(1)添加斜线
只有在用引号将查询字符串括起来的情况下,才可以避免使用 addslashes()进行 Sql注入。下面的例子仍然是脆弱的。
$id = addslashes($_GET['id'])
$query = 'select title from books where id = '.$id;
(2)mysql_real_escape_string()函数
mysql_real_escape_string()比 addslashes()稍微强大一点,因为它调用 mysql 的库函数 mysql_real_escape_string,该库函数在下列字符前添加反斜杠:\x00,\n,\r,','和\x1a。 与 addslashes()一样,mysql_real_escape_string()只有在查询字符串用引号括起来时才有效。
七、JAVA相关SQL注入
当 web 应用程序的输入在执行到后端数据库之前没有得到控制或清理时,就会发生SQL 注入。攻击者试图通过在其输入中传递 SQL 命令来利用此漏洞,因此会从数据库中创建不希望的响应,例如提供绕过网络应用程序中编程的授权和身份验证的信息。下列显示一个易受攻击的JAVA程序
HttpServeltRequest request = ...,
String userName = request.getParameter("name")Connection con = ...String query = "select * from users where name = '" + userName + "'";
con.execute(query)
输入参数“name”被传递给字符串查询,而没有任何适当的验证或确认。“SELECT* FROM users where name”等于字符串“name”的查询很容易被误用,以绕过不同于“name”的内容。
1..NET SQL注入
框架 1.0 和 2.0 可能比. NET 的更高版本更容易受到 SQL 注入的攻击。由于设计模式的正确实现和使用已经嵌入在 ASP.NET,如 MVC(也取决于版本),可以创建没有 SQL 注入的应用程序。但是,有时开发人员可能更喜欢直接在代码中使用 SQL 代码。
例子:开发人员创建了一个包含 3 个字段和提交按钮的网页,在“姓名”、“姓氏”和“身份证”字段中搜索员工,开发人员在代码中实现一个字符串连接的 SQL 语句或存储过程,
SqlDataAdapter thisCommand =new SqlDataAdapter("SELECT name, lastname FROM employees WHERE ei_id = "" + idNumber.Text + "*", thisConnection);
这段代码相当于下例中执行的 SQL 语句。
SqlDataAdapter thisCommand =new SqlDataAdapter("SearchEmployeeSP ‘" + idNumber.Text + ""”, thisConnection);
黑客然后可以通过网络界面“123’;DROP TABLE pubs --”插入以下标识:
select name,lastname from authors where ei_id = '123';drop table pubs --'
分号“;”为 sql 提供一个信号,表明它已经到达 SQL 语句的末尾,但是,黑客用这种恶意的 SQL 代码继续语句:DROP TABLE pubs
2.审计者操作
代码审计者需要确保 HQL 查询中使用的任何数据都使用 HQL 参数化查询,以便将其 用作数据而不是代码
3.参数集合
参数集合(如 SqlParameterCollection)提供类型审计和长度验证。如果使用参数集合,输入将被视为文字值,而 SQL Server 不会将其视为可执行代码,因此无法注入有效负载。使用参数集合可以强制执行类型和长度审计。超出该范围的值会触发例外。请确保您正确处理了异常。SQL 参数集合示例:Hibernate 查询语言(HQL)
using(SqlConnection conn = new SqlConnection(connectionString)){
DataSet dataObj= new DataSet();
SqlDataAdapter sqlAdapter = new SqlDataAdapter( "StoredProc",conn); sqIAdapter.SelectCommand.
CommandType =
CommandType.StoredProcedure;
sqlAdapter.SelectCommand.Parameters.Add("@usrld",SqlDbType.VarChar,15);
sqlAdapter.SelectCommand.Parameters["@usrld "].Value = UID.Text,;
Hibernate 通过对象/关系映射(ORM)方便了 Java 域对象的存储和检索。一个非常普遍的误解是 ORM 解决方案,像 hibernate 一样,是 SQL 注入证明。Hibernate 允许使用“原生 SQL”,并定义了一种专有的查询语言,叫做 HQL(Hibernate Query Language);前者倾向于 SQL 注入,后者倾向于 HQL 注入。
相关文章:
《OWASP代码审计》学习——注入漏洞审计
一、注入的概念 注入攻击允许恶意用户向应用程序添加或注入内容和命令,以修改其行为。这些类型的攻击是常见且广泛的,黑客很容易测试网站是否易受攻击,攻击者也很容易利用这些攻击。如今,它们在尚未更新的遗留应用程序中非常常见…...
Linux虚拟机中安装MySQL5.6.34
目录 第一章、xshell工具和xftp的使用1.1)xshell下载与安装1.2)xshell连接1.3)xftp下载安装和连接 第二章、安装MySQL5.6.34(不同版本安装方式不同)2.1)关闭防火墙,传输MySQL压缩包到Linux虚拟机2.2&#x…...
Django的FBV和CBV
Django的FBV和CBV 基于django开发项目时,对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV,function base views,其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…...
[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目
文章目录 1.参考项目2.技能点3.GO的Dockerfile配置后端的结构如图Dockerfile先手动docker调试服务是否可以启动报错 4.Vue的Dockerfile配置前端的结构如图nginx_docker.confDockerfile构建 5.docker-compose 整合前后端docker-compose.yml错误记录(1)ip端…...
springboot-mybatis的增删改查
目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作: 准备数据库表 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动…...
HTML5(H5)的前生今世
目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML(超文本标记语言)的第五个版本,于2014年由万维网联盟(W3C)正式推出。HTML5的前身可以追溯到互联…...
抽象工厂模式(Abstract Factory)
抽象工厂模式提供一个创建一组相关或相互依赖的对象的接口,而无须指定它们具体的类,每个子类可以生产一系列相关的产品。 The Abstract Factory Pattern is to provide an interface for creating families of related or dependent objects without s…...
Java 实现下载文件工具类
package com.liunian.utils;import lombok.SneakyThrows;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream;/*** ClassName DownloadFileUtils* Author liuyan 下载文件工具类…...
C# 12 预览版的新功能
作者:Kathleen Dollard 排版:Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在,您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验…...
34.利用matlab解 多变量多目标规划问题(matlab程序)
1.简述 学习目标:适合解 多变量多目标规划问题,例如 收益最大,风险最小 主要目标法,线性加权法,权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) ; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…...
暑假刷题第18天--7/30
165. 小猫爬山 - AcWing题库(dfs) #include<iostream> #include<string> #include<bitset> #include<cstring> #include<algorithm> using namespace std; const int N18; bool vis[N]; int a[N],n,ans,sum[N],k; bool cmp(int x,int y){retur…...
通向架构师的道路之Apache整合Tomcat
一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…...
如何消除“信息孤岛”对业务增长的威胁?
根据CMSWire的数据,员工平均每天要花36%的时间来查找和整合信息。但44%的情况下,他们找不到信息。这种时间和精力的浪费就是信息孤岛造成的。 什么是信息孤岛? 当部门存储数据并限制其他人访问数据时,就会出现信息孤岛ÿ…...
Kali部署dvwa和pikachu靶场
kali换源 进入 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib替换完后更新源 apt-get upadteDVWA靶场环境搭建 使用git从github上把DV…...
LeetCode解法汇总722. 删除注释
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给一个 C 程序,删除程序中的注释。这个程序source是一个数组&#x…...
Linux中的firewall-cmd
2023年8月4日,周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务?为什么会有服务?打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones࿰…...
python 最大归一化
最大归一化是将数据转化到[-1,1]范围之间。公式如下 其中|X|max为x特征的绝对值的最大值。 数据标准化算法介绍—数据建模工具_预处理_Max_字段 """ 最大绝对值归一化(max abs normalization ):也就是将数值变为单位长度&…...
Netty:ByteBuf写入数据、读出数据
介绍 Netty的ByteBuf数据位置索引是0开始的。 可以用ByteBuf的getByte(int index)方法从指定位置读出一字节,这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0,或者index 1大于ByteBuf的容量,就会抛出IndexO…...
C++(15):面向对象程序设计
面向对象程序设计概述 面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。 1.使用数据抽象,可以将类的接口与实现分离; 2.使用继承,可以定义相似的类型并对其相似关系建模&#x…...
2023牛客暑期多校训练营6-A Tree
2023牛客暑期多校训练营6-A Tree https://ac.nowcoder.com/acm/contest/57360/A 文章目录 2023牛客暑期多校训练营6-A Tree题意解题思路代码 题意 解题思路 最大价值和这个数据范围,一眼 d p dp dp。 直接在树上并不好处理,问题是如何有效转化、处理…...
Profinet协议在工业自动化中的无线通信应用解析
1. Profinet协议:工业自动化的"神经系统" 如果把工业自动化系统比作人体,那么Profinet协议就是这套系统的"神经系统"。它负责在控制器(大脑)、执行器(四肢)和传感器(感官&a…...
Ubuntu系统中Xmind8的安装与Java环境配置指南(实测可行)
1. 为什么选择Xmind8? 作为一个用了五年思维导图工具的老用户,我尝试过市面上几乎所有主流产品。在Ubuntu系统下,Xmind8依然是平衡性最好的选择——功能完善、运行稳定,而且对中文支持极佳。最新版Xmind虽然界面更现代,…...
工业大模型≠智能工厂!SITS2026曝光的12个AI原生落地陷阱,第9个正在吞噬你的技改预算
第一章:工业大模型≠智能工厂:SITS2026核心认知纠偏 2026奇点智能技术大会(https://ml-summit.org) 工业大模型在制造场景中的泛化能力常被误读为“开箱即用的智能工厂解决方案”,但SITS2026实证研究表明:大模型本身不具备设备控…...
当AI学会编程,我们还能做什么邑
基础示例:单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤: 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...
运维系列【仅供参考】:Centos7 后台执行(nohup命令)
Centos7 后台执行(nohup命令) Centos7 后台执行(nohup命令) nohup命令详解 nohup和&的区别 nohup 命令 & 2>&1的问题 Centos7 后台执行(nohup命令) nohup命令详解 nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)…...
HY-Motion 1.0避坑指南:写好Prompt指令,轻松生成高质量3D动画
HY-Motion 1.0避坑指南:写好Prompt指令,轻松生成高质量3D动画 你是不是也遇到过这种情况:兴冲冲地打开HY-Motion 1.0,输入一段文字,结果生成的3D动画要么动作僵硬,要么干脆跑偏,完全不是你想要…...
OpenClaw+优云智算Coding Plan:从灵感到成文,再到发布的全流程AI自动化鄙
1.安装环境准备 1.1.查看物理内存 [rootaiserver ~]# free -m 1.2.操作系统版本 [rootaiserver ~]# cat /etc/redhat-release 1.3.操作系统内存 [rootaiserver ~]# df -h /dev/shm/ 1.4.磁盘空间 [rootaiserver ~]# df -TH [rootaiserver ~]# df -h /tmp/ [rootaiserver ~]# d…...
第9章 函数-9.4 函数参数的传递
在Python中,根据实参的数据类型,可以将函数参数的传递模式分为2种,一是值传递,其包括整数、浮点数、字符串和元组;二是引用传递,其包括列表、字典、集合和对象。值传递和引用传递的区别是,函数参…...
Harness与OpenClaw:当企业级DevOps遇见个人AI助手
EXCLUSIVE 深度调查Harness与OpenClaw:当企业级DevOps遇见个人AI助手两种AI Agent范式正在重塑软件交付与个人生产力AI日报2026年4月8日阅读约20分钟【核心提要ベ2026年,AI Agent领域出现了两种截然不同的范式:以Harness为代表的企业级DevOp…...
科技向善:我们可以用技术为社会做些什么?
科技向善:我们可以用技术为社会做些什么? 在数字化浪潮席卷全球的今天,科技已不仅仅是提升效率的工具,更成为推动社会进步的重要力量。从人工智能到大数据,从区块链到物联网,技术的快速发展为人类生活带来…...
