Go to the documentation of this file.
40 static void DetectTransformUrlDecodeRegisterTests(
void);
49 "modify buffer to decode urlencoded data before inspection";
54 DetectTransformUrlDecodeSetup;
57 DetectTransformUrlDecodeRegisterTests;
80 static bool BufferUrlDecode(
const uint8_t *input,
const uint32_t input_len, uint8_t *output, uint32_t *output_size)
85 for (uint32_t i = 0; i < input_len; i++) {
86 if (input[i] ==
'%') {
87 if (i + 2 < input_len) {
88 if ((isxdigit(input[i+1])) && (isxdigit(input[i+2]))) {
90 *oi = (uint8_t)((input[i + 1] >=
'A' ? ((input[i + 1] & 0xdf) -
'A') + 10
91 : (input[i + 1] -
'0'))
93 *oi |= (input[i+2] >=
'A' ? ((input[i+2] & 0xdf) -
'A') + 10 : (input[i+2] -
'0'));
107 }
else if (input[i] ==
'+') {
114 *output_size = oi - output;
120 uint32_t output_size;
123 const uint8_t *input = buffer->
inspect;
125 if (input_len == 0) {
128 uint8_t output[input_len];
130 changed = BufferUrlDecode(input, input_len, output, &output_size);
138 static int DetectTransformUrlDecodeTest01(
void)
140 const uint8_t *input = (
const uint8_t *)
"Suricata%20is+%27%61wesome%21%27%25%30%30%ZZ%4";
141 uint32_t input_len = strlen((
char *)input);
147 TransformUrlDecode(&buffer, NULL);
155 static int DetectTransformUrlDecodeTest02(
void)
157 const char rule[] =
"alert http any any -> any any (http.request_body; url_decode; content:\"mail=test@oisf.net\"; sid:1;)";
160 memset(&th_v, 0,
sizeof(th_v));
173 static void DetectTransformUrlDecodeRegisterTests(
void)
176 DetectTransformUrlDecodeTest01);
178 DetectTransformUrlDecodeTest02);
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
main detection engine ctx
void DetectEngineCtxFree(DetectEngineCtx *)
Free a DetectEngineCtx::
@ DETECT_TRANSFORM_URL_DECODE
Signature * DetectEngineAppendSig(DetectEngineCtx *, const char *)
Parse and append a Signature into the Detection Engine Context signature list.
int(* Setup)(DetectEngineCtx *, Signature *, const char *)
void InspectionBufferInit(InspectionBuffer *buffer, uint32_t initial_size)
#define PASS
Pass the test.
Per thread variable structure.
void PrintRawDataFp(FILE *fp, const uint8_t *buf, uint32_t buflen)
int SigGroupBuild(DetectEngineCtx *de_ctx)
Convert the signature list into the runtime match structure.
void InspectionBufferCopy(InspectionBuffer *buffer, uint8_t *buf, uint32_t buf_len)
TmEcode DetectEngineThreadCtxInit(ThreadVars *, void *, void **)
initialize thread specific detection engine context
#define FAIL_IF(expr)
Fail a test if expression evaluates to true.
TmEcode DetectEngineThreadCtxDeinit(ThreadVars *, void *)
SigTableElmt sigmatch_table[DETECT_TBLSIZE]
void(* Transform)(InspectionBuffer *, void *context)
void InspectionBufferSetup(DetectEngineThreadCtx *det_ctx, const int list_id, InspectionBuffer *buffer, const uint8_t *data, const uint32_t data_len)
setup the buffer with our initial data
DetectEngineCtx * DetectEngineCtxInit(void)
int DetectSignatureAddTransform(Signature *s, int transform, void *options)
void InspectionBufferFree(InspectionBuffer *buffer)
void(* RegisterTests)(void)