WebGoat 靶场通关笔记 Software & Data Integrity
Software & Data Integrity
Insecure Deserialization
5
反序列化。
在反序列化时发现一个运行危险操作的gadget是很少见的(但也可能发生)。不过,更容易找到的是,当一个gadget被反序列化时,它会在另一个gadget上运行操作,而第二个gadget又会在第三个gadget上运行更多操作,以此类推,直到触发真正的危险操作。在反序列化过程中可以用来实现危险动作的gadget集合被称为 “Gadgets Chain”。
更改网页提供的序列化字符串,生成一个可以将页面响应延迟 5 秒的序列化字符串。
不知道可利用类,无可奈何,审计源码。
可以看到,在计时前后,只是执行了 Object o = ois.readObject()
。
查看 VulnerableTaskHolder
的 readObject()
实现,发现会通过 Runtime.getRuntime().exec()
执行系统命令,这是一个非常危险的操作。尽管这里做了限制,只允许 sleep
或 ping
命令,且命令长度小于22个字符。
显然需要利用的就是这个类了。
序列化代码需要根据代码中的反序列化代码(ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(b64token)))
)来编写。
新建一个java文件,构造一个类 SerialMain
,来生成指定的序列化代码。
1 | // 导入需要的类 |
代码执行得到如下序列化的字符串,提交即可。
1 | rO0ABXNyADFvcmcuZHVtbXkuaW5zZWN1cmUuZnJhbWV3b3JrLlZ1bG5lcmFibGVUYXNrSG9sZGVyAAAAAAAAAAICAANMABZyZXF1ZXN0ZWRFeGVjdXRpb25UaW1ldAAZTGphdmEvdGltZS9Mb2NhbERhdGVUaW1lO0wACnRhc2tBY3Rpb250ABJMamF2YS9sYW5nL1N0cmluZztMAAh0YXNrTmFtZXEAfgACeHBzcgANamF2YS50aW1lLlNlcpVdhLobIkiyDAAAeHB3DgUAAAfnDBgVFwwtPWRUeHQAE3BpbmcgLW4gNiAxMjcuMC4wLjF0AARwaW5n |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShadowMaster's Blog!
评论