مدت زمان مطالعه:
0

درخواست HTTP فقط شامل URL و Body نیست؛ Method، Version، Header، Cookie، Content-Length، Transfer-Encoding، Parameter، Range، Multipart Boundary و Frameهای HTTP/2 یا HTTP/3 همگی بخشی از ساختار پروتکل هستند. مهاجم میتواند با ساخت Request غیرعادی یا مبهم، Parserهای FortiWeb، Reverse Proxy و Backend را وادار کند یک Request را به شکلهای متفاوت تفسیر کنند.
این اختلاف تفسیر میتواند در حملاتی مانند HTTP Request Smuggling، Malformed Request، Oversized Header، Resource Exhaustion، Range-based DoS یا دورزدن کنترلهای Upload استفاده شود. HTTP Protocol Constraints در FortiWeb برای محدودکردن همین رفتارهای غیرعادی طراحی شده است.
مشکل اصلی در Production این است که برنامههای واقعی همیشه رفتار یکسانی ندارند. SAML و JWT میتوانند Headerهای بزرگ تولید کنند، Upload به Body بزرگ نیاز دارد و بعضی APIها یا WebDAV از Methodهای غیرمعمول استفاده میکنند. بنابراین Profile باید بر اساس Baseline واقعی ساخته شود، نه با فعالکردن کورکورانه تمام گزینهها.
این مقاله بر اساس FortiWeb 7.6.9 نوشته شده است. ساختار اصلی HTTP Protocol Constraints در Patchهای 7.6 مشابه است، اما FortiWeb 7.6.9 سختسازی بیشتری برای HTTP/2 و HTTP/3 اضافه کرده است و بعضی Field Nameها یا Constraintها میان 7.6.0 تا 7.6.9 تفاوت دارند. در FortiWeb 7.4 برخی کنترلهای HTTP/3 وجود ندارند و در FortiWeb 8.0 گزینهها توسعه یافتهاند. قبل از Paste کردن CLI، داخل Context مربوطه از set ? و show full-configuration استفاده کنید.
مروری بر این مقاله
این حمله زمانی ممکن میشود که دو مؤلفه زنجیره، مرز Request را متفاوت تشخیص دهند. مثال کلاسیک وجود همزمان Content-Length و Transfer-Encoding یا چند Content-Length متفاوت است. یک Proxy ممکن است یکی را مبنا قرار دهد و Backend دیگری را.
Header یا Cookie بسیار بزرگ میتواند Memory و CPU Parser را مصرف کند. با این حال، SAML، Kerberos، JWT و Application Gatewayهای واقعی نیز ممکن است Header بزرگ تولید کنند؛ بنابراین Limit باید اندازهگیری شود.
Request دارای Syntax ناقص، Character غیرمجاز، Chunk Size نامعتبر، Multipart Boundary خراب یا Header بدون ساختار صحیح است. بعضی Clientهای قدیمی Request غیرمعمول ولی عملیاتی تولید میکنند و میتوانند False Positive ایجاد کنند.
تعداد زیاد Range یا Rangeهای همپوشان میتواند Backend را مجبور به تولید پاسخهای پیچیده و مصرف Resource کند.
وجود Parameterهای تکراری با یک نام میتواند میان Frameworkها رفتار متفاوت ایجاد کند؛ یک لایه اولین مقدار را بخواند و لایه دیگر آخرین مقدار را.
FortiWeb بعد از دریافت Request، ساختار پروتکل را Parse میکند و Constraintهای فعال را بررسی میکند. نتیجه Match میتواند فقط Log شود یا Request را Block کند. Exception مشخص میکند بعضی Checkها برای Host، URL یا Source خاص اجرا نشوند.
| Object | وظیفه | مثال |
|---|---|---|
| HTTP Protocol Constraint Profile | تعریف Check، Threshold، Action و Severity | Header Length حداکثر 16 KB |
| HTTP Constraint Exception | Omit کردن Check مشخص برای Scope محدود | عدم بررسی Body Length فقط روی /upload/large |
| Web Protection Profile | اتصال Constraint Profile به Policy | PARTIAN-INLINE-PROFILE |
| Server Policy | اعمال Profile روی ترافیک واقعی | پرتال portal.example.com |
| Action | رفتار | زمان استفاده | ریسک |
|---|---|---|---|
| Alert | Request عبور میکند و Log ایجاد میشود. | Baseline و Tune | حمله واقعی Block نمیشود. |
| Alert & Deny | Request Block و Log ثبت میشود. | پس از Regression Test | False Positive باعث اختلال میشود. |
| Deny No Log | Request بدون Log Block میشود. | سناریوی خاص | Troubleshooting دشوار میشود. |
| Block Period | Client IP برای مدت مشخص Block میشود. | حملات تکراری | پشت NAT چند کاربر Block میشوند. |
Severity برای اولویت Event و Threat Weight برای محاسبه Risk Score یا Triggerهای تجمعی استفاده میشود. Trigger Action میتواند Email، SNMP، FortiAnalyzer یا Integration دیگر را فعال کند.
| Constraint | چه چیزی را تشخیص میدهد؟ | چرا مهم است؟ | منبع False Positive |
|---|---|---|---|
| Illegal Content Length | مقدار غیرعددی، منفی یا نامعتبر | جلوگیری از Parser Confusion | Client یا SDK خراب |
| Multiple Content-Length | چند Header Content-Length | کاهش ریسک Smuggling | Proxy ناسازگار |
| CL/TE Coexistence | وجود Content-Length و Transfer-Encoding با هم | الگوی مهم Smuggling | Gateway قدیمی |
| Maximum Body Length | Body بزرگتر از Limit | کنترل Resource و Upload | Upload یا API Bulk |
| Illegal Chunk Size | Chunk Size نامعتبر | جلوگیری از Parse مبهم | Client سفارشی معیوب |
| کنترل | شرح | بررسی عملیاتی |
|---|---|---|
| Maximum Total Header Length | مجموع طول تمام Headerها | SAML، JWT، Kerberos و Cookie را اندازه بگیرید. |
| Maximum Header Count | تعداد Headerها | APM، CDN و Gateway ممکن است Header اضافه کنند. |
| Header Name Length | طول نام یک Header | Header سفارشی Application را بررسی کنید. |
| Header Value Length | طول مقدار Header | Authorization و Cookie ریسک بالاتری دارند. |
| Illegal Header Name/Value | Characterهای غیرمجاز | Clientهای قدیمی یا Encoding نادرست |
| Missing Host | نبود Host در HTTP/1.1 | Scanner یا Client غیر استاندارد |
SAML Response معمولاً داخل Body است، اما Cookie، Relay State، JWT یا Headerهای Reverse Proxy میتوانند حجم زیادی ایجاد کنند. قبل از افزایش Header Limit، مشخص کنید کدام Header عامل افزایش است.
Search و Filterهای پیچیده ممکن است Query String طولانی داشته باشند. APIهای طراحیشده با GET برای Payload بزرگ بهتر است بازطراحی شوند، اما تغییر FortiWeb نباید بدون هماهنگی Application Team انجام شود.
Formهای Dynamic، Data Grid و GraphQL میتوانند تعداد Parameter یا Body بزرگ تولید کنند. Constraint باید با Endpoint واقعی Tune شود.
بعضی Frameworkها Array را با نام تکراری ارسال میکنند؛ برای مثال item=1&item=2. قبل از Block مشخص کنید این رفتار بخشی از طراحی برنامه است یا Parameter Pollution.
وجود Null Byte در URL یا Parameter معمولاً مشکوک است و میتواند در Bypass یا Truncation استفاده شود. این کنترل معمولاً Candidate خوبی برای Block است، مگر Application Legacy رفتار خاصی داشته باشد.
پرتالهایی که چند Application روی یک Domain دارند ممکن است Cookieهای زیادی ارسال کنند. Domain و Path Cookieها باید توسط Application Team اصلاح شود؛ افزایش نامحدود Limit راهحل بلندمدت نیست.
| Method | کاربرد رایج | تصمیم |
|---|---|---|
| GET/HEAD | دریافت Resource | معمولاً مجاز |
| POST | Form و API | مجاز در URLهای لازم |
| PUT/PATCH/DELETE | REST API | فقط Endpointهای API |
| OPTIONS | CORS Preflight | برای API Browser ممکن است لازم باشد. |
| PROPFIND/MKCOL | WebDAV | فقط در صورت استفاده WebDAV |
| TRACE | Diagnostic قدیمی | معمولاً Block |
برای Video Streaming و Download Resume، Range لازم است. تعداد Range یا Overlap باید محدود شود، اما حذف کامل Range میتواند Streaming را مختل کند.
Upload فایل از multipart/form-data استفاده میکند. Boundary نامعتبر، Header ناقص یا Part غیرعادی میتواند Malformed تشخیص داده شود. Endpointهای Upload باید با Browser، Mobile App و SDK واقعی تست شوند.
HTTP/2 و HTTP/3 Request را به Frame یا Stream تقسیم میکنند و محدودیتهای متفاوتی نسبت به HTTP/1.1 دارند. FortiWeb 7.6.9 سختسازی بیشتری برای این پروتکلها ارائه میدهد.
FortiWeb برای Parse و Scan بعضی Requestها به Buffer نیاز دارد. اگر Request بزرگتر از Cache یا Scan Buffer باشد، ممکن است رفتار Check تغییر کند یا Request بهصورت Malformed دیده شود.
| سناریو | Constraint محتمل | راهحل درست |
|---|---|---|
| SAML Login | Header/Cookie/Body Length | اندازهگیری Callback و Exception محدود |
| Upload فایل | Body Length یا Multipart | Exception فقط روی Upload URL |
| WebDAV | Illegal Method | مجازکردن Method فقط روی مسیر WebDAV |
| API Bulk | Body/Parameter Count | Profile جدا برای API یا URL خاص |
| Search پیچیده | URL Length | اندازهگیری و ترجیح POST در طراحی Application |
| CDN/APM | Header Count | حذف Header غیرضروری یا افزایش محدود |
| Legacy Client | Malformed/Illegal Character | اصلاح Client؛ Exception آخرین گزینه |
| Flow | Header Max | Body Max | URL Max | Method |
|---|---|---|---|---|
| Login معمولی | 6 KB | 8 KB | 250 Byte | POST |
| SAML Callback | 14 KB | 350 KB | 300 Byte | POST |
| REST API | 5 KB | 2 MB | 700 Byte | GET/POST/PATCH |
| Large Upload | 4 KB | 50 MB | 180 Byte | POST |
دامنه portal.example.com چهار Flow دارد:
| URL | رفتار | Profile Decision |
|---|---|---|
| /login | Form کوچک | همه Constraintهای عمومی |
| /sso/callback | SAML Body بزرگ و Cookie بیشتر | Limit اندازهگیریشده |
| /api/v1/* | JSON و PATCH/DELETE | Profile API یا Exception Method محدود |
| /upload/large | فایل تا 50 MB | Omit فقط Maximum Body Length |
| Constraint | Severity اولیه | دلیل |
|---|---|---|
| CL/TE Coexistence | High | ریسک Smuggling |
| Illegal Content Length | High | Parser Confusion |
| Null Character | High | Bypass و Truncation |
| Header Length | Medium | ممکن است Legitimate باشد. |
| Body Length | Medium | وابسته به Upload و API |
| Malformed Request | High | نیازمند تحلیل Request خام |
در Offline Protection نیز قابلیت میتواند استفاده شود، اما Actionهای قابل اجرا و رفتار Block با Mode استقرار متفاوت است. برای Enforcement واقعی، Inline Mode لازم است.
set ? کنترل کنید.
config waf HTTP-constraints-exceptions
edit "PARTIAN-UPLOAD-BODY-EXCEPTION"
config HTTP_constraints-exception-list
edit 1
set host-status enable
set host "portal.example.com"
set request-type plain
set request-file "/upload/large"
set max-HTTP-body-length enable
next
end
next
end
config waf HTTP-protocol-parameter-restriction
edit "PARTIAN-HPC-MONITOR"
set exception "PARTIAN-UPLOAD-BODY-EXCEPTION"
set illegal-content-length-check enable
set illegal-content-length-action alert
set illegal-content-length-severity High
set cl-te-coexist-check enable
set cl-te-coexist-action alert
set cl-te-coexist-severity High
set max-HTTP-header-length-check enable
set max-HTTP-header-length 16384
set max-HTTP-header-length-action alert
set max-HTTP-header-length-severity Medium
set max-HTTP-body-length-check enable
set max-HTTP-body-length 10485760
set max-HTTP-body-length-action alert
set max-HTTP-body-length-severity Medium
set block-malformed-request-check enable
set block-malformed-request-action alert
set block-malformed-request-severity High
next
end
config waf web-protection-profile inline-protection
edit "PARTIAN-INLINE-PROFILE"
set HTTP-protocol-parameter-restriction "PARTIAN-HPC-MONITOR"
next
end
config waf HTTP-protocol-parameter-restriction
edit "PARTIAN-HPC-MONITOR"
set ?
end
end
show waf HTTP-constraints-exceptions
show waf HTTP-protocol-parameter-restriction
show waf web-protection-profile inline-protection
config waf HTTP-protocol-parameter-restriction
edit "PARTIAN-HPC-MONITOR"
set illegal-content-length-action alert_deny
set cl-te-coexist-action alert_deny
set block-malformed-request-action alert_deny
next
end
| فاز | Action | خروجی لازم |
|---|---|---|
| Discovery | Alert | فهرست Flow و Maximumها |
| Tuning | Alert | Exception محدود و حذف Noise |
| Pilot | Alert & Deny برای چند Constraint | عدم اختلال و Log قابل تحلیل |
| Enforcement | Alert & Deny | Monitoring و Rollback |
| وضعیت | تصمیم |
|---|---|
| Request حمله واضح است. | Block و Trigger |
| Request Legitimate و فقط یک URL است. | Exception محدود |
| Request Legitimate در کل Application است. | Limit Profile را افزایش دهید. |
| Client غیر استاندارد است. | اصلاح Client ترجیح دارد. |
| علت نامشخص است. | Alert باقی بماند و Packet جمع شود. |
| مشکل | علت محتمل | بررسی | راهحل |
|---|---|---|---|
| SSO Fail | Header، Cookie یا Body Limit | Callback و Log | Limit یا Exception محدود |
| Upload Block | Body Length یا Multipart | URL و Body Size | Exception فقط Constraint لازم |
| Exception Match نمیشود. | Host، URL، Regex یا Order | Protected Host و Slash | Simple String و Rule بالاتر |
| API Method Block | PATCH/DELETE/OPTIONS | Method و CORS | Profile API یا Scope محدود |
| Malformed روی Request بزرگ | Buffer یا Cache | Request Size و Cache | تنظیم ظرفیت یا معماری Upload |
| HTTP/2 مشکل دارد. | Frame یا Stream Limit | Browser Protocol | Tune کنترل HTTP/2 |
| چند کاربر Block میشوند. | NAT و Block Period | Client IP واقعی | Alert & Deny یا XFF صحیح |
| CLI Error | نام Field متفاوت | set ? | CLI Reference همان Build |