SQL 手工注射原理小结

SQL 手工注射原理小结

SQL注入是一种常见的网络攻击手段之一,它可以通过直接向Web应用程序的数据库服务器发送恶意代码来获取数据库的非法访问权。针对SQL注入攻击中的手工注射原理总结如下:

1. SQL注入的原理

SQL注入是一种基于Web应用程序的安全漏洞,攻击者使用恶意字符序列,在Web应用程序的输入方面插入恶意代码,并使应用程序将恶意代码发送到后端数据库,以实现数据泄露、数据篡改、拒绝访问等恶意目的。主要有以下两种方式:

  • 数据输入未经过过滤验证:即应用程序对用户提交的数据没有进行合规性验证,包括表单、URL、Cookie、HTTP头等。攻击者可以通过向这些入口提交恶意输入字符串来欺骗应用程序绕过限制访问后端数据库,并将恶意代码插入到SQL查询中。

  • 未使用预处理语句:即应用程序没有采用数据库参数化技术来构建SQL查询语句。攻击者可以利用参数化技术的缺失,构建恶意SQL语句并与漏洞程序的查询合并,从而执行恶意代码。

2. 手工注射过程

手工注入是一种更为普遍、高级的攻击方式,需要针对特定漏洞程序进行编写。注入攻击者通过探测目标网站的SQL异常信息,确定与目标网站的漏洞类型和数据库环境状况。通常,注入攻击需要以下几步:

步骤1:定位注入点

通常情况下,注入入口是主页、Prove.asp、Article.asp等。攻击者可以通过搜索引擎等方式来寻找漏洞页面。

步骤2:探测注入方式

攻击者需要通过各种攻击方式来判断漏洞类型及其对应的数据库类型、版本信息。通常,探测可以通过输入以下测试字符串来进行:

  • 单引号
  • 双引号
  • 分号
  • 注释符( --)

同时,还可以在页面中插入一些HTML特例字符来验证注入点:

'>"><script>alert(19700309)</script>

步骤3:构造注入语句

通过探测,攻击者成功确定注入方式后,需要进一步构造注入的恶意代码。通常,攻击者可以通过输入以下字符来构建注入语句:

  • UNION / UNION ALL
  • SELECT
  • FROM
  • WHERE / AND
  • CONCAT / GROUP_CONCAT

常见的注入语句如下所示:

“’or 1=1--"
“'or 1=1 limit 1 --"
“'or 1=1 order by 1 --"
“'or 1=1 and rownum<3 --”

步骤4:尝试绕过防火墙

在以上步骤达成后,防火墙会进行过滤,攻击者需要进行绕过。一般情况下,绕过防火墙技术可归纳为以下几种:

  • 十六进制编码绕过:十六进制编码的字符在数据库中作为正常字符处理,可以绕过语句中的关键字。
  • base64编码绕过:base64编码可以对字符进行加密处理,逃过防火墙的过滤器。
  • 半角/全角绕过:将语句中红色字符进行半角/全角的转化,使防火墙过滤器无法识别。
  • 注释符绕过:在语句中添加注释符,可以使语句变得更加难以识别。

步骤5:获取敏感信息

通过以上步骤,攻击者已经成功进入目标网站的数据库中,接下来可以利用数据库中已知的表及数据获取敏感信息:

  • 数据库版本信息:通过查看数据库版本信息,可以了解目标服务器的详细信息和运行状态相关信息。
  • 表结构信息:通过查看表结构信息,可以了解数据库中的各种表结构及其数据类型、大小等。
  • 数据库账号信息:通过查看系统中所有用户的账号,密码等敏感信息。

3. 示例说明

示例1:

攻击者在运行一个网站时发现一个漏洞,该漏洞允许他通过注入来告诉网站如何处理SQL命令。他发现,当他将单引号 ‘ 插入姓名文本框后,会产生一个错误消息。他决定利用这个漏洞来执行自己的SQL查询。攻击者输入了以下代码:

' or 1=1 –

攻击者可以通过在语句中注入‘ 或 1=1’,绕过系统验证,继而构造出合法SQL查询语句,成功获得目标网站的数据库信息。

示例2:

攻击者发现一个名为“查看用户信息”的界面,其中有一些用户信息的查询项。这个画面似乎是通过页面和处理器生成,所以他决定尝试使用SQL注入攻击。攻击者在“用户名”栏中输入了以下代码:

Bob' or 1=1--

然后单击“检索”,系统返回了突破这个向用户展示的“查看”部分后的SQL查询结果,成功获取了目标网站的敏感信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL 手工注射原理小结 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 浅谈java面向对象的数组化信息处理

    浅谈Java面向对象的数组化信息处理 什么是数组化信息处理 数组化信息处理是指将一系列相同类型的数据存储在一个数组中,然后进行集中处理的过程。在Java中,数组是一种非常实用的数据结构,可以方便地将一组相同类型的数据进行集中管理和操作。 面向对象的数组化信息处理 在Java中,面向对象编程是一种重要的编程思想。面向对象的数组化信息处理就是将面向对象和数组化信…

    Java 2023年5月26日
    00
  • 指南:想成为一个JSP网站程序员吗?

    下面我将详细讲解“指南:想成为一个JSP网站程序员吗?”的完整攻略,希望对想要学习JSP网站开发的读者们有所帮助。 一、什么是JSP? JSP(JavaServer Pages)是一种基于Java语言和HTML的技术,它主要用于创建动态Web页面。JSP页面由一组HTML标签和Java代码组成,因此,JSP网站程序员必须具备Java编程和Web开发方面的技能…

    Java 2023年5月20日
    00
  • Java唤醒本地应用的两种方法详解

    Java唤醒本地应用的两种方法详解 在Java程序中,有时需要通过调用本地应用来实现某些功能,比如调用本地打印机打印文件、调用本地浏览器打开网页等。那么Java如何唤醒本地应用来实现这些功能呢?本文将详细介绍Java唤醒本地应用的两种方法。 1. Runtime.exec()方法 Java中可以通过Runtime.exec()方法来执行本地应用程序。该方法返…

    Java 2023年5月26日
    00
  • C#模拟实现抽奖小程序的示例代码

    让我详细讲解一下“C#模拟实现抽奖小程序的示例代码”的完整攻略。 步骤1:确定抽奖方式和奖项 首先确定抽奖的方式和奖项,可以是平等概率、权重抽奖等方式,同时也要定义好奖项的名称和中奖几率。 示例代码: //定义奖项名称 string[] rewardNames = {"一等奖", "二等奖", "三等奖&qu…

    Java 2023年5月19日
    00
  • Java之InputStreamReader类的实现

    Java提供了一种用于将字节流转换为字符流的机制,称为字符流与字节流之间的桥梁,这种机制的关键是使用InputStreamReader类。本篇攻略就是讲解InputStreamReader类的使用和实现原理。 InputStreamReader类概述 InputStreamReader类实现了将字节流转换为字符流的功能,它继承了Reader类,属于Reade…

    Java 2023年5月20日
    00
  • Java超细致讲解数组的使用

    Java超细致讲解数组的使用 什么是数组 数组是一种常见的数据结构,用来存储一系列相同类型的数据。在Java中,数组可以被看作是一组类似数据类型的变量集合。数组在Java编程中被广泛使用,是Java基础知识的重要部分之一。 数组的基本用法 定义数组 在Java中,定义一个数组需要指定元素数据类型和数组的长度。以下是一个定义int类型数组的示例: int[] …

    Java 2023年5月26日
    00
  • Java持久化框架Hibernate与Mybatis优劣及选择详解

    Java持久化框架Hibernate与Mybatis优劣及选择详解 1. 什么是Java持久化框架? Java持久化框架是为了简化Java应用程序与关系型数据库之间数据交互的过程所设计的一套框架。通过使用Java持久化框架,在Java应用程序中可以通过对象来操作数据库,这样可以实现面向对象编程与关系型数据库的无缝对接。 2. Hibernate与Mybati…

    Java 2023年5月31日
    00
  • Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

    Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法 深度优先搜索(DFS)和广度优先搜索(BFS)算法是常用的遍历和搜索算法,具有很高的实用价值。在Java中,我们可以通过使用递归函数和队列这两种数据结构来实现这两种算法。下面将对这两种算法进行详细的讲解。 深度优先搜索(DFS) 深度优先搜索(DFS)是一种常用的遍历算法,其思想就是从起点开始,…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部