Injection is a single idea — user data is treated as code by an interpreter. The interpreter changes (SQL engine, shell, browser), the bug pattern is identical.
A "network diagnostic" tool runs ping through a shell. The hostname
goes into the command string unescaped — semicolons chain new commands.
subprocess.run(f"ping -c 1 {host}", shell=True, capture_output=True)
Enter 127.0.0.1 — output looks like a normal ping.
Enter 127.0.0.1; id. The shell runs both — the
id output proves arbitrary commands execute.