webgoat-(A1)injection

SQL Injection (intro)

SQL 命令主要分为三类:
数据操作语言 (DML)DML 语句可用于请求记录 (SELECT)、添加记录 (INSERT)、删除记录 (DELETE) 和修改现有记录 (UPDATE)。
如果攻击者成功地将 DML 语句“注入”到 SQL 数据库中,则可能会破坏系统的机密性(使用 SELECT 语句)、完整性(使用 UPDATE 语句)和可用性(使用 DELETE 或 UPDATE 语句)

数据定义语言 (DDL)DDL 命令通常用于定义数据库的架构。架构是指数据库的整体结构或组织,在 SQL 数据库中,包括表、索引、视图、关系、触发器等对象。
如果攻击者成功地将 DDL 类型的 SQL 命令“注入”到数据库中,他可能会破坏系统的完整性(使用 ALTER 和 DROP 语句)和可用性(使用 DROP 语句)。

数据控制语言 (DCL)DCL 可用于撤消和授予用户对数据库对象(如表、视图和函数)的权限。如果攻击者成功地将 DCL 类型的 SQL 命令“注入”到数据库中,他可能会破坏系统的机密性(使用 GRANT 命令)和可用性(使用 REVOKE 命令)。例如,攻击者可以授予自己对数据库的管理员权限或撤消真正管理员的权限。DCL命令用于实现对数据库对象的访问控制。GRANT - 授予用户对数据库对象的访问权限
REVOKE - 撤销以前使用 GRANT 授予的用户权限
GRANT语句用于授权用户或角色执行特定的数据库操作或访问特定的表。
下面是一个示例,演示如何使用GRANT语句将表的SELECT权限授予用户"username":
GRANT SELECT ON table_name TO username;
在上面的语句中,将"table_name"替换为您要授予权限的表的实际名称,并将"username"替换为您要授予权限的用户的实际名称。

SQL注入

SQL注入(也称为SQLi)是最常见的网络黑客技术之一。SQL 注入攻击包括通过从客户端到应用程序的 SQL 查询输入插入或“注入”恶意代码。如果处理不当,SQL注入会严重影响数据的完整性和安全性。
SQL注入可以用于读取单个用户的数据。以下是黑客可能输入表单字段(或接受用户输入的任何位置)以试图利用 SQL 注入漏洞的几个数据示例:

Smith’ OR ‘1’ = '1
结果,其中将返回 Users 表中的所有条目SELECT * FROM users WHERE name = ‘Smith’ OR TRUE;

Smith’ OR 1 = 1; –
结果,与第一个示例一样,也将返回 users 表中的所有条目SELECT * FROM users WHERE name = ‘Smith’ OR TRUE;–';

Smith’; DROP TABLE users; TRUNCATE audit_log; –
链接多个 SQL 命令,以便 DROP users 表和删除 audit_log 表中的所有条目

成功的 SQL 注入漏洞可以:
从数据库中读取和修改敏感数据、对数据库执行管理操作、关闭审核或 DBMS、截断表和日志、添加用户、恢复 DBMS 文件系统上存在的给定文件的内容、向操作系统发出命令
SQL 注入攻击允许攻击者
欺骗身份、篡改现有数据、导致否认问题,例如取消交易或更改余额、允许完全披露系统上的所有数据、销毁数据或使其不可用、成为数据库服务器的管理员

字符串 SQL 注入
代码中的查询生成一个动态查询,如上一示例所示。查询是通过连接字符串来构建的,使其容易受到字符串 SQL 注入的影响:

“SELECT * FROM user_data WHERE first_name = ‘John’ AND last_name = '” + lastName + “'”;
数字 SQL 注入
代码中的查询生成一个动态查询,如上一示例所示。代码中的查询通过连接一个数字来构建动态查询,使其容易受到数字 SQL 注入的影响:
"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;
SQL 查询链接?
查询链接顾名思义。使用查询链接,您可以尝试将一个或多个查询追加到 实际查询。您可以使用 ; 元字符来执行此操作。A ;标记 SQL 语句的结尾;它允许在初始查询之后立即启动另一个查询,甚至不需要开始新行。

SQL注入如何影响CIA原则?

  • 使用字符串 SQL 注入损害机密性,如可以查询不应该查到的信息。
  • 通过查询链接损害完整性,使用查询链接,您可以尝试将一个或多个查询追加到 实际查询。您可以使用 ; 元字符来执行此操作。A ;标记 SQL 语句的结尾;它允许在初始查询之后立即启动另一个查询,甚至不需要开始新行。可以改变数据库数据。
  • 有许多不同的方法可以违反可用性。 如果帐户被删除或其密码被更改,则实际所有者将无法再访问此帐户。 攻击者还可以尝试删除部分数据库,甚至删除整个数据库,以使数据无法访问。 撤销管理员或其他用户的访问权限是影响可用性的另一种方式;这将阻止这些用户以 WHDLE 的形式访问数据库的特定部分,甚至整个数据库。

0x10

Login_Count:1
User_Id: 1 or 1=1

0x11

注意用–使后面的语句无效。
在这里插入图片描述

0x12

employee name: '; update employees set salary=1000000 where last_name=‘Smith’;-- -tan: 不填或者随便填

0x013

'; drop table access_log;-- -
在这里插入图片描述

SQL Injection (advanced)

特殊字符

/* */ are inline comments
– , # are line comments

Example: SELECT * FROM users WHERE name = ‘admin’ – AND pass = ‘pass’
; 允许语句连接

Example: SELECT * FROM users; DROP TABLE users;
',+,|| 允许语句拼接
Char() strings without quotes

Example: SELECT * FROM users WHERE name = ‘+char(27)’ OR 1=1
特别声明

SQL UNION 操作符

SQL UNION 操作符合并两个或多个 SELECT 语句的结果。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

joion

Join 运算符用于根据相关列合并两个或多个表中的行

SELECT * FROM user_data INNER JOIN user_data_tan ON user_data.userid=user_data_tan.userid;
有关JOINS的更多详细信息,请访问:https://www.w3schools.com/sql/sql_join.asp

0x13

ji’ union select userid,user_name,user_name,user_name,user_name,password,userid from user_system_data–
用union拼接即可,需要注意第二个语句字段数和字段类型需要和user_data表的保持一致即可。
在这里插入图片描述
’ or true union select 1,‘2’,‘3’,‘4’,‘5’,password, 7 from user_system_data–
这种查询也可以,因为第二个语句只要password结果,所以让其他为int的用数字,char的用字符。
在这里插入图片描述

SQL盲注

在上面的SQL注入,在文本框输入后,会直接在页面显示我们输入的结果。
SQL盲注,即输入后,结果不显示。这种注入,只能询问一些问题。
SQL盲注分为content-based and time-based SQL injections.
如https://shop.example.com/?article=4 and 1=1 如果返回不存在,则说明没有SQL注入问题。
基于时间注入:article = 4; sleep(10) – 如果存在注入,则在返回结果之前,会等待10s

预处理语句

在SQL中,预处理语句(prepared statement)和语句(statement)都是用于执行SQL查询的方式,但它们之间有一些关键区别。

预处理语句(Prepared Statement):
预处理语句是一种SQL语句的预编译形式,它允许在执行之前对SQL语句进行编译。编译后的预处理语句可以重复使用,而不需要每次执行时都重新编译。预处理语句通常用于执行参数化查询,即带有动态插入值的查询。这样可以提高执行效率,并减少SQL注入攻击的风险。预处理语句通常使用占位符(如问号标记)来表示动态插入的值,这些占位符在执行预处理语句时会被实际的值替换。
示例(使用问号占位符):

sql
PREPARE my_prepared_statement FROM ‘SELECT * FROM customers WHERE name = ?’;
EXECUTE my_prepared_statement USING ‘John’;
语句(Statement):
语句是SQL查询的基本单位,它是一条完整的SQL命令,用于执行特定的操作。语句可以是静态的,也可以是动态的,这取决于是否包含变量或参数。静态语句是固定的SQL查询,不包含任何变量或参数。动态语句包含变量或参数,需要在执行时提供实际的值。语句的执行效率相对较低,因为每次执行都需要重新编译。
示例(静态语句):

sql
SELECT * FROM customers;
示例(动态语句):

sql
SELECT * FROM customers WHERE name = ‘John’;
总结:
预处理语句和语句的主要区别在于预处理语句是预先编译的,可以重复使用,适用于参数化查询,而语句是即时的,每次执行都需要重新编译,适用于静态查询或不含变量的动态查询。在实际应用中,为了提高性能和安全性,通常推荐使用预处理语句来执行参数化查询。

如何防止SQL注入?

如下方法是针对 SQL 注入的最佳防御措施。它们要么没有可以解释的数据,要么将数据视为绑定到列而不进行解释的单个实体。
1、静态查询
SELECT * FROM products;
SELECT * FROM users WHERE user = “'” + session.getAttribute(“UserID”) + “'”;
2、 参数化查询使用预编译的SQL语句来执行查询
String query = “SELECT * FROM users WHERE last_name = ?”;
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, accountName);
ResultSet results = statement.executeQuery();
使用预编译的SQL语句(PreparedStatement)有几个优点:
防止SQL注入:预编译的SQL语句使用占位符(?)来代替动态插入的值,这样就可以防止恶意用户在查询中注入额外的SQL代码。
提高性能:预编译的SQL语句只需要编译一次,然后可以多次执行,这样可以提高数据库的性能。

public static bool isUsernameValid(string username) {RegEx r = new Regex("^[A-Za-z0-9]{16}$");return r.isMatch(username);
}// java.sql.Connection conn is set elsewhere for brevity.
PreparedStatement ps = null;
RecordSet rs = null;
try {pUserName = request.getParameter("UserName");if ( isUsernameValid (pUsername) ) {ps = conn.prepareStatement("SELECT * FROM user_tableWHERE username = ? ");ps.setString(1, pUsername);rs = ps.execute();if ( rs.next() ) {// do the work of making the user record active in some way}} else { // handle invalid input }
}
catch (...) { // handle all exceptions ... }

3、存储过程
仅当存储过程不生成动态 SQL 时
4、即使采用了参数化查询,也需要进行输入验证,要同时进行这两种处理。
因为可以防止其他类型的攻击存储在数据库中,如存储的 XSS、信息泄露、逻辑错误 - 业务规则验证、SQL注入

0x05

在这里插入图片描述

0x06

编写一段代码实现查询name并防止SQL注入

try {Connection conn = null;conn=DriverManager.getConnection(DBURL,DBUSER,DBPW);//连接数据库String query="select * from users where name=?";//查询语句PreparedStatement s=conn.prepareStatement(query);//PreparedStatement对象是预编译的SQL语句,可以传递参数,并执行查询。s.setString(1,"Bob");//将查询的参数值设置为"Bob"。参数的索引从1开始,对应于查询字符串中的参数占位符。ResultSet results=s.executeQuery();//执行查询,并将查询结果存储在ResultSet对象results中} catch (Exception e) {System.out.println("Oops. Something went wrong!");
}

Path traversal 目录遍历

路径(目录)遍历是一种漏洞,攻击者能够访问或存储外部的文件和目录 应用程序运行的位置。这可能会导致从其他目录读取文件,如果是文件,则会导致读取文件 上传覆盖关键系统文件。

它是如何工作的?
例如,假设我们有一个应用程序,它托管了一些文件,并且可以在下面请求它们 格式:http://example.com/file=report.pdf
现在,作为攻击者,您当然对其他文件感兴趣,所以 你试试http://example.com/file=…/…/…/…/…/etc/passwd/etc/passwd…/在这种情况下,您尝试爬到文件系统的根目录 然后进入以获取对此文件的访问权限。称为点-点-斜杠,这是这种攻击的另一个名称

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

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

相关文章

MySQL - 库的操作

目录 1.库的操作1.1创建数据库1.2创建数据库案例 2.字符集和校验规则3.操纵数据库4.备份和恢复5.查看连接情况 1.库的操作 1.1创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specifica…

[架构之路-254/创业之路-85]:目标系统 - 横向管理 - 源头:信息系统战略规划的常用方法论,为软件工程的实施指明方向!!!

目录 总论: 一、数据处理阶段的方法论 1.1 企业信息系统规划法BSP 1.1.1 概述 1.1.2 原则 1.2 关键成功因素法CSF 1.2.1 概述 1.2.2 常见的企业成功的关键因素 1.3 战略集合转化法SST:把战略目标转化成信息的集合 二、管理信息系统阶段的方法论…

十年JAVA搬砖路——Linux搭建Ldap服务器。

1.安装命令 yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel2.启动ldap systemctl start slapd systemctl enable slapd3.修改密码 slappasswd Aa123456获得返回的密码加密密码串: {SSHA}DkSw0…

二维码智慧门牌管理系统升级:一键报警让你的生活更安全!

文章目录 前言一、升级解决方案的特点二、实施步骤 前言 随着科技的不断进步,我们的生活正在逐渐变得更加智能化。可以想象一下,如果你家的门牌也能拥有这种智能升级,将会带来怎样的改变?今天,让我们一起探讨这令人兴…

MySQL基础『数据库基础』

✨个人主页: 北 海 🎉所属专栏: MySQL 学习 🎃操作环境: CentOS 7.6 阿里云远程服务器 🎁软件版本: MySQL 5.7.44 文章目录 1.数据库概念1.1.什么是数据库1.2.数据库存储介质1.3.常见数据库 2.数…

用于3D Visual Grounding的多模态场景图

文章目录 引言方法1. Language Scene Graph Module Paper:《Free-form Description Guided 3D Visual Graph Network for Object Grounding in Point Cloud》【ICCV’2021】 Code:https://github.com/PNXD/FFL-3DOG 引言 3DVG任务有以下三个挑战&#x…

hadoop配置文件自检查(解决常见报错问题,超级详细!)

本篇文章主要的内容就是检查配置文件,还有一些常见的报错问题解决方法,希望能够帮助到大家。 一、以下是大家可能会遇到的常见问题: 1.是否遗漏了前置准备的相关操作配置? 2.是否遗的将文件夹(Hadoop安装文件夹,/dat…

高性能网络编程 - 关于单台服务器并发TCP连接数理论值的讨论

文章目录 概述操作系统的限制因素文件句柄限制1. 进程限制2. 全局限制 端口号范围限制 概述 单台服务器可以支持的并发TCP连接数取决于多个因素,包括硬件性能、操作系统限制、网络带宽和应用程序设计。以下是一些影响并发TCP连接数的因素: 服务器硬件性…

文本生成评估指标简单介绍BLEU+ROUGE+Perplexity+Meteor 代码实现

以下指标主要针对两种:机器翻译和文本生成(文章生成),这里的文本生成并非是总结摘要那类文本生成,仅仅是针对生成句子/词的评价。 首先介绍BLEU,ROUGE, 以及BLEU的改进版本METEOR;后半部分介绍P…

Go 多版本管理

在日常开发工作过程中,很多时候我们都需要在自己的机器上安装多个go版本,像是go1.16引入的embed,go1.18引入了泛型;又或是自己本地使用的是最新版,但公司的项目中使用的go1.14、go1.13甚至是更早的版本。 那么有没有既…

Spring Boot中解决跨域问题(CORS)

1. 跨域介绍 首先解释什么是跨域,跨域就是前端和后端的端口号不同;会产生跨域问题,这里浏览器的保护机制(同源策略)。 同源策略:前端和后端的协议、域名、端口号三者都相同叫做同源。 我们看一下不同源&am…

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …

CCF-CSP真题《202309-4 阴阳龙》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202309-4试题名称:阴阳龙时间限制:2.0s内存限制:1.0GB问题描述: 问题描述 西西艾弗岛的下方是一个庞大的遗迹群,神…

openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144)实现

文章目录 openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144)实现概述飞达控制底板硬件电路程序的修改END openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144)实现 概述 现在调试自己的openpnp设备, 在收尾, 将飞达控制板弄好, 能正常控制设备飞达安装平台上装满…

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档:Taro 文档 页面路由配置,配置在app.config.ts里面的pages里: window用于设置小程序的状态栏、导航条、标题、窗口背景色,其配置项如下: tabBar配置:如果小程序是一个多 tab 应用&…

2.10 CSS BFC

1.简介 BFC是Block Formatting Context(块级格式上下文),可以理解成元素的一个“特异功能”。该“特异功能”,在默认的情况下处于关闭状态;当元素满足了某些条件后,该"特异功能被激活。所谓激活"特异功能”,专业点说就…

京东数据平台:2023年Q3季度黄金市场数据分析

继9月国内黄金市场持续上涨后,进入10月中下旬后,黄金行情再度反转,多家品牌金饰价格再次突破600元/克,达到611元/克。 今年以来,黄金行情不断走俏,销售市场也有明显增长。根据鲸参谋平台的数据显示&#xf…

微服务之Eureka

文章目录 一、Eureka介绍1.Eureka的作用2.总结 二.搭建Eureka服务端步骤1.导入maven依赖2.编写启动类,添加EnableEurekaServer注解3.添加application.yml文件,编写下面的配置: 三.注册Eureka客户端服务提供者(user-service&#x…

Amlogic IR模块Linux驱动分析

目录 一、简介 1、了解IR协议 2、代码结构介绍 二、硬件原理及连接 2、芯片手册解读 三、驱动代码分析 1、设备树介绍 1)reg 2)protocol 3)pinctrl 4)map 2、linux驱动介绍 1)makefile 2)数据…