Token导航 LogoToken导航

Agent Skill · 研究检索

openclaw-security-testing-agent(OpenClaw 安全测试 Agent)

用于辅助安全审计、权限检查、凭据风险、认证流程和常见漏洞排查。它适合让 Agent 梳理敏感配置、检查依赖风险、分析鉴权逻辑或生成安全复核清单。使用时不能把工具输出直接当最终结论,涉及密钥、令牌、用户数据或生产系统时,应先确认最小权限、脱敏方式和操作边界。

openclaw-security-testing-agent 是研究检索类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为需要联网;许可证为 MIT-0,第三方扫描有提醒项,按安装量在研究检索类的 73,675 个 Skill 里排第 31,211。

总安装 2,744周安装 111GitHub Stars 公开资料未说明下载 861核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.0.0

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:openclaw-security-testing-agent(OpenClaw 安全测试 Agent)
来源仓库:https://github.com/sky-lv/openclaw-security-testing-agent
安装命令:
openclaw skills install openclaw-security-testing-agent
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install openclaw-security-testing-agent

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

安全测试Agent。漏洞扫描、渗透测试、代码审计、安全加固。触发词:安全、渗透、漏洞、xss、sql注入、csrf、扫描、审计。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install openclaw-security-testing-agent;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

openclaw-security-testing-agent 怎么安装?

在终端执行 openclaw skills install openclaw-security-testing-agent。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

openclaw-security-testing-agent 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

openclaw-security-testing-agent 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

openclaw-security-testing-agent 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

openclaw-security-testing-agent 用的人多吗?

公开数据是累计安装 2,744 次,近一周安装 111 次,下载 861 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

openclaw-security-testing-agent 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。

先想清楚的地方

  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
openclaw-security-testing-agent

OpenClaw 安全测试 Agent · 本页

2,744—需要联网MIT-0有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
openclaw-security-testing-agent
description
安全测试Agent。漏洞扫描、渗透测试、代码审计、安全加固。触发词:安全、渗透、漏洞、xss、sql注入、csrf、扫描、审计。
metadata
{"openclaw": {"emoji": "🔒"}}

Security Testing Agent

功能说明

AI驱动的安全测试和漏洞扫描助手。

安全测试类型

类型工具覆盖
静态扫描SonarQube, Semgrep, CodeQLSAST
动态扫描OWASP ZAP, BurpSuiteDAST
依赖扫描Snyk, Dependabot, npm auditSCA
秘钥扫描TruffleHog, git-secrets秘钥泄露
容器扫描Trivy, Clair镜像安全

1. 漏洞扫描框架

from dataclasses import dataclass
from typing import Optional
import requests

@dataclass
class Vulnerability:
    id: str
    severity: str  # critical, high, medium, low
    title: str
    description: str
    affected: str
    remediation: str
    cwe: Optional[str] = None
    cvss: Optional[float] = None

class VulnerabilityScanner:
    def __init__(self, target_url: str, api_key: Optional[str] = None):
        self.target = target_url.rstrip('/')
        self.session = requests.Session()
        if api_key:
            self.session.headers['Authorization'] = f'Bearer {api_key}'
    
    # === SQL注入检测 ===
    def test_sql_injection(self) -> list[Vulnerability]:
        vulns = []
        test_payloads = [
            "' OR '1'='1",
            "' OR 1=1--",
            "'; DROP TABLE users--",
            "1' AND '1'='1",
            "admin'--",
            "' UNION SELECT NULL--",
        ]
        
        # 测试URL参数
        params_to_test = ['id', 'user', 'page', 'q', 'search', 'query', 'id', 'cat', 'category']
        
        for param in params_to_test:
            url = f"{self.target}/?{param}=1"
            for payload in test_payloads:
                test_url = f"{self.target}/?{param}={payload}"
                
                try:
                    resp = self.session.get(test_url, timeout=10)
                    
                    # 检测SQL错误
                    sql_errors = [
                        'mysql_fetch', 'mysqli_', 'sqlite_', 'postgresql',
                        'ORA-', 'Microsoft SQL Server', 'ODBC',
                        'SQLite', 'Syntax error', 'Warning: pg_'
                    ]
                    
                    for error in sql_errors:
                        if error.lower() in resp.text.lower():
                            vulns.append(Vulnerability(
                                id='SQLI-001',
                                severity='critical',
                                title=f'SQL Injection - {param}',
                                description=f'Parameter {param} is vulnerable to SQL injection',
                                affected=f'{self.target}/?{param}={payload}',
                                remediation='Use parameterized queries, ORM, or prepared statements',
                                cwe='CWE-89'
                            ))
                            break
                    
                    # 时间盲注检测
                    if 'SLEEP' in payload or 'BENCHMARK' in payload:
                        import time
                        start = time.time()
                        self.session.get(test_url, timeout=30)
                        elapsed = time.time() - start
                        if elapsed > 10:
                            vulns.append(Vulnerability(
                                id='SQLI-002',
                                severity='critical',
                                title=f'Blind SQL Injection - {param}',
                                description='Time-based blind SQL injection detected',
                                affected=f'{self.target}/?{param}={payload}',
                                remediation='Same as SQL injection',
                                cwe='CWE-89'
                            ))
                    
                except requests.RequestException:
                    continue
        
        return vulns
    
    # === XSS检测 ===
    def test_xss(self) -> list[Vulnerability]:
        vulns = []
        xss_payloads = [
            '<script>alert(1)</script>',
            '<img src=x onerror=alert(1)>',
            '<svg onload=alert(1)>',
            '"><script>alert(1)</script>',
            "javascript:alert(1)",
            '<body onload=alert(1)>',
        ]
        
        # 测试输入点
        test_points = [
            ('GET', '/search?q=test'),
            ('POST', '/contact', {'name': 'test', 'email': 'test@test.com', 'message': 'test'}),
        ]
        
        for method, path, *params in test_points:
            for payload in xss_payloads:
                try:
                    if method == 'GET':
                        test_path = path.replace('test', payload)
                        resp = self.session.get(f"{self.target}{test_path}", timeout=10)
                    else:
                        data = params[0] if params else {}
                        resp = self.session.post(f"{self.target}{path}", data=data, timeout=10)
                    
                    # 检查payload是否反射
                    if payload in resp.text:
                        vulns.append(Vulnerability(
                            id='XSS-001',
                            severity='high',
                            title=f'Cross-Site Scripting in {path}',
                            description=f'User input is reflected without sanitization',
                            affected=f'{self.target}{path}',
                            remediation='Escape HTML entities, use Content-Security-Policy',
                            cwe='CWE-79'
                        ))
                        break
                    
                    # 检查存储型XSS
                    if 'stored' in path or 'comment' in path or 'post' in path:
                        check_resp = self.session.get(f"{self.target}{path}")
                        if payload in check_resp.text:
                            vulns.append(Vulnerability(
                                id='XSS-002',
                                severity='critical',
                                title=f'Stored XSS in {path}',
                                description='Malicious script is stored and executed for all users',
                                affected=f'{self.target}{path}',
                                remediation='Strict input validation and output encoding',
                                cwe='CWE-79'
                            ))
                
                except requests.RequestException:
                    continue
        
        return vulns
    
    # === CSRF检测 ===
    def test_csrf(self) -> list[Vulnerability]:
        vulns = []
        
        # 查找敏感表单
        sensitive_forms = [
            '/profile/update', '/password/change', '/admin/settings',
            '/api/user/delete', '/payment/submit', '/settings/security'
        ]
        
        for path in sensitive_forms:
            try:
                resp = self.session.get(f"{self.target}{path}", timeout=10)
                
                # 检查是否有CSRF token
                csrf_patterns = [
                    'csrf', 'xsrf', '_token', 'token', 'nonce', 'csrf_token'
                ]
                
                has_csrf_protection = any(p in resp.text.lower() for p in csrf_patterns)
                
                if not has_csrf_protection:
                    vulns.append(Vulnerability(
                        id='CSRF-001',
                        severity='medium',
                        title=f'CSRF Vulnerability in {path}',
                        description='Sensitive action lacks CSRF protection',
                        affected=f'{self.target}{path}',
                        remediation='Implement CSRF tokens or SameSite cookies',
                        cwe='CWE-352'
                    ))
            
            except requests.RequestException:
                continue
        
        return vulns
    
    # === 头部安全检测 ===
    def check_security_headers(self) -> list[Vulnerability]:
        vulns = []
        expected_headers = {
            'Strict-Transport-Security': 'Enforce HTTPS',
            'Content-Security-Policy': 'Prevent XSS/injection',
            'X-Content-Type-Options': 'Prevent MIME sniffing',
            'X-Frame-Options': 'Prevent clickjacking',
            'X-XSS-Protection': 'Legacy XSS filter (deprecated)',
            'Referrer-Policy': 'Control referrer information',
            'Permissions-Policy': 'Control browser features',
        }
        
        resp = self.session.get(self.target, timeout=10)
        
        for header, description in expected_headers.items():
            if header not in resp.headers:
                severity = 'medium' if 'Content-Security-Policy' in header else 'low'
                vulns.append(Vulnerability(
                    id='HEADER-001',
                    severity=severity,
                    title=f'Missing {header}',
                    description=description,
                    affected=self.target,
                    remediation=f'Add {header} header',
                    cwe=None
                ))
        
        return vulns
    
    # === 完整扫描 ===
    def full_scan(self) -> dict:
        print(f"Scanning {self.target}...")
        
        results = {
            'target': self.target,
            'vulnerabilities': [],
            'summary': {'critical': 0, 'high': 0, 'medium': 0, 'low': 0}
        }
        
        # 执行所有测试
        all_vulns = []
        all_vulns.extend(self.test_sql_injection())
        all_vulns.extend(self.test_xss())
        all_vulns.extend(self.test_csrf())
        all_vulns.extend(self.check_security_headers())
        
        # 去重
        seen = set()
        for v in all_vulns:
            key = f"{v.id}-{v.title}"
            if key not in seen:
                seen.add(key)
                results['vulnerabilities'].append(v)
                results['summary'][v.severity] += 1
        
        return results

2. 依赖安全扫描

import json
import subprocess
from packaging import version

class DependencyScanner:
    def __init__(self):
        self.vulnerabilities_db = self.load_nvd()
    
    def scan_npm(self, package_json_path: str = 'package.json') -> list:
        """扫描npm依赖"""
        with open(package_json_path) as f:
            pkg = json.load(f)
        
        all_deps = {**pkg.get('dependencies', {}), **pkg.get('devDependencies', {})}
        
        results = []
        
        # npm audit
        try:
            result = subprocess.run(
                ['npm', 'audit', '--json'],
                capture_output=True,
                text=True,
                cwd=os.path.dirname(package_json_path)
            )
            audit_data = json.loads(result.stdout)
            
            for vuln in audit_data.get('vulnerabilities', {}).values():
                results.append({
                    'package': vuln['name'],
                    'severity': vuln['severity'],
                    'url': vuln.get('via', [{}])[0].get('url', ''),
                    'fix': vuln.get('fixAvailable')
                })
        except Exception as e:
            print(f"npm audit failed: {e}")
        
        return results
    
    def scan_python(self, requirements_path: str = 'requirements.txt') -> list:
        """扫描Python依赖"""
        results = []
        
        try:
            result = subprocess.run(
                ['pip', 'list', '--format=freeze'],
                capture_output=True,
                text=True
            )
            
            packages = {}
            for line in result.stdout.split('\
'):
                if '==' in line:
                    pkg, ver = line.strip().split('==')
                    packages[pkg.lower()] = ver
            
            # 使用safety检查已知漏洞
            safety_result = subprocess.run(
                ['safety', 'check', '--json'],
                capture_output=True,
                text=True,
                input=result.stdout
            )
            
            if safety_result.returncode != 0:
                try:
                    for vuln in json.loads(safety_result.stdout):
                        results.append(vuln)
                except:
                    pass
        
        except Exception as e:
            print(f"Python scan failed: {e}")
        
        return results

3. 秘钥扫描

class SecretScanner:
    """敏感信息扫描"""
    
    PATTERNS = {
        'AWS Access Key': r'AKIA[0-9A-Z]{16}',
        'AWS Secret Key': r'[A-Za-z0-9/+=]{40}',
        'GitHub Token': r'ghp_[a-zA-Z0-9]{36}',
        'GitHub OAuth': r'gho_[a-zA-Z0-9]{36}',
        'Private Key': r'-----BEGIN (RSA|DSA|EC|OPENSSH) PRIVATE KEY-----',
        'Generic API Key': r'[a-zA-Z0-9]{32,64}',
        'Slack Token': r'xox[baprs]-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*',
        'Stripe Key': r'sk_live_[0-9a-zA-Z]{24}',
        'Database URL': r'(mysql|postgres|mongodb)://[^:]+:[^@]+@',
        'JWT': r'eyJ[A-Za-z0-9-_]+\.eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+',
        'Slack Webhook': r'https://hooks\.slack\.com/services/T[a-zA-Z0-9]+/B[a-zA-Z0-9]+/',
        'SendGrid Key': r'SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}',
        'Google API': r'AIza[0-9A-Za-z_-]{35}',
        'OpenAI Key': r'sk-[a-zA-Z0-9]{48}',
        'Generic Secret': r'(?i)(password|secret|api_key|apikey|auth_token|access_token)\s*[=:]\s*[\'"]?[\w-]{8,}',
    }
    
    def scan_file(self, filepath: str) -> list[dict]:
        import re
        matches = []
        
        with open(filepath, 'r', errors='ignore') as f:
            content = f.read()
            lines = content.split('\
')
        
        for pattern_name, pattern in self.PATTERNS.items():
            for i, line in enumerate(lines, 1):
                matches_found = re.finditer(pattern, line)
                for match in matches_found:
                    matches.append({
                        'file': filepath,
                        'line': i,
                        'type': pattern_name,
                        'match': match.group(),
                        'context': line.strip()[:200]
                    })
        
        return matches
    
    def scan_directory(self, root_path: str, extensions=None) -> list:
        """扫描整个目录"""
        import os
        matches = []
        extensions = extensions or ['.js', '.ts', '.py', '.java', '.go', '.rb', '.php', '.cs', '.sh', '.env', '.json', '.yaml', '.yml', '.toml', '.xml']
        
        for dirpath, dirnames, filenames in os.walk(root_path):
            # 跳过node_modules等
            dirnames[:] = [d for d in dirnames if d not in ['node_modules', '.git', '__pycache__', 'venv', '.venv']]
            
            for filename in filenames:
                if any(filename.endswith(ext) for ext in extensions):
                    filepath = os.path.join(dirpath, filename)
                    matches.extend(self.scan_file(filepath))
        
        return matches

4. 安全加固建议

class SecurityHardening:
    """安全加固清单"""
    
    @staticmethod
    def generate_report(target: str, scan_results: dict) -> str:
        """生成安全报告"""
        summary = scan_results['summary']
        vulns = scan_results['vulnerabilities']
        
        report = f"""
# 安全扫描报告

## 目标
{scan_results['target']}

## 概览
- 🔴 严重: {summary['critical']}
- 🟠 高危: {summary['high']}
- 🟡 中危: {summary['medium']}
- 🟢 低危: {summary['low']}

## 发现的问题

"""
        
        for v in vulns:
            icon = {'critical': '🔴', 'high': '🟠', 'medium': '🟡', 'low': '🟢'}.get(v.severity, '⚪')
            report += f"""
### {icon} {v.title}

- **严重程度**: {v.severity.upper()}
- **描述**: {v.description}
- **影响**: {v.affected}
- **修复建议**: {v.remediation}
{f'- **CWE**: {v.cwe}' if v.cwe else ''}

"""
        
        return report
    
    # === 加固清单 ===
    RECOMMENDATIONS = {
        'sql_injection': [
            '使用参数化查询或ORM',
            '启用WAF',
            '最小权限原则',
            '定期代码审计'
        ],
        'xss': [
            '输出编码',
            '内容安全策略 (CSP)',
            'HTTPOnly Cookie',
            '输入验证'
        ],
        'csrf': [
            'CSRF Token',
            'SameSite Cookie',
            '双重提交Cookie',
            '验证Referer'
        ],
        'authentication': [
            '强密码策略',
            '多因素认证 (MFA)',
            '账户锁定策略',
            '安全的会话管理'
        ],
        'data_protection': [
            '传输加密 (TLS 1.3)',
            '静态加密',
            '秘钥轮换',
            '数据脱敏'
        ]
    }

5. OWASP Top 10 检查清单

类别检测项工具
A01 Broken Access水平/垂直越权测试BurpSuite
A02 Cryptographic Failures弱加密/传输/存储custom
A03 InjectionSQLi/XSS/命令注入ZAP, sqlmap
A04 Insecure Design业务逻辑漏洞manual
A05 Security Misconfig默认口令/错误配置nmap, nikto
A06 Vulnerable Components过时依赖Snyk, Dependabot
A07 Auth Failures弱认证/会话劫持BurpSuite
A08 Data IntegrityCI/CD注入/篡改Semgrep
A09 Logging Failures审计日志缺失manual
A10 SSRF服务端请求伪造custom

平台分布

OpenClaw

75.21%
按下载量换算648

安全审计

VirusTotal

可疑

ClawScan

通过

Static analysis

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills