20189216 《网络攻防技术》第十周作业

一、冯·诺依曼体系结构和图灵机的理解及其两者之间的区别和联系

1、冯·诺依曼体系结构

  • 定义:美籍匈牙利数学家冯·诺依曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构冯·诺依曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺依曼的这个理论称为冯·诺依曼体系结构。
  • 简介:从EDVAC到当前最先进的计算机都采用的是冯·诺依曼体系结构。所以冯·诺依曼是当之无愧的数字计算机之父。
  • 发展背景:
    电子计算机的问世,奠基人是英国科学家艾兰· 图灵(Alan Turing)和美籍匈牙利科学家冯· 诺依曼(John Von· Neumann)。图灵的贡献是建立了图灵机的理论模型,奠定了人工智能的基础。而冯· 诺依曼则是首先提出了计算机体系结构的设想。
    1946年美籍匈牙利科学家冯·诺依曼提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式存储,并确定了存储程序计算机的五大组成部分和基本工作方法。
    半个多世纪以来,计算机制造技术发生了巨大变化,但冯· 诺依曼体系结构仍然沿用至今,人们总是把冯· 诺依曼称为“计算机鼻祖”。
  • 体系结构:
    (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断. 在现在CPU的保护模式中,每个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这就变相的指定了哪些内存中存储的是指令哪些是数据)
    指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。
    (2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
    (3)指令由操作码和地址组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。
    (4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。
    (5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。
    (6)数据以二进制表示。
  • 特点:
    (1)计算机处理的数据和指令一律用二进制数表示
    (2)顺序执行程序
    计算机运行过程中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一概念称作顺序执行程序。
    (3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
  • 作用:
    冯.诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯.诺依曼计算机的组织结构,只是作了一些改进而已,并没有从根本上突破冯体系结构的束缚。冯.诺依曼也因此被人们称为“计算机之父”。然而由于传统冯.诺依曼计算机体系结构天然所具有的局限性,从根本上限制了计算机的发展。
    根据冯·诺依曼体系结构构成的计算机,必须具有如下功能:把需要的程序和数据送至计算机中。必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作。能够按照要求将处理结果输出给用户。
    将指令和数据同时存放在存储器中,是冯·诺依曼计算机方案的特点之一 计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成 冯·诺依曼提出的计算机体系结构,奠定了现代计算机的结构理念。
  • 冯·诺依曼体系工作原理
    程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。冯·诺依曼型计算机从本质上讲是采用串行顺序处理的工作机制,即使有关数据已经准备好了,也必须逐条执行指令序列,如下图所示:

    具体过程:
    (1)预先把指挥计算机如何进行操作的指令序列(就是程序)和原始数据输入到计算机内存中(拷贝),每条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地方去等步骤。
    (2)计算机在执行时,先从内存中取出第一条指令,通过控制器的译码器接收指令的要求,再从存储器中取出数据进行指定的运算和逻辑操作等,然后再按地址把结果送到内存中,如果需要向硬盘等存储设备存储数据,还需要将内存中的该数据存储到硬盘中。接下来取出第2条指令,在控制器的指挥下完成规定操作,依次进行下去,直到遇到停止指令。
    (3)计算机中基本上有两股信息在流动,一种是数据,即各种原始数据、中间结果和程序等,另一种信息是控制信息,它控制机器的各种部件执行指令规定的各种操作。

2、图灵机

  • 定义:图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。
  • 基本思想:
    图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:
    (1)在纸上写上或擦除某个符号;
    (2)把注意力从纸的一个位置移动到另一个位置;
    而在每个阶段,人要决定下一步的动作,依赖于 (a) 此人当前所关注的纸上某个位置的符号和(b) 此人当前思维的状态。
    为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由以下几个部分组成:
    1.一条无限长的纸带 TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号 表示空白。纸带上的格子从左到右依此被编号为 0,1,2,... ,纸带的右端可以无限伸展。
    2.一个读写头 HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
    3.一套控制规则 TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。
    4.一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。参见停机问题。
    注意这个机器的每一部分都是有限的,但它有一个潜在的无限长的纸带,因此这种机器只是一个理想的设备。图灵认为这样的一台机器就能模拟人类所能进行的任何计算过程。

    在某些模型中,读写头沿着固定的纸带移动。要进行的指令(q1)展示在读写头内。在这种模型中“空白”的纸带是全部为 0 的。有阴影的方格,包括读写头扫描到的空白,标记了 1,1,B 的那些方格,和读写头符号,构成了系统状态。(由 Minsky (1967) p.121 绘制)。
  • 查阅相关资料博客
    1、带你深入理解图灵机
    2、带你深入理解图灵机——天才所在的时代
    3、图灵机简介和原理分析

3、两者之间的区别和联系

二、对“程序=指令+数据”的理解

  • 程序:计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
    它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写作的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。一般的,以英语文本为基础的计算机程序要经过编译、链接而成为人难以解读,但可轻易被计算机所解读的数字格式,然后放入运行。程序是一个指令序列。

  • 程序的运行:
    为了使计算机程序得以运行,计算机需要加载代码,同时也要加载数据。从计算机的底层来说,这是由高级语言(例如Java,C/C++,C#等)代码转译成机器语言而被CPU所理解,进行加载。
    如果您在一个符合大多数的计算机上,操作系统例如Windows、Linux等,加载并执行很多的程序,在这种情况下,每一个程序是一个单独的映射,并不是计算机上的所有可执行程序。
    它是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。

  • 普林斯顿结构:
    普林斯顿结构又做冯·诺伊曼结构,在一台基于最常见的普林斯顿结构的计算机上,程序通常是通过外存来加载到计算机之内。如果基于这种结构的计算机之上没有程序作为支撑,通常无法工作。所有程序都基于机器语言运行,机器语言是一个以二进制数字(0和1)构成的语言。
    一般的,程序是由高级语言编写,然后在编译的过程中,被编译器/解释器转译为机器语言,从而得以执行。

  • 指令:计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令。
    计算机程序发给计算机处理器的命令就是“指令(instruction)”。最低级的指令是一串0和1,表示一项实体作业操作要运行(如“Add”)。根据指令类型,某个具体的存储领域被称作“寄存器(register)”,里面包含了可用于调出指令的数据或数据存储位置。计算机的汇编语言(assembler)中,每种语言一般只响应单一的处理器指令。而高级语言的每种语言经过程序编辑后能响应多个处理器指令。在汇编语言中,宏指令(macro instruction)在汇编程序处理过程中会扩展为多个指令(以编码过的源宏定义为基础)。

  • 组成形式:
    指令是指示计算机执行某种操作的命令。它由一串二进制数码组成。
    一条指令通常由两个部分组成:操作码+地址码。
    操作码:指明该指令要完成的操作的类型或性质,如取数、做加法或输出数据等。
    地址码:指明操作对象的内容或所在的存储单元地址。

  • 数据:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

  • 数据结构的重要意义:
    一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。
    在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。
    选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

  • 结构算法:
    算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。不同数据结构有其相应的若干运算。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序等。
    数据的运算是数据结构的一个重要方面,讨论任一种数据结构时都离不开对该结构上的数据运算及其实现算法的讨论。
    数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。
    数据类型是一个值的集合和定义在这个值集上的一组操作的总称。数据类型可分为两类:原子类型、结构类型。一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。可以认为,数据类型是在程序设计中已经实现了的数据结构。另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。

三、研究以下安全问题(要有实践),结合上面内容谈谈他们有什么共同点,如何抽象出统一的防范方法?(缓冲区溢出 XSS攻击 SQL注入攻击)

1、缓冲区溢出漏洞实验

  • 实验简介:
    缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

  • 实验准备:
    实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备。

(1)输入命令安装一些用于编译32位C程序的东西:

  • sudo apt-get update
  • sudo apt-get install lib32z1 libc6-dev-i386(第一次安装时没有截图成功)
  • sudo apt-get install lib32readline-gplv2-dev

(2)输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash:

  • 实验步骤:

(1)初始设置:
Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:sudo sysctl -w kernel.randomize_va_space=0

此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。
linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序:
sudo su
cd /bin
rm sh
ln -s zsh sh
exit

(2)shellcode
一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。
观察以下代码:

本次实验的shellcode,就是刚才代码的汇编版本:
\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

(3)漏洞程序
把以下代码保存为“stack.c”文件,保存到 /tmp 目录下。代码如下:

通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
编译该程序,并设置SET-UID。命令如下:
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit

GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。
而 -z execstack 用于允许执行栈。

(4) 攻击程序
我们的目的是攻击刚才的漏洞程序,并通过攻击获得root权限。
把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下。代码如下:

注意上面的代码,“\x??\x??\x??\x??”处需要添上shellcode保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。
而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode保存在 buffer+100 的位置。
现在我们要得到shellcode在内存中的地址,输入命令:
gdb stack
disass main
截图结果:

接下来的操作:

根据语句 strcpy(buffer+100,shellcode); 我们计算shellcode的地址为 0xffffd2a0(十六进制)+100(十进制)=0xffffd304(十六进制)
现在修改exploit.c文件!将 \x??\x??\x??\x?? 修改为 \x04\xd3\xff\xff
然后,编译exploit.c程序:gcc -m32 -o exploit exploit.c

(5)攻击结果

2、SQL注入攻击

(1)SQL语言
结构化查询语言(Structured Query Language)简称SQL:是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

(2) SQL注入
SQL注入能使攻击者绕过认证机制,完全控制远程服务器上的数据库。SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令,这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术。通过把SQL命令插入到Web表单提交框、输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令。

(3)SQL注入危害

  • 非法读取、篡改、添加、删除数据库中的数据。
  • 盗取用户的各类敏感信息,获取利益。
  • 通过修改数据库来修改网页上的内容。
  • 私自添加或删除账号。
  • 注入木马等等。

(4) SQL注入攻击的过程及原理
SQL注入攻击是指攻击者通过在应用程序后台数据库的操作中插入一些恶意SQL语句来达到操作数据库数据的目的。具体来讲就是,SQL注入攻击是攻击者利用Web应用程序,通过输入非法字符,来构造恶意的SQL语句,最终将恶意的SQL语句注入到应用的后台数据库服务器中。数据库服务器执行这些恶意SQL语句后,不会按照数据库数据表设计者的意图去执行某些操作,而是进行一些非法的操作,进而造成数据库数据的丢失,损坏等后果。这种注入攻击方式困扰着众多Web应用。

(5)SQL注入攻击的手段

  • 没有正确过滤转义字符
    应用系统的使用者输入内容,在没有经过前端验证,字符串过滤的情况下,就会发生SQL注入攻击。非法的输入传递给后台的SQL语句,SQL语句最终在数据库中执行非法的操作。
  • Incorrect type handling
    由于Web应用使用者所输入的参数,在传递过程中并不是强类型,也没有实施必要的类型转换,那么就会发生Incorrect type handling这种情况。比如,应用编码者对用户输入的内容并没有进行合法性检验,原本应该输入数字,但是编码者并未进行类型检验。
  • 数据库自身的漏洞
    某些数据库由于自身设计以及实现的漏洞,就会导致攻击者利用这些漏洞对数据库服务器进行攻击。SQLsever有些漏洞会导致攻击者能够越过访问权限,执行越权的操作,这样对数据库的危害也是极大的。因此应该及时修补数据库漏洞。
  • 盲目SQL注入式攻击
    如果应用系统对于承受的SQL注入攻击没有察觉,没有对攻击者进行有效的防范,就会发生盲目的SQL注入攻击。存在SQL注入攻击点的网页可能不会给攻击者展示有用的信息,它会根据注入攻击者注入到合法语句中的不同逻辑,进而显示不同的网页内容,这种攻击手段非常的耗费精力,需要攻击者不断的精心构造注入语句,一旦发现注入点和注入目标就可以很顺利的获取想要的信息。
  • 条件响应
    目前这种SQL注入攻击方式能够在应用程序的网页中进行逻辑计算。
  • 条件性差错
    通过构造逻辑错误来判断应用程序是否具有注入点。总结归纳出该应用所使用的数据库的类型,数据库中包含的一些数据表名,字段名等,这样就可以为接下来注入点的寻找提供帮助。
  • 时间延误
    通过构造SQL注入语句,使得数据库判断逻辑时间变长,通过判断应用页面的加载时间来判断构造的SQL注入语句是否正确。

(6)攻击的过程主要分为如下步骤

  • 通过多次输入不同的内容来测试当前的应用系统是否可以进行SQL注入,如果可以,那么进行第二步,如果不可以,则放弃。
  • 通过不断的输入测试数据,进而寻找SQL注入攻击点,找到SQL注入攻击点后,接下来就要寻找网站中可以被利用的SQL注入的漏洞。在这里,我们可以通过输入一些特殊字符,语句来寻找漏洞,同时我们也可以根据浏览器的返回的数据库信息,进而可以判断该Web应用所使用的数据库的类型。接下来,我们就可以构造数据库的查询语句,从而找寻注入点。
  • 暴力猜解数据库中存储的一些用户名和密码,一般情况下,服务器的数据库数据表中存放的表名、字段名,字段类型等信息都是有一定规律的。可以通过构建特殊数据库语句,这样可以在数据库通过查询语句来获得用户的表名、字段名、用户名和密码的长度以及内容,网络上存在着大量的SQL自动化注入工具,这个暴力猜解的过程可以通过这些工具来快速的实现。
  • 可以着手寻找Web应用管理后台的入口。通常情况下,Web后台管理的界面肯定是不会对于普通用户进行开放的,因此后台管理界面的路径是未知的。不过可以利用网上的一些路径扫描工具来寻找后台真正的登陆路径。这些路径其实是有规律可循的,经过不断的尝试就可以找到真正的管理后台入口的地址。
  • 此时可以进行系统入侵和破坏了。因为刚刚得到了用户表的用户名和密码,这样一来,就能够获取到管理员的用户名和密码,从而拥有了管理员权限,登录管理员账号,进入应用的管理后台,随后就可以进行篡改网页、上传木马、修改、泄漏用户信息等一系列的破坏行为,并进一步入侵数据库服务器。

(7) 针对SQL注入攻击的检测方法
作为排在威胁Web应用安全十大攻击手段之首的SQL注入攻击,在安全产业界和学术界有着很多的深入研究。在传统的安全产业界主要检测和识别SQL注入攻击有如下两种技术:一种是基于特征的关键字匹配技术;另一种是基于异常检测技术。

  • 基于特征的关键字匹配技术:它包含许多关键字匹配算法,一个好的匹配算法是这项技术好坏的评价标准之一,目前主要使用的检测技术就是基于特征的关键字匹配技术,这种技术的核心思想是在SQL语句中抽取出特殊字符(例如#等),提取数据库的关键字(例如:select、union等)。通过提取出来的特殊字符来判断该SQL语句是否进行了SQL注入攻击。
  • 基于异常检测技术:它包含基于程序行为的异常检测技术,基于数据流的异常检测技术和基于聚类的异常检测技术等手段,这种检测技术被业界分为学习期与检测期。在学习期,检测系统必须拥有不受影响的网络系统,必须针对需要检测的Web应用具有专业的学习机制,只有当检测系统经过不断的学习,进而学习成熟后,才能进入系统检期。在系统的检测期,检测系统利用其在学习期演变成的准确模型,对传递进系统来的用户输入数据进行系统地全面分析。

(8)针对SQL注入攻击的防御措施

  • 普通用户与系统管理员的权限要严格区分
  • 使用参数化的过滤性SQL语句
  • 需要加强对用户输入的验证
  • 使用数据库自带的安全参数
  • 避免出现一些详细的错误消息
  • 多层环境防治SQL注入式攻击
  • 使用专业的漏洞扫描工具
  • 对数据进行加密处理
  • 在Web应用程序开发过程的所有阶段实施代码的安全检查

SQL注入攻击防范
(1)在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。
(2)在组合SQL字符串时,先针对所传入的参数作字元取代(将单引号字元取代为连续2个单引号字元)。
(3)如果使用PHP开发网页程序的话,亦可打开PHP的魔术引号(Magic quote)功能(自动将所有的网页传入参数,将单引号字元取代为连续2个单引号字元)。
(4)其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
(5)使用SQL防注入系统。

XSS攻击

  • 基于特征的防御
    XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。
    传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“JavaScript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。这种检测方法的缺陷显而易见:骇客可以通过插入字符或完全编码的方式躲避检测:
    (1)在javascript中加入多个tab键,得到
    < IMG SRC="jav ascript:alert('XSS');" >;
    (2)在javascript中加入(空格)字符,得到
    < IMG SRC="javascri pt:alert('XSS');" >;
    (3)在javascript中加入(回车)字符,得到
    < IMG SRC="jav
    ascript:alert('XSS');" >;
    (4)在javascript中的每个字符间加入回车换行符,得到
    < IMG SRC="javascrip\r
    \nt:alert('XSS');" >
    (5)对”javascript:alert(‘XSS’)”采用完全编码,得到
    < IMGSRC=javascrip?74:alert('XSS') >
    上述方法都可以很容易的躲避基于特征的检测。而除了会有大量的漏报外,基于特征的
    还存在大量的误报可能:在上面的例子中,对上述某网站这样一个地址,由于包含了关键字“javascript”,也将会触发报警。
  • 基于代码修改的防御
    和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
    对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
    实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。
    当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞。
posted @ 2019-05-05 19:28  鲍政李20189216  阅读(582)  评论(0编辑  收藏  举报