Path Traversal & File Inclusion - Hunter Knowledge Base
SkillFiles & storageKnowledge base for finding path/directory traversal and local/remote file inclusion - user-controlled paths reaching filesystem or include operations, enabling arbitrary file read/write or code inclusion. Use when hunting traversal/LFI/RFI. CWE-22/23/98, OWASP A01:2021-Broken Access Control.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Path Traversal & File Inclusion - Hunter Knowledge Base skill
What this skill tells your AI
The instructions your AI receives, as published by dmdhrumilmistry/security-harness in skills/sh-kb-path-traversal/SKILL.md and read by ahel’s review.
User-controlled path components reach a filesystem operation without being confined to an intended base
directory, letting an attacker read/write files outside it (../../etc/passwd) or include/execute files.
Sources
Filenames/paths in request params/body/headers, upload filenames, Content-Disposition, archive entry
names (zip-slip), template/view names, download/attachment ids that map to paths.
Sinks (grep targets)
- Read/write:
open(,readFile/readFileSync,fs.createReadStream,sendFile/send_file,res.download,File(/FileInputStream,Files.newInputStream,os.path.join(base, user),path.join/path.resolvewith user input,io.readfile, PHPfile_get_contents/fopen/readfile. - Include/execute (LFI/RFI): PHP
include/require/include_oncewith user input,virtual(); template engines resolving user-supplied view names; dynamicimport/require(userPath). - Archive extraction (zip-slip): extracting entry names without normalizing (
ZipFile.extractall,tar.extractall,unzip).
Detection recipe
graft grep "open\(|readFile|sendFile|send_file|path.join|os.path.join|include\(|require\(|extractall" --json.- Trace the path argument to an untrusted source.
- Check for confinement: canonicalize (
realpath) then verify the result starts with the intended base; reject.., absolute paths, null bytes, and encoded variants. Absence of this after user input -> flag.
Payloads / PoC
../../../../etc/passwd,..\..\..\..\windows\win.ini(Windows),....//....//(filter bypass), URL-encoded%2e%2e%2f, double-encoded%252e%252e%252f, null byte%00, absolute/etc/passwd.- LFI to RCE: include a log/upload/
/proc/self/environfile containing attacker code; PHP wrappersphp://filter/convert.base64-encode/resource=index.php(source disclosure),data://,expect://. - Zip-slip: an archive entry named
../../app/config.pyoverwriting a real file. - PoC: request a file outside the base and confirm its contents return.
False-positive filters
- Path is canonicalized and confined:
realpath/Path.resolvethen a base-prefix check (startswith(base)), or the framework's safe static-file handler with traversal protection (e.g.send_from_directory). - Only a basename is used (
os.path.basename(user)) against a fixed directory, with no..reachable. - The identifier is an opaque id mapped through a DB/allowlist to a server-chosen path (user never supplies path).
CWE / OWASP / severity
CWE-22 (traversal), CWE-23, CWE-98 (RFI), CWE-73 (external control of filename). OWASP A01:2021. Arbitrary file read of secrets/config -> high/critical; write or LFI->RCE -> critical.
Chaining hints
File read -> secrets (config/keys/.env) -> DB/cloud access; LFI + log poisoning -> RCE; zip-slip write ->
overwrite code/config -> RCE; feeds access-control (read other tenants' files).
Mitigation
Don't build filesystem paths from user input. Map opaque ids to server-controlled paths; if a name is
needed, take only the basename, canonicalize, and enforce a base-directory prefix check; reject ..,
absolute paths, and encoded traversal; validate archive entry names before extraction; never include
user-controlled paths.
Signals
- GitHub stars
- 26
- Forks
- 9
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
sh-kb-path-traversal- Source
- github.com/dmdhrumilmistry/security-harness