当前位置: 代码迷 >> 综合 >> 漏洞挖掘——实验12 Cross-Site Scripting (XSS) Attack Lab
  详细解决方案

漏洞挖掘——实验12 Cross-Site Scripting (XSS) Attack Lab

热度:34   发布时间:2023-11-21 17:17:13.0

漏洞挖掘前言

题目

Lab

Cross-Site Scripting (XSS) Attack Lab

Pre

1、名词解释:double free,UAF (Use After Free),RELRO(Relocation Read Only),
Dangling pointer,Control Flow Guard

2、阅读下面这三篇文章:
UAF学习--原理及利用
https://www.cnblogs.com/alert123/p/4918041.html

Linux内核提权漏洞的分析和利用(CVE-2016-0728)
http://www.freebuf.com/vuls/93799.html

通过UseAfterFree实现命令执行
https://bbs.pediy.com/thread-221537.htm
 

 

解答

Lab

Cross-Site Scripting (XSS) Attack Lab

Task 1: Posting a Malicious Message to Display an Alert Window

发布一个帖子,用JavaScript的alert语句弹出警告窗口,参数为窗口中的字符串。

打开这个帖子时,就会弹出以下窗口。

 

 

Task 2: Posting a Malicious Message to Display Cookies

把cookie的值传入alert中作为参数,以显示浏览者的cookie

打开这个帖子时,就会弹出用户的cookie。

 

Task 3: Stealing Cookies from the Victim’s Machine

构造如下攻击脚本语句,把用户的cookie送到攻击者的主机:

显示出来的帖子是这样的,我们请求了一个不存在的图片:

在浏览者浏览这个帖子时,他的cookie值就被发送到了攻击者的电脑上:

 

Task 4: Impersonating the Victim using the Stolen Cookies

首先先用Firefox的LiveHTTPHeaders插件进行查看发帖的过程

我们需要将Java程序中的addRequestProperty和data进行修改,主要是加入我们监听到的cookie和sid。注意data中的sid需要修改。

编译并运行:

已经使用假冒被监听的用户发帖了:

 

Task 5: Writing an XSS Worm

为了能够让这个蠕虫可以以浏览者的身份发帖,我们首先要用JavaScript得到用户的cookie,这个在前面已经做过了;然后我们需要从此cookie中提取出section ID,这个可以用JavaScript提供的一些字符串操作函数来完成;最后要利用这个section ID构造一个发帖请求,发帖请求的格式可以通过LiveHTTPHeader来侦听一个真正的发帖请求来得到。

下面是实验代码,参考提供的实验报告:

这时点击task5这个帖子,就会自动冒名浏览者的身份发帖:

 

 

Task 6: Writing a Self-Propagating XSS Worm

要写一个可以自我复制的蠕虫,在上面的基础上主要是该蠕虫发的帖子的内容应该包含自身。

构建代码如下:

这样连被冒名的人发的帖子都会包含蠕虫病毒。

 

 

 

Pre

1、名词解释:double free,UAF (Use After Free),RELRO(Relocation Read Only),Dangling pointer,Control Flow Guard

Double Free:是指同一个指针free两次,在free时利用伪造chunk并且欺骗操作系统,达到修改内存的目的。double free的原理和堆溢出的原理相似,都是通过unlink这个双向链表删除的宏来利用的。只是double free需要由自己来伪造整个chunk并且欺骗操作系统。

UAF:是指释放了一个堆块后,并没有将该指针置为NULL,这样导致该指针处于悬空的状态,同样被释放的内存如果被恶意构造数据,就有可能会被利用。

RELRO:重定向只读,就是指由linker指定binary的一块经过dynamic linker处理过 relocation之后的区域为只读。

Dangling pointer悬空指针,一个指针所指的内存被释放后,这个指针就被称为悬空指针。访问悬空指针,结果随机。可能导致程序功能不正常,也可能导致程序崩溃。如果受到影响的是其它功能,问题通常很难定位。

Control Flow Guard:是一种高度优化的平台安全功能,旨在解决内存损坏漏洞。通过严格限制应用程序可以执行代码的位置,使得利用缓冲区溢出等漏洞执行任意代码变得更加困难。

 

 

2、阅读下面这三篇文章:

(1)UAF学习--原理及利用

https://www.cnblogs.com/alert123/p/4918041.html

文章首先提了两点:1、在free一块内存后,接着申请大小相同的一块内存,操作系统会将刚刚free掉的内存再次分配。2、通过p2能够操作p1,如果之后p1继续被使用(use after free),则可以达到通过p2修改程序功能等目的。

主要就是依靠以上两点,文章举了个实例来演示。主要思想就是在指针释放后再申请相同大小的内存,系统会将刚释放的地址进行分配,因此可以修改被释放的内存数据(例子中将strlen指向的真实strlen地址,修改为system的真实地址),这时候我们再接着使用被释放的指针(例子中看似执行call strlen,实则执行了system函数),则会造成UAF漏洞。

 

(2)Linux内核提权漏洞的分析和利用(CVE-2016-0728)

http://www.freebuf.com/vuls/93799.html

cve-2016-0728是一个linux平台上的UAF漏洞。漏洞主要的原因是由于keyrings组件当中的引用计数问题导致的。

如果某个进程导致内核对同一对象解引用0×100000000次,它会让内核认为该对象已没有被引用,因此会释放该对象。如果同一个进程还拥有对象的另一个合法引用,并在内核释放之后进行利用,便会造成内核引用一个已释放或者已重新分配的内存区域。通过这种方法,我们可以构造一个内存释放后再使用的漏洞(use-after-free)。

 

(3)通过UseAfterFree实现命令执行

https://bbs.pediy.com/thread-221537.htm

这也是一个UAF漏洞,漏洞程序是一个用链表实现的简单留言板。

在释放一个msg结构指针后,再分配时,就会返回相同的堆块,这时候就会将用户输入的内容(content)拷贝到content指针中,即我们构造的恶意内容,覆盖了原来的Message中的char* author、char* title等地址内容。我们把free函数的GOT表地址覆盖成system函数地址,下次在执行free函数时,就会执行system函数,从而达到命令执行。

 

 

 

 

 

  相关解决方案