A-A+

From PNG tEXt to Persistent XSS (从文本到持久性XSS PNG)

2018年06月06日 10:58 汪洋大海 暂无评论 共2436字 (阅读3,183 views次)

博主简单分析在阅读此文章前博主简单说几句。其实这篇文章整体的意思就是伪造一个图片,图片中含有xss代码,但是这个代码并不会影响图片的展示,然后变为base64格式上传,最终访问上传后的html文件,触发xss代码。完全可以用XSS平台的图片模块二,然后把图片保存到本地,然后百度搜索“图片转换base64编码”,然后把图片转换为base64上传,就OK啦,很简单的哦。

文章为转载。

某个人在对他的客户网站做测试,发现一个上传文件的地方,但是这里限制的非常非常的严格,仅仅可以上传后缀为PNG的文件,然而,在这个地方,你还可以上传文件后缀为html,但内容必须是图片的base64编码格式。

例如:

{“Name”:”image.png.html”,”Data”:”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==”}

上面base64编码的图片是一个简单的红色的点。

这里尝试着改变数据类型例如html、url等,结果验证失败,也不能改编png验证(假设随便在png图中加入恶意代码,不可以的)。然而,base64解码和执行生成的html页面,如下:

‰PNG  IHDRo&åIDAT×cøÿÿ?Ã à „Ð1ñ‚XÍ
õ5ËÑŽ

IEND®B`‚

所以这让我想到了......我应该能够在base64的末尾加上“/> <script> alert(”xss“); </ script>”,它会工作的,对吧?结果没有。验证也失败了。

堆栈溢出的最佳答案建议做神奇的字节头检查,以确保PDF是有效的,即检查前几个字节是“0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A”还是多一点/少一点。

所以我用魔术字节构造了一个“假”PNG,然后是“/> <script> alert(”XSS“); </ script>”作为字节数组,编码并将其解开。验证失败..这是一件好事。只是检查魔术字节是我在代码审查上标记的东西。他们使用.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字符串作为第一位,一个字节数组的位置,等再加入在插入或追加剩余的字节来看看有没有通过验证。什么也不做,这是浪费时间。

关闭RFC。可以将“文本块”添加到PNG文件中(https://www.w3.org/TR/2003/REC-PNG-20031110/#11tEXt)。这些是对元数据有效的合法内容(版权等)。有一些SDK,但它们都过时或难以使用。使用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,<base64 string>}

和响应:

{"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","Ta
gs":[],"Url":"https://████████████.blob.core.windows.net/images/fjgsc452kgebjli2/image.png.html"
,"ThumbnailUrl":"https://████████████.blob.core.windows.net/images/fjgsc452kgebjli2/image.png_
thumbnail.html"}

最后,我们得到了XSS在https:/ /████████████。blob.core.windows.net/images/fjgsc452kgebjli2/image.png.html:

有许多图像文件类型,如JPEG和GIF文本块(而非图像文件类型太多)所以确保输入正确验证附加或嵌入过滤内容。

文章转载地址:https://www.pentestpartners.com/security-blog/from-png-text-to-persistent-xss/

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言