【问题标题】:Detect malicious code or text inside base64 dataURL image [closed]检测base64 dataURL图像中的恶意代码或文本[关闭]
【发布时间】:2019-12-16 15:28:10
【问题描述】:

我有以下 3 个“dataURL 图像”,如果您通过“URL”打开它们,它们都会返回相同的图像,但以下两个 dataURL 代码最后嵌入了“PHP 代码”和“JavaScript 代码”。

如何从我的 base64 dataURL 图像中删除那些来自我不信任的用户的恶意代码。

base64 dataURL 图片(安全):

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAA2AFwDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBA//EACcQAAEDAwQBBAMBAAAAAAAAAAABAgMTUVIREhSRYQQjQWIxMkJy/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEHCP/EABgRAQEBAQEAAAAAAAAAAAAAAAABEUEx/9oADAMBAAIRAxEAPwCeNJZRxpLKRVddRVddTFeuvZ4pfTSYqpnHkwUlZHO/pTN7sl7IL48mCjjyYKRvdkvZqPci/lewOnGkso40llIquuoquuoF8aSymO9NIn8qpNV11MWRy/KgVx5MFC+nmX8b2/5doRvdkvY3uyXsDvugxUboMVI4z7DjPsXpPFufBi4nWDF3ZKwPT41FGTFxBWsGLuxrDg7smjJi4yjJgoHXdBio3QYqRxn2HGfYC90GKhzoMV7I4z7BfTPRP1UDdYMXdjWDF3ZNGTFwoyYuAVn5KKz8lOm6GyjdDZSnHKq9flTKzrqdVWFfhTPY+xFc6zrqKz8lOnsfYez9gJrPyUVn5KdN0NlG6Gygc6z8lMdM9U/ZTruhspirCuQHKs66is66nT2PsPY+wHOn5FPyACSMVuia6mABcgbtABkbT8in5ABkKfkxW6eQAZGAAGR//9k=

base64 dataURL 2 图片(PHP 代码注入):

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAA2AFwDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBA//EACcQAAEDAwQBBAMBAAAAAAAAAAABAgMTUVIREhSRYQQjQWIxMkJy/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEHCP/EABgRAQEBAQEAAAAAAAAAAAAAAAABEUEx/9oADAMBAAIRAxEAPwCeNJZRxpLKRVddRVddTFeuvZ4pfTSYqpnHkwUlZHO/pTN7sl7IL48mCjjyYKRvdkvZqPci/lewOnGkso40llIquuoquuoF8aSymO9NIn8qpNV11MWRy/KgVx5MFC+nmX8b2/5doRvdkvY3uyXsDvugxUboMVI4z7DjPsXpPFufBi4nWDF3ZKwPT41FGTFxBWsGLuxrDg7smjJi4yjJgoHXdBio3QYqRxn2HGfYC90GKhzoMV7I4z7BfTPRP1UDdYMXdjWDF3ZNGTFwoyYuAVn5KKz8lOm6GyjdDZSnHKq9flTKzrqdVWFfhTPY+xFc6zrqKz8lOnsfYez9gJrPyUVn5KdN0NlG6Gygc6z8lMdM9U/ZTruhspirCuQHKs66is66nT2PsPY+wHOn5FPyACSMVuia6mABcgbtABkbT8in5ABkKfkxW6eQAZGAAGR//9k8P3BocCBlY2hvICJIZWxsbyBXb3JsZCI7ID8+Cg==

base64 dataURL 3 图片(Javascript 代码注入):

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAA2AFwDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBA//EACcQAAEDAwQBBAMBAAAAAAAAAAABAgMTUVIREhSRYQQjQWIxMkJy/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEHCP/EABgRAQEBAQEAAAAAAAAAAAAAAAABEUEx/9oADAMBAAIRAxEAPwCeNJZRxpLKRVddRVddTFeuvZ4pfTSYqpnHkwUlZHO/pTN7sl7IL48mCjjyYKRvdkvZqPci/lewOnGkso40llIquuoquuoF8aSymO9NIn8qpNV11MWRy/KgVx5MFC+nmX8b2/5doRvdkvY3uyXsDvugxUboMVI4z7DjPsXpPFufBi4nWDF3ZKwPT41FGTFxBWsGLuxrDg7smjJi4yjJgoHXdBio3QYqRxn2HGfYC90GKhzoMV7I4z7BfTPRP1UDdYMXdjWDF3ZNGTFwoyYuAVn5KKz8lOm6GyjdDZSnHKq9flTKzrqdVWFfhTPY+xFc6zrqKz8lOnsfYez9gJrPyUVn5KdN0NlG6Gygc6z8lMdM9U/ZTruhspirCuQHKs66is66nT2PsPY+wHOn5FPyACSMVuia6mABcgbtABkbT8in5ABkKfkxW6eQAZGAAGR//9k8c2NyaXB0PmFsZXJ0KCdoZWxsbycpOzwvc2NyaXB0Pgo=

您可以使用这些工具“在线解码”来查看文本代码 - https://www.base64decode.org/

我允许用户将图像上传到我的服务器,并将图像“转换”为 base64 dataURL 图像

从上面所有3个base64 dataURL图片中,你可以看到都返回相同的图片,但是由于图片中嵌入了文本代码,它们的base64代码不同。

我在后端使用 Go 来保存图像。我正在使用以下 HTML 代码将图像转换为 dataURL base64 文本。

<input type='file' onchange="readURL(this);" />
<img id="blah" src="#" alt="your image" />
<script>
function readURL(input) {
  if (input.files && input.files[0]) {
    var reader = new FileReader();
    reader.onload = function (e) {
      document.getElementById("blah").src = e.target.result;
    };
    reader.readAsDataURL(input.files[0]);
  }
}
</script>

我担心的是“文本”不应该在图像内,也不应该在那里。

dataURL 上面返回的是同一张图片,但是由于里面有额外的数据,它们有不同的 base64 代码。

我想从上面2个恶意代码中获取实际的图片base64代码。

假设,用户 B 上传的图片我得到“base64 dataURL 3”图片,但我想从用户上传的图片中获取 base64 dataURL 原始图片。

如何做到这一点?

【问题讨论】:

  • 在正确的上下文中任何东西都可能是恶意的。只是不要尝试将图像执行为 PHP 或 JavaScript,你会没事的。
  • 不,为什么要这样做对于回答问题至关重要。尝试将图像作为 PHP 执行没有任何合乎逻辑的理由。那么为什么你认为这是一个问题呢?
  • 关于解码和重新编码的答案并不能保证安全。真正的答案是不要做&lt;?php include "test.jpg"; 这种令人难以置信的愚蠢和无用的事情。如果您对此事实不满意,我们深表歉意。
  • @JohnCargo 可能有有效的图像会被 PHP 解释为代码。如果攻击者知道图像是如何重新编码的,那么攻击者就有可能制作一个源图像,该图像将重新编码为包含恶意代码的图像。我删除了我之前的评论,因为这不是一个好的建议。
  • 这里的投票是故意匿名的。您还获得了 许多 cmets 可以解释否决票。你的反应是攻击。

标签: javascript image go base64 base64url


【解决方案1】:

是的,在某个世界里,“用图片黑客”(通常称为 Stegosploits)是一回事。这里的行业方法是使用Content Disarm & Reconstruction (CDR) 软件。引用自维基百科:

[CDR] 是一种计算机安全技术,用于删除潜在的 来自文件的恶意代码。与恶意软件分析不同,CDR 技术 不会确定或检测恶意软件的功能,但会删除所有 未在系统定义中批准的文件组件 和政策。

如果这对您来说至关重要,您可能想研究一些可用的商业解决方案(本文还列出了其中的一些,我无法在此给出推荐)。

对于本土解决方案,重新编码图像可能就足够了。

【讨论】:

    【解决方案2】:

    ImageMagick convert -strip &lt;in&gt; &lt;out&gt; 会做到的。它还会删除其他无关数据(EXIF、嵌入式缩略图等),因此请确保该行为是您想要的。

    $ xxd img.jpg | tail -n 3
    00000280: 647f ffd9 3c73 6372 6970 743e 616c 6572  d...<script>aler
    00000290: 7428 2768 656c 6c6f 2729 3b3c 2f73 6372  t('hello');</scr
    000002a0: 6970 743e 0a                             ipt>.
    
    $ convert -strip img.jpg img2.jpg
    
    $ xxd img2.jpg | tail -n 3       
    00000260: 383a 2ebd 4c00 32c8 1ba4 0064 6d3f 229f  8:..L.2....dm?".
    00000270: 9001 90a7 e4c8 a1d3 eff9 0019 1800 0647  ...............G
    00000280: ffd9
    

    无论如何,如果您不尝试执行图像,则不会发生任何事情。但如果没有别的,那就是在您的图像文件中浪费空间。


    要从 Go 执行此操作,请使用 Go ImageMagick bindings 并调用 StripImage

    【讨论】:

    • ... 如果你尝试执行图像,你会得到错误,因为图像本身不是有效的 JS 或 PHP。这整个问题都是关于一个非问题的。
    • 好吧,剥离 EXIF 对您的用户来说是一个很好的隐私提升,如果没有别的。如果恶意脚本以其他方式进入您的服务器,则带有嵌入数据的图像文件可以用作命令传递机制……尽管攻击者更有可能只使用 pastebin。
    • @vgel,你能解释更多关于“convert --strip”的信息吗,这需要运行“系统级命令”,这在我的场景中不可用。有什么不需要运行系统级命令的吗?
    • @JohnCargo 是的,您可以使用 Go 绑定。我在答案中添加了信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2020-08-15
    相关资源
    最近更新 更多