تا اینجا یاد گرفتیم:
Scope
↓
Recon
↓
Port Discovery
↓
Service Detection
↓
Enumeration
اما حالا باید یک مهارت بسیار مهم را یاد بگیریم:
وقتی یک برنامه وب با ما صحبت میکند، دقیقاً چه چیزی بین Browser و Server ردوبدل میشود؟
اگر HTTP را درست نفهمی، درک بسیاری از آسیبپذیریهای وب هم ناقص خواهد بود.
پس قبل از اینکه سراغ آسیبپذیریهایی مثل SQL Injection، XSS یا ضعفهای Authentication برویم، باید خود HTTP را بشناسیم.
۱. HTTP چیست؟
HTTP مخفف:
HyperText Transfer Protocol
است.
به زبان ساده، HTTP یکی از پروتکلهایی است که Browser و Web Server از طریق آن با یکدیگر ارتباط برقرار میکنند.
مثلاً وقتی وارد:
http://localhost:3000
میشوی، مرورگر یک Request ارسال میکند.
سرور آن را پردازش کرده و Response برمیگرداند.
مدل ذهنی:
┌──────────────┐
│ Browser │
└──────┬───────┘
│
│ HTTP Request
▼
┌──────────────┐
│ Web Server │
└──────┬───────┘
│
│ HTTP Response
▼
┌──────────────┐
│ Browser │
└──────────────┘
همین رفتوبرگشت، یکی از مهمترین چیزهایی است که در Web Pentesting بررسی میکنیم.
۲. یک Request ساده
فرض کن مرورگر میخواهد صفحه اصلی را دریافت کند.
یک Request ساده میتواند چیزی شبیه این باشد:
GET / HTTP/1.1
Host: localhost:3000
User-Agent: Browser
Accept: text/html
بیایید آن را تجزیه کنیم.
۳. HTTP Method
قسمت اول:
GET
نام Method است.
Method به سرور میگوید نوع عملیاتی که Client درخواست کرده چیست.
Methodهای مهم:
GET
POST
PUT
PATCH
DELETE
OPTIONS
HEAD
فعلاً چهار مورد اصلی را بشناس:
GET
معمولاً برای دریافت اطلاعات.
GET /products
POST
معمولاً برای ارسال داده.
POST /login
PUT
معمولاً برای جایگزینی یا بهروزرسانی یک Resource.
DELETE
برای حذف یک Resource.
نکته مهم:
Method بهتنهایی مشخص نمیکند عملیات امن است یا آسیبپذیر.
باید رفتار واقعی برنامه را بررسی کنیم.
۴. Path چیست؟
در این Request:
GET /products HTTP/1.1
این قسمت:
/products
Path است.
در یک برنامه ممکن است Pathهای مختلفی وجود داشته باشد:
/
/login
/register
/products
/search
/account
/api/products
هر Path میتواند منطق متفاوتی در Backend داشته باشد.
بنابراین برای Pentester:
Endpointها بخشی از Attack Surface هستند.
۵. Host
در HTTP/1.1 معمولاً Header مهمی داریم:
Host: localhost:3000
این Header مشخص میکند Request برای کدام Host ارسال شده است.
در محیطهای واقعی ممکن است یک سرور چند Virtual Host داشته باشد.
بنابراین:
IP Address
↓
Server
↓
Multiple Hosts
↓
Different Applications
این موضوع در Recon و Enumeration اهمیت زیادی دارد.
۶. HTTP Headers
بعد از Request Line، Headerها قرار میگیرند.
مثلاً:
User-Agent: ...
Accept: ...
Content-Type: ...
Cookie: ...
Authorization: ...
Headerها اطلاعاتی درباره Request و نحوه پردازش آن منتقل میکنند.
برای Pentester، Headerها بسیار مهم هستند چون ممکن است اطلاعاتی درباره:
- Authentication
- Session
- Content Type
- Client
- Caching
- Security Policies
در اختیارمان قرار دهند.
۷. Request Body
همه Requestها Body ندارند.
اما مثلاً یک POST Request ممکن است دادهای ارسال کند:
POST /login HTTP/1.1
Host: localhost:3000
Content-Type: application/json
{
"email": "user@example.test",
"password": "example"
}
در اینجا اطلاعات بعد از خط خالی، Request Body است.
ساختار ذهنی:
Request
│
├── Method
├── Path
├── Headers
└── Body
این چهار بخش را خوب یاد بگیر.
در Web Pentesting دائماً با آنها سروکار خواهی داشت.
۸. Response چیست؟
بعد از دریافت Request، سرور Response ارسال میکند.
مثلاً:
HTTP/1.1 200 OK
Content-Type: text/html
<html>
...
</html>
Response نیز ساختار مشخصی دارد:
Response
│
├── Status Code
├── Headers
└── Body
۹. Status Code
Status Code یکی از اولین چیزهایی است که هنگام تحلیل Response میبینیم.
چند مورد مهم:
200 OK
201 Created
204 No Content
301 Moved Permanently
302 Found
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
500 Internal Server Error
اما یک نکته بسیار مهم:
Status Code بهتنهایی وجود یا عدم وجود Vulnerability را ثابت نمیکند.
مثلاً:
403 Forbidden
فقط نشان میدهد سرور درخواست را مجاز ندانسته است.
ما باید بفهمیم:
چرا؟
و آیا راه دیگری برای دسترسی وجود دارد یا نه.
۱۰. Content-Type
یکی از Headerهای مهم:
Content-Type
است.
مثلاً:
Content-Type: text/html
یعنی محتوای Response از نوع HTML است.
یا:
Content-Type: application/json
یعنی داده JSON است.
در APIها معمولاً JSON زیاد مشاهده میکنیم:
{
"id": 15,
"name": "test"
}
Pentester باید بتواند نوع دادهای که برنامه مصرف و تولید میکند را تشخیص دهد.
۱۱. Cookie چیست؟
حالا وارد یکی از مهمترین بخشها میشویم:
Session Management
فرض کن کاربر Login کرده است.
سرور باید somehow بفهمد درخواستهای بعدی مربوط به همان کاربر هستند.
یکی از روشهای رایج استفاده از Cookie است.
مثلاً:
Set-Cookie: session=example
مرورگر این Cookie را ذخیره میکند و در درخواستهای بعدی ممکن است آن را ارسال کند:
Cookie: session=example
مدل ذهنی:
Login
↓
Server
↓
Session Created
↓
Cookie
↓
Browser
↓
Future Requests
۱۲. چرا Cookie برای Pentester مهم است؟
چون Session بخشی از هویت کاربر را در تعامل با برنامه نمایندگی میکند.
بنابراین سؤالهای امنیتی مهمی داریم:
Session چگونه ساخته میشود؟
Session چگونه اعتبارسنجی میشود؟
Session چه زمانی منقضی میشود؟
Cookie چه ویژگیهایی دارد؟
آیا Session قابل پیشبینی است؟
آیا Session پس از Logout معتبر میماند؟
فعلاً قرار نیست سراغ سوءاستفاده برویم.
ابتدا باید رفتار صحیح برنامه را بفهمیم.
۱۳. Authentication و Authorization یکی نیستند
این دو مفهوم را از همین الان جدا کن.
Authentication
یعنی:
تو چه کسی هستی؟
مثلاً Login.
Username + Password
↓
Authentication
↓
User Identity
Authorization
یعنی:
چه کاری اجازه داری انجام بدهی؟
مثلاً:
User
↓
View Own Profile
Admin
↓
Manage Users
ممکن است یک برنامه Authentication مناسبی داشته باشد اما Authorization ضعیفی داشته باشد.
این تفاوت در تست نفوذ بسیار مهم است.
۱۴. یک سناریوی ساده
فرض کن کاربر A وارد حساب خودش شده است.
درخواست:
GET /api/profile/100
سرور اطلاعات کاربر A را برمیگرداند.
حالا یک سؤال امنیتی:
اگر کاربر بتواند شناسه را تغییر دهد و:
GET /api/profile/101
بزند، چه اتفاقی میافتد؟
ما هنوز نمیگوییم آسیبپذیری وجود دارد.
باید رفتار برنامه را بررسی کنیم:
Request
↓
Authorization Check
↓
Is User Allowed?
↓
Response
اگر برنامه بدون بررسی مالکیت، اطلاعات Resource متعلق به کاربر دیگر را برگرداند، میتواند نشانه یک Broken Access Control باشد.
این دقیقاً نمونهای از اهمیت تحلیل Request و Response است.
۱۵. Browser DevTools
حالا وارد بخش عملی شو.
Juice Shop را اجرا کن و:
http://localhost:3000
را باز کن.
سپس:
F12
را بزن.
و وارد:
Network
شو.
صفحه را Refresh کن.
اکنون درخواستهای مختلفی مشاهده خواهی کرد.
روی یکی از Requestها کلیک کن.
معمولاً بخشهایی مثل این را میبینی:
Headers
Payload
Response
Cookies
هر کدام اطلاعات متفاوتی دارند.
۱۶. Request را قدمبهقدم بخوان
یک Request را انتخاب کن و این موارد را پیدا کن:
Method:
GET / POST / ...
URL:
...
Status:
...
Request Headers:
...
Response Headers:
...
Cookies:
...
Response Body:
...
حالا تلاش کن Request را بدون نگاه کردن به ابزار توضیح بدهی.
مثلاً:
«این یک GET Request است که برای Endpoint مشخصی ارسال شده، سرور با Status Code مشخصی پاسخ داده و Response از نوع JSON است.»
اگر بتوانی این کار را انجام دهی، داری از حالت «کاربر سایت» وارد حالت تحلیلگر ترافیک وب میشوی.
۱۷. Payload چیست؟
در برخی Requestها دادههایی ارسال میشوند.
مثلاً:
{
"email": "user@example.test",
"password": "example"
}
این دادهها ممکن است در:
- Query Parameters
- Form Data
- JSON Body
- Path Parameters
قرار بگیرند.
برای Pentester، هر ورودی یک نقطه مهم برای بررسی رفتار برنامه است.
مدل ذهنی:
User Input
↓
HTTP Request
↓
Backend
↓
Processing
↓
Database / Logic
↓
HTTP Response
اینجاست که بعدها وارد مبحث Input Validation میشویم.
۱۸. Query Parameter
مثلاً:
/search?q=phone
اینجا:
q=phone
یک Query Parameter است.
ممکن است چند پارامتر داشته باشیم:
/search?q=phone&page=2&sort=price
از نگاه Pentester، باید بدانیم:
- این پارامتر چه کاری انجام میدهد؟
- آیا سمت Server پردازش میشود؟
- چه نوع دادهای قبول میکند؟
- آیا محدودیت دارد؟
- آیا رفتار برنامه با تغییر مقدار آن تغییر میکند؟
فعلاً فقط مشاهده و تحلیل میکنیم.
۱۹. چرا Burp Suite مهم میشود؟
تا اینجا از Browser DevTools استفاده کردیم.
در مراحل بعدی از ابزارهای تخصصیتر مثل Burp Suite استفاده خواهیم کرد.
Burp میتواند به ما کمک کند:
Browser
↓
Burp Proxy
↓
Application
در نتیجه میتوانیم HTTP Traffic را بهتر مشاهده و در محیط آزمایشگاهی Requestها را برای تحلیل کنترلشده بررسی کنیم.
اما قبل از استفاده جدی از Burp باید HTTP را خوب بفهمیم.
ابزار جای دانش را نمیگیرد.
۲۰. یک طرز فکر مهم
وقتی یک Request میبینی، به جای اینکه فقط بگویی:
«این Request چیست؟»
این سؤالها را بپرس:
چه کسی این Request را ارسال کرده؟
به کجا ارسال شده؟
چه دادهای ارسال شده؟
سرور چه پاسخی داده؟
چه چیزی در سمت Client کنترل میشود؟
چه چیزی باید در سمت Server کنترل شود؟
آیا Authentication وجود دارد؟
آیا Authorization بررسی میشود؟
آیا داده حساس ارسال میشود؟
اینها سؤالهای امنیتی هستند.
۲۱. تمرین عملی
در Juice Shop:
تمرین اول
DevTools را باز کن.
یک Request از نوع GET پیدا کن.
ثبت کن:
Method:
URL:
Status:
Content-Type:
تمرین دوم
یک Request از نوع POST پیدا کن.
ثبت کن:
Method:
URL:
Content-Type:
Request Body:
Status:
Response Type:
تمرین سوم
یک Request دارای Cookie پیدا کن.
بررسی کن:
Cookie Name:
Secure:
HttpOnly:
SameSite:
اگر یکی از این ویژگیها در ابزار نمایش داده نشد، آن را حدس نزن؛ فقط همان چیزی را که واقعاً مشاهده میکنی ثبت کن.
۲۲. Recon Notebook را کاملتر کن
دفترچهای که در قسمت قبل ساختیم را به این شکل گسترش بده:
================================
HTTP ANALYSIS
================================
Methods Observed:
GET
POST
...
Interesting Endpoints:
...
Content Types:
...
Cookies:
...
Authentication:
...
Potential Parameters:
...
Interesting Responses:
...
Open Questions:
...
این دفترچه بعداً در زمان تحلیل آسیبپذیریها بسیار کاربردی خواهد بود.
۲۳. چالش قسمت چهارم
بدون اجرای Exploit، فقط با مشاهده Traffic، یک Request را انتخاب کن و این زنجیره را کامل کن:
Browser
↓
HTTP Method
↓
URL / Endpoint
↓
Parameters
↓
Headers
↓
Cookies
↓
Server
↓
Status Code
↓
Response
بعد جواب این سؤال را بنویس:
«اگر بخواهم امنیت این Request را بررسی کنم، دقیقاً چه چیزهایی باید بدانم؟»
پاسخ را با حداقل ۵ مورد بنویس.
جمعبندی
در این قسمت یاد گرفتیم که Web Application فقط چیزی نیست که در Browser میبینیم.
پشت هر صفحه:
Request
↓
Server Logic
↓
Response
وجود دارد.
و پشت هر Request، اطلاعاتی مثل:
Method
URL
Parameters
Headers
Cookies
Body
قرار گرفته است.
یک Pentester باید بتواند این ارتباط را بخواند.
چون در مراحل بعدی، بسیاری از آسیبپذیریها را دقیقاً از همینجا پیدا میکنیم:
HTTP
↓
Input
↓
Application Logic
↓
Security Control
↓
Potential Vulnerability
قسمت بعد
در قسمت ۰۵ وارد Burp Suite و Intercept کردن HTTP Traffic در آزمایشگاه میشویم و یاد میگیریم چگونه یک Request را متوقف، مشاهده و برای تحلیل امنیتی بررسی کنیم.
از آنجا، Web Pentesting وارد فاز بسیار عملیتری میشود.

دیدگاه شما