138 | https://www.google.com/intl/am/gmail/about/
139 |
140 |
141 |
142 |
143 | ...
144 | ```
145 |
146 | ### TXT امنیتی (Security TXT)
147 |
148 | ا [security.txt](https://securitytxt.org) توسط IETF به عنوان [RFC 9116 - یک فرمت فایل برای کمک به افشای آسیب پذیری های امنیتی](https://www.rfc-editor.org/rfc/rfc9116.html) تصویب شد که به سایت ها اجازه می دهد تا سیاست های امنیتی و جزئیات تماس را تعریف کنند. دلایل متعددی وجود دارد که چرا این ممکن است در سناریوهای آزمایشی جالب باشد، که شامل اما نه محدود به:
149 |
150 | - شناسایی مسیرها یا منابع بیشتر برای گنجاندن در کشف/تحلیل.
151 | - جمع آوری اطلاعات منبع باز.
152 | - یافتن اطلاعات در مورد Bug Bounties و غیره.
153 | - مهندسی اجتماعی.
154 |
155 | فایل ممکن است در ریشه وب سرور یا دایرکتوری `/well-known.` وجود داشته باشد، به عنوان مثال:
156 |
157 | - `https://example.com/security.txt`
158 | - `https://example.com/.well-known/security.txt`
159 |
160 | در اینجا یک نمونه دنیای واقعی است که از LinkedIn در 5 مه 2020 بازیابی شده است:
161 |
162 | ```bash
163 | $ wget --no-verbose https://www.linkedin.com/.well-known/security.txt && cat security.txt
164 | 2020-05-07 12:56:51 URL:https://www.linkedin.com/.well-known/security.txt [333/333] -> "security.txt" [1]
165 | # Conforms to IETF `draft-foudil-securitytxt-07`
166 | Contact: mailto:security@linkedin.com
167 | Contact: https://www.linkedin.com/help/linkedin/answer/62924
168 | Encryption: https://www.linkedin.com/help/linkedin/answer/79676
169 | Canonical: https://www.linkedin.com/.well-known/security.txt
170 | Policy: https://www.linkedin.com/help/linkedin/answer/62924
171 | ```
172 |
173 | ### TXT انسان ها (Humans TXT)
174 |
175 | ا `humans.txt` ابتکاری برای شناخت افراد پشت سایت است. این به شکل یک فایل متنی است که حاوی اطلاعاتی در مورد افراد مختلفی است که در ساخت سایت مشارکت داشته اند. این فایل اغلب (اما نه همیشه) حاوی اطلاعات مرتبط به مشاغل یا سایتها/مسیرهای شغلی است.
176 |
177 | مثال زیر در 5 مه 2020 از Google بازیابی شده است:
178 |
179 | ```bash
180 | $ wget --no-verbose https://www.google.com/humans.txt && cat humans.txt
181 | 2020-05-07 12:57:52 URL:https://www.google.com/humans.txt [286/286] -> "humans.txt" [1]
182 | Google is built by a large team of engineers, designers, researchers, robots, and others in many different sites across the globe. It is updated continuously, and built with more tools and technologies than we can shake a stick at. If you'd like to help us out, see careers.google.com.
183 | ```
184 |
185 | ### سایر منابع اطلاعاتی well-known.
186 |
187 | ا RFC ها و پیش نویس های اینترنتی دیگری نیز وجود دارند که استفاده استاندارد شده از فایل ها را در `/well-known.` دایرکتوری پیشنهاد می کنند. لیست آنها را می توانید در [اینجا](https://en.wikipedia.org/wiki/List_of_/.well-known/_services_offered_by_webservers) یا [اینجا](https://www.iana.org/assignments/well-known-uris/well-known-uris.xhtml) پیدا کنید.
188 |
189 | بررسی RFC یا پیش نویس ها و ایجاد فهرستی برای ارائه به یک خزنده یا fuzzer برای یک آزمایش کننده نسبتاً ساده است تا وجود یا محتوای چنین فایل هایی را تأیید کند.
190 |
191 | ## ابزارها
192 |
193 | - Browser (View Source or Dev Tools functionality)
194 | - curl
195 | - wget
196 | - Burp Suite
197 | - ZAP
198 |
--------------------------------------------------------------------------------
/4-Web_Application_Security_Testing/01-Information_Gathering/06-Identify_Application_Entry_Points.md:
--------------------------------------------------------------------------------
1 | # Identify Application Entry Points (fa-IR)
2 |
3 | شناسایی نقاط ورودی برنامه (فارسی)
4 |
5 | |شناسه |
6 | |------------|
7 | |WSTG-INFO-06|
8 |
9 | ## خلاصه
10 |
11 | برشمردن برنامه و سطح حمله آن یک پیشرو کلیدی قبل از انجام هر گونه آزمایش کامل است، زیرا به آزمایش کننده اجازه می دهد نقاط ضعف احتمالی را شناسایی کند. هدف این بخش کمک به شناسایی و ترسیم مناطق درون برنامه است که باید پس از تکمیل شمارش و نقشه برداری بررسی شوند.
12 |
13 | ## اهداف آزمایش
14 |
15 | - نقاط ورود و تزریق احتمالی را از طریق تجزیه و تحلیل درخواست و پاسخ شناسایی کنید.
16 |
17 | ## چگونه آزمایش کنیم
18 |
19 | قبل از شروع هر آزمایشی، آزمایش کننده باید همیشه درک خوبی از برنامه و نحوه ارتباط کاربر و مرورگر با آن داشته باشد. هنگامی که آزمایش کننده در برنامه قدم می زند، باید به تمام درخواست های HTTP و همچنین هر پارامتر و فیلد فرمی که به برنامه ارسال می شود توجه کند. باید توجه ویژه ای به زمان استفاده از درخواست های GET و زمان استفاده از درخواست های POST برای ارسال پارامترها به برنامه داشته باشد. علاوه بر این، همچنین باید به زمان استفاده از روش های دیگر برای خدمات RESTful توجه کنند.
20 |
21 | توجه داشته باشید که برای دیدن پارامترهای ارسال شده در بدنه درخواست ها مانند درخواست POST، آزمایش کننده ممکن است بخواهد از ابزاری مانند یک پروکسی رهگیری (intercepting proxy) استفاده کند (به [ابزارها](#ابزارها) مراجعه کنید). در درخواست POST، آزمایش کننده باید هر فیلد فرم پنهانی را که به برنامه ارسال می شود، یادداشت ویژه ای داشته باشد، زیرا این فیلدها معمولاً حاوی اطلاعات حساسی هستند، مانند اطلاعات وضعیت، تعداد اقلام، قیمت اقلام، در نظر گرفته شده برای هر کسی که ببیند یا تغییر دهد. که توسعه دهنده هرگز آن ها را ندارد.
22 |
23 | در تجربه نویسنده، استفاده از یک پروکسی رهگیری و یک صفحه گسترده برای این مرحله از آزمایش بسیار مفید بوده است. پروکسی هر درخواست و پاسخی را که بین آزمایش کننده و برنامه بررسی می کند، پیگیری می کند. علاوه بر این، در این مرحله، آزمایش کننده ها معمولاً هر درخواست و پاسخی را به دام می اندازند تا بتوانند دقیقاً هر هدر، پارامتر و غیره ای را که به برنامه ارسال می شود و آنچه برگردانده می شود، ببینند. این ممکن است گاهی اوقات بسیار خسته کننده باشد، به خصوص در سایت های تعاملی بزرگ (به یک برنامه بانکی فکر کنید). با این حال، تجربه نشان خواهد داد که به دنبال چه چیزی باشید و این مرحله می تواند به میزان قابل توجهی کاهش یابد.
24 |
25 | وقتی آزمایش کننده در برنامه قدم می زند، باید هر پارامتر جالب در URL، سرصفحه های سفارشی یا بدنه درخواست ها/پاسخ ها را یادداشت کند و آنها را در صفحه گسترده ذخیره کند. صفحه گسترده باید شامل صفحه درخواست شده باشد (ممکن است خوب باشد که شماره درخواست از پروکسی را نیز برای مراجعات بعدی اضافه کنید)، پارامترهای جالب، نوع درخواست (GET، POST و غیره)، اگر دسترسی احراز هویت یا احراز هویت نشده باشد، اگر از TLS استفاده می شود، اگر بخشی از یک فرآیند چند مرحله ای است، اگر از WebSockets استفاده می شود، و هر یادداشت مرتبط دیگری. هنگامی که آنها هر منطقه از برنامه را ترسیم کردند، سپس می توانند برنامه را مرور کنند و هر یک از مناطقی را که شناسایی کرده اند آزمایش کنند و یادداشت برداری کنند که چه چیزی کار می کند و چه چیزی کار نکرده است. بقیه این راهنما نحوه آزمایش هر یک از این زمینه های مورد علاقه را مشخص می کند.
26 |
27 | در زیر برخی از نکات مورد علاقه برای همه درخواست ها و پاسخ ها آمده است. در بخش درخواست ها، روی روش های GET و POST تمرکز کنید، زیرا این روش ها اکثر درخواست ها را نشان می دهند. توجه داشته باشید که از روش های دیگری مانند PUT و DELETE نیز می توان استفاده کرد. اغلب، این درخواست های نادرتر، اگر مجاز باشند، می توانند آسیب پذیری ها را آشکار کنند. بخش ویژه ای در این راهنما برای آزمایش این روش های HTTP اختصاص داده شده است.
28 |
29 | ### درخواست ها
30 |
31 | - محل استفاده از GET و محل استفاده از POST را مشخص کنید.
32 | - تمام پارامترهای مورد استفاده در یک درخواست POST را شناسایی کنید (این پارامترها در بدنه درخواست هستند).
33 | - در درخواست POST، به پارامترهای پنهان توجه ویژه ای داشته باشید. هنگامی که یک POST ارسال می شود، تمام فیلدهای فرم (از جمله پارامترهای پنهان) در متن پیام HTTP به برنامه ارسال می شود. اینها معمولاً دیده نمی شوند مگر اینکه از یک پروکسی یا مشاهده کد منبع HTML استفاده شود. علاوه بر این، صفحه بعدی نشان داده شده، داده های آن و سطح دسترسی بسته به مقدار پارامتر(های) پنهان می تواند متفاوت باشد.
34 | - تمام پارامترهای مورد استفاده در یک درخواست GET (یعنی URL)، به ویژه رشته کوئری (معمولاً پس از علامت ?) را شناسایی کنید.
35 | - تمام پارامترهای رشته پرس و جو را شناسایی کنید. اینها معمولاً در قالب جفت هستند، مانند `foo=bar`. همچنین توجه داشته باشید که بسیاری از پارامترها می توانند در یک رشته پرس و جو باشند، مثلاً با یک `&`, `~\`, `:` یا هر کاراکتر خاص یا رمزگذاری دیگری از هم جدا شوند.
36 | - یک نکته خاص در مورد شناسایی چند پارامتر در یک رشته یا در یک درخواست POST این است که برخی یا همه پارامترها برای اجرای حملات مورد نیاز خواهند بود. آزمایش کننده باید تمام پارامترها را شناسایی کند (حتی اگر رمزگذاری شده باشد) و شناسایی کند که کدام یک توسط برنامه پردازش می شوند. بخش های بعدی راهنما نحوه آزمایش این پارامترها را مشخص می کند. در این مرحله، فقط مطمئن شوید که هر یک از آنها شناسایی شده است.
37 | - همچنین به هر نوع هدر اضافی یا سفارشی که معمولاً دیده نمی شود توجه کنید (مانند `debug: false`).
38 |
39 | ### پاسخ ها
40 |
41 | - محل تنظیم کوکی های جدید (`Set-Cookie` سرصفحه (هدر))، اصلاح یا اضافه شدن به آن را مشخص کنید.
42 | - در طول پاسخ های معمولی (یعنی درخواست های اصلاح نشده) مکان هایی را که تغییر مسیرها وجود دارد (کد وضعیت HTTP 3xx)، کد وضعیت 400، به ویژه 403 ممنوعه (Forbidden)، و 500 خطای داخلی سرور (internal server errors) وجود دارد.
43 | - همچنین توجه داشته باشید که در کجا از هدرهای جالب استفاده می شود. به عنوان مثال، `Server: BIG-IP` نشان می دهد که سایت دارای بار متعادل است. بنابراین، اگر یک سایت دارای بار متعادل باشد و یک سرور به درستی پیکربندی نشده باشد، ممکن است آزمایش کننده مجبور باشد بسته به نوع متعادل سازی بار مورد استفاده، چندین درخواست برای دسترسی به سرور آسیب پذیر ارائه دهد.
44 |
45 | ### آشکارساز سطح حمله OWASP (OWASP Attack Surface Detector)
46 |
47 | ابزار Attack Surface Detector (ASD) کد منبع را بررسی می کند و نقاط پایانی یک برنامه وب، پارامترهایی که این نقاط پایانی می پذیرند و نوع داده آن پارامترها را آشکار می کند. این شامل نقاط پایانی بدون پیوندی است که عنکبوت قادر به یافتن آن نخواهد بود یا پارامترهای اختیاری که کاملاً در کد سمت مشتری (client-side) استفاده نشده اند. همچنین این قابلیت را دارد که تغییرات سطح حمله را بین دو نسخه از یک برنامه محاسبه کند.
48 |
49 | آشکارساز سطح حمله به عنوان یک پلاگین (افزونه) برای ZAP و Burp Suite در دسترس است و یک ابزار خط فرمان نیز در دسترس است. ابزار خط فرمان سطح حمله را به عنوان یک خروجی JSON صادر می کند، که سپس می تواند توسط افزونه ZAP و Burp Suite استفاده شود. این برای مواردی مفید است که کد منبع مستقیماً در اختیار آزمایش کننده نفوذ قرار نمی گیرد. برای مثال، آزمایش کننده نفوذ می تواند فایل خروجی json را از مشتری (client) دریافت کند که نمی خواهد خود کد منبع را ارائه کند.
50 |
51 | ### نحوه استفاده
52 |
53 | فایل CLI jar برای دانلود از [https://github.com/secdec/attack-surface-detector-cli/releases](https://github.com/secdec/attack-surface-detector-cli/releases) در دسترس است.
54 |
55 | می توانید دستور زیر را برای ASD اجرا کنید تا نقاط پایانی را از کد منبع برنامه وب مورد نظر شناسایی کنید.
56 |
57 | `java -jar attack-surface-detector-cli-1.3.5.jar [flags]`
58 |
59 | در اینجا مثالی از اجرای دستور در برابر [OWASP RailsGoat](https://github.com/OWASP/railsgoat) آورده شده است.
60 |
61 | ```text
62 | $ java -jar attack-surface-detector-cli-1.3.5.jar railsgoat/
63 | Beginning endpoint detection for '<...>/railsgoat' with 1 framework types
64 | Using framework=RAILS
65 | [0] GET: /login (0 variants): PARAMETERS={url=name=url, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_contro
66 | ller.rb (lines '6'-'9')
67 | [1] GET: /logout (0 variants): PARAMETERS={}; FILE=/app/controllers/sessions_controller.rb (lines '33'-'37')
68 | [2] POST: /forgot_password (0 variants): PARAMETERS={email=name=email, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/
69 | password_resets_controller.rb (lines '29'-'38')
70 | [3] GET: /password_resets (0 variants): PARAMETERS={token=name=token, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/p
71 | assword_resets_controller.rb (lines '19'-'27')
72 | [4] POST: /password_resets (0 variants): PARAMETERS={password=name=password, paramType=QUERY_STRING, dataType=STRING, user=name=user, paramType=QUERY_STRING, dataType=STRING, confirm_password=name=confirm_password, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/password_resets_controller.rb (lines '5'-'17')
73 | [5] GET: /sessions/new (0 variants): PARAMETERS={url=name=url, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_controller.rb (lines '6'-'9')
74 | [6] POST: /sessions (0 variants): PARAMETERS={password=name=password, paramType=QUERY_STRING, dataType=STRING, user_id=name=user_id, paramType=SESSION, dataType=STRING, remember_me=name=remember_me, paramType=QUERY_STRING, dataType=STRING, url=name=url, paramType=QUERY_STRING, dataType=STRING, email=name=email, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_controller.rb (lines '11'-'31')
75 | [7] DELETE: /sessions/{id} (0 variants): PARAMETERS={}; FILE=/app/controllers/sessions_controller.rb (lines '33'-'37')
76 | [8] GET: /users (0 variants): PARAMETERS={}; FILE=/app/controllers/api/v1/users_controller.rb (lines '9'-'11')
77 | [9] GET: /users/{id} (0 variants): PARAMETERS={}; FILE=/app/controllers/api/v1/users_controller.rb (lines '13'-'15')
78 | ... snipped ...
79 | [38] GET: /api/v1/mobile/{id} (0 variants): PARAMETERS={id=name=id, paramType=QUERY_STRING, dataType=STRING, class=name=class, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/api/v1/mobile_controller.rb (lines '8'-'13')
80 | [39] GET: / (0 variants): PARAMETERS={url=name=url, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_controller.rb (lines '6'-'9')
81 | Generated 40 distinct endpoints with 0 variants for a total of 40 endpoints
82 | Successfully validated serialization for these endpoints
83 | 0 endpoints were missing code start line
84 | 0 endpoints were missing code end line
85 | 0 endpoints had the same code start and end line
86 | Generated 36 distinct parameters
87 | Generated 36 total parameters
88 | - 36/36 have their data type
89 | - 0/36 have a list of accepted values
90 | - 36/36 have their parameter type
91 | --- QUERY_STRING: 35
92 | --- SESSION: 1
93 | Finished endpoint detection for '<...>/railsgoat'
94 | ----------
95 | -- DONE --
96 | 0 projects had duplicate endpoints
97 | Generated 40 distinct endpoints
98 | Generated 40 total endpoints
99 | Generated 36 distinct parameters
100 | Generated 36 total parameters
101 | 1/1 projects had endpoints generated
102 | To enable logging include the -debug argument
103 | ```
104 |
105 | همچنین می توانید یک فایل خروجی JSON با استفاده از پرچم (flag) `json-` ایجاد کنید، که می تواند توسط افزونه برای ZAP و Burp Suite استفاده شود. برای جزئیات بیشتر به لینک های زیر مراجعه کنید.
106 |
107 | - [صفحه اصلی پلاگین ASD برای OWASP ZAP](https://github.com/secdec/attack-surface-detector-zap/wiki)
108 | - [صفحه اصلی پلاگین ASD برای PortSwigger Burp](https://github.com/secdec/attack-surface-detector-burp/wiki)
109 |
110 | ### تست نقاط ورودی برنامه (Testing for Application Entry Points)
111 |
112 | در زیر دو مثال در مورد نحوه بررسی نقاط ورودی برنامه آورده شده است.
113 |
114 | #### مثال 1
115 |
116 | این مثال یک درخواست GET را نشان می دهد که می تواند یک کالا را از یک برنامه خرید آنلاین خریداری کند.
117 |
118 | ```text
119 | GET /shoppingApp/buyme.asp?CUSTOMERID=100&ITEM=z101a&PRICE=62.50&IP=x.x.x.x HTTP/1.1
120 | Host: x.x.x.x
121 | Cookie: SESSIONID=Z29vZCBqb2IgcGFkYXdhIG15IHVzZXJuYW1lIGlzIGZvbyBhbmQgcGFzc3dvcmQgaXMgYmFy
122 | ```
123 |
124 | > تمام پارامترهای درخواست مانند CUSTOMERID، ITEM، PRICE، IP و Cookie که فقط می توانند پارامترها یا پارامترهای مورد استفاده برای وضعیت جلسه کدگذاری شوند.
125 |
126 | #### مثال 2
127 |
128 | این مثال یک درخواست POST را نشان می دهد که شما را به یک برنامه وارد می کند.
129 |
130 | ```text
131 | POST /example/authenticate.asp?service=login HTTP/1.1
132 | Host: x.x.x.x
133 | Cookie: SESSIONID=dGhpcyBpcyBhIGJhZCBhcHAgdGhhdCBzZXRzIHByZWRpY3RhYmxlIGNvb2tpZXMgYW5kIG1pbmUgaXMgMTIzNA==;CustomCookie=00my00trusted00ip00is00x.x.x.x00
134 |
135 | user=admin&pass=pass123&debug=true&fromtrustIP=true
136 | ```
137 |
138 | می توان توجه داشت که پارامترها در چندین مکان ارسال می شوند:
139 |
140 | 1. در رشته پرس و جو: `service`
141 | 2. در هدر کوکی: `SESSIONID`, `CustomCookie`
142 | 3. در بدنه درخواست: `user`, `pass`, `debug`,`fromtrustIP`
143 |
144 | وجود انواع مکان های تزریق، فرصت های زنجیره ای را برای مهاجم فراهم می کند که می تواند شانس یافتن یک اشکال در کد مدیریت را افزایش دهد.
145 |
146 | ## ابزارها
147 |
148 | - [OWASP Zed Attack Proxy (ZAP)](https://www.zaproxy.org/)
149 | - [Burp Suite](https://www.portswigger.net/burp/)
150 | - [Fiddler](https://www.telerik.com/fiddler)
151 |
152 | ## منابع
153 |
154 | - [RFC 2616 – Hypertext Transfer Protocol – HTTP 1.1](https://tools.ietf.org/html/rfc2616)
155 | - [OWASP Attack Surface Detector](https://owasp.org/www-project-attack-surface-detector/)
156 |
--------------------------------------------------------------------------------
/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/06-Test_HTTP_Methods.md:
--------------------------------------------------------------------------------
1 | # Test HTTP Methods (fa-IR)
2 |
3 | آزمایش روش های HTTP (فارسی)
4 |
5 | |شناسه |
6 | |------------|
7 | |WSTG-CONF-06|
8 |
9 | ## خلاصه
10 |
11 | ا HTTP تعدادی روش (یا افعال) را ارائه می دهد که می توان از آنها برای انجام اقدامات در وب سرور استفاده کرد. در حالی که GET و POST با اختلاف رایجترین روشهایی هستند که برای دسترسی به اطلاعات ارائهشده توسط وب سرور استفاده میشوند، روشهای مختلفی نیز وجود دارد که ممکن است پشتیبانی شوند و گاهی اوقات میتوانند توسط مهاجمان مورد سوء استفاده قرار گیرند.
12 |
13 | ا [RFC 7231](https://datatracker.ietf.org/doc/html/rfc7231) روش های اصلی درخواست معتبر HTTP (یا افعال) را تعریف می کند، اگرچه روش های اضافی در RFC های دیگر مانند [RFC 5789](https://datatracker.ietf.org/doc/html/rfc5789) اضافه شده است. چندین مورد از این افعال برای اهداف مختلف در برنامههای [RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer)، که در جدول زیر فهرست شدهاند، دوباره استفاده شدهاند.
14 |
15 | | روش | هدف اصلی | RESTful هدف |
16 | |--------|------------------|-----------------|
17 | | [`GET`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.1) | درخواست یک فایل | درخواست یک شی|
18 | | [`HEAD`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.2) | درخواست یک فایل، اما فقط هدر های HTTP را برمیگرداند | |
19 | | [`POST`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.3) | ارسال داده ها | |
20 | | [`PUT`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.4) | آپلود یک فایل | ایجاد یک شی |
21 | | [`DELETE`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.5) | حذف یک فایل | حذف یک شی |
22 | | [`CONNECT`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.6) | برقرار کردن ازتباط با یک سیستم دیگر | |
23 | | [`OPTIONS`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.7) | فهرست کردن روش های HTTP پشتیبانی شده | انجام دادن یک درخواست [CORS Preflight](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request) |
24 | | [`TRACE`](https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.8) | تکرار (Echo) کردن درخواست HTTP برای اهداف اشکال زدایی | |
25 | | [`PATCH`](https://datatracker.ietf.org/doc/html/rfc5789#section-2) | | تغییر دادن یک شی |
26 |
27 | ## اهداف آزمایش
28 |
29 | - روش های HTTP پشتیبانی شده را برشمارید.
30 | - آزمایش بای پس کنترل دسترسی.
31 | - روش های غلبه بر روش HTTP را آزمایش کنید.
32 |
33 | ## چگونه آزمایش کنیم
34 |
35 | ### روش های پشتیبانی شده را کشف کنید (Discover the Supported Methods)
36 |
37 | برای انجام این آزمایش، آزمایش کننده به روشی نیاز دارد تا تشخیص دهد کدام روش های HTTP توسط وب سروری که در حال بررسی است پشتیبانی می شود. ساده ترین راه برای انجام این کار، ارسال یک درخواست `OPTIONS` به سرور است:
38 |
39 | ```http
40 | OPTIONS / HTTP/1.1
41 | Host: example.org
42 | ```
43 |
44 | سپس سرور باید با لیستی از روش های پشتیبانی شده پاسخ دهد:
45 |
46 | ```http
47 | HTTP/1.1 200 OK
48 | Allow: OPTIONS, GET, HEAD, POST
49 | ```
50 |
51 | با این حال، برخی از سرورها ممکن است به درخواست های `OPTIONS` پاسخ ندهند، یا ممکن است اطلاعات نادرست را برگردانند. علاوه بر این، سرورها ممکن است از روشهای مختلفی برای مسیرهای مختلف پشتیبانی کنند - بنابراین فقط به این دلیل که یک روش برای دایرکتوری `/` ریشه (root) پشتیبانی نمیشود، لزوماً به این معنی نیست که در جای دیگری پشتیبانی نمیشود.
52 |
53 | یک راه مطمئن تر برای آزمایش روش های پشتیبانی شده این است که به سادگی یک درخواست با آن نوع روش ارسال کنید و پاسخ سرور را بررسی کنید. اگر روش مجاز نباشد، سرور باید وضعیت `405 Method Not Allowed` را برگرداند.
54 |
55 | توجه داشته باشید که برخی از سرورها روشهای ناشناخته را معادل `GET` تلقی میکنند، بنابراین ممکن است به روشهای دلخواه مانند درخواست نشان داده شده در زیر پاسخ دهند. گاهی اوقات این می تواند برای فرار از فایروال برنامه وب یا هر فیلتر دیگری که روش های خاص را مسدود می کند مفید باشد.
56 |
57 | ```http
58 | FOO / HTTP/1.1
59 | Host: example.org
60 | ```
61 |
62 | درخواست هایی با روش های دلخواه را می توان با استفاده از curl با گزینه `X-` نیز انجام داد:
63 |
64 | ```bash
65 | curl -X FOO https://example.org
66 | ```
67 |
68 | همچنین انواع مختلفی از ابزارهای خودکار وجود دارند که می توانند روش های پشتیبانی شده را تعیین کنند، مانند [`http-methods`](https://nmap.org/nsedoc/scripts/http-methods.html) اسکریپت Nmap. با این حال، این ابزارها ممکن است روشهای خطرناک را آزمایش نکنند (یعنی روشهایی که ممکن است باعث تغییراتی مانند `PUT` یا `DELETE`) شوند، یا در صورت پشتیبانی از این روشها ممکن است ناخواسته تغییراتی در وب سرور ایجاد کنند. به این ترتیب، آنها باید با احتیاط استفاده شوند.
69 |
70 | ### قرار دادن و حذف (PUT and DELETE)
71 |
72 | متدهای `PUT` و `DELETE` بسته به اینکه توسط وب سرور تفسیر می شوند یا توسط برنامه ای که روی آن اجرا می شود، می توانند اثرات متفاوتی داشته باشند.
73 |
74 | #### وب سرورهای قدیمی (Legacy Web Servers)
75 |
76 | برخی از وب سرورهای قدیمی اجازه استفاده از روش `PUT` را برای ایجاد فایل روی سرور می دادند. برای مثال، اگر سرور به گونهای پیکربندی شده باشد که این اجازه را بدهد، درخواست زیر فایلی را در سرور به نام `test.html` ایجاد میکند که حاوی محتویات `` می باشد.
77 |
78 | ```http
79 | PUT /test.html HTTP/1.1
80 | Host: example.org
81 | Content-Length: 25
82 |
83 |
84 | ```
85 |
86 | درخواست های مشابهی را نیز می توان با cURL انجام داد:
87 |
88 | ```bash
89 | curl https://example.org --upload-file test.html
90 | ```
91 |
92 | این به مهاجم اجازه میدهد تا فایلهای دلخواه را در وبسرور آپلود کند، که در صورت امکان آپلود کدهای اجرایی مانند فایلهای PHP، به طور بالقوه میتواند منجر به خطر افتادن کامل سیستم شود. با این حال، این پیکربندی بسیار نادر است و بعید است در هیچ سیستم مدرنی دیده شود.
93 |
94 | به طور مشابه، روش `DELETE` می تواند برای حذف فایل ها از وب سرور استفاده شود. توجه داشته باشید که این یک اقدام مخرب است، بنابراین هنگام آزمایش این روش باید مراقب باشید.
95 |
96 | ```http
97 | DELETE /test.html HTTP/1.1
98 | Host: example.org
99 | ```
100 |
101 | یا با cURL:
102 |
103 | ```bash
104 | curl http://example.org/test.html -X DELETE
105 | ```
106 |
107 | #### API های RESTful (RESTful APIs)
108 |
109 | در مقابل، روشهای `PUT` و `DELETE` معمولاً توسط برنامههای RESTful مدرن برای ایجاد و حذف اشیا استفاده میشوند. به عنوان مثال، درخواست API زیر می تواند برای ایجاد کاربری به نام "foo" با نقش "user" استفاده شود:
110 |
111 | ```http
112 | PUT /api/users/foo HTTP/1.1
113 | Host: example.org
114 | Content-Length: 34
115 |
116 | {
117 | "role": "user"
118 | }
119 | ```
120 |
121 | یک درخواست مشابه با روش DELETE می تواند برای حذف یک شی استفاده شود.
122 |
123 | ```http
124 | DELETE /api/users/foo HTTP/1.1
125 | Host: example.org
126 | ```
127 |
128 | اگرچه ممکن است توسط ابزارهای اسکن خودکار گزارش شود، وجود این روش ها در RESTful API یک مشکل امنیتی نیست. با این حال، این عملکرد ممکن است دارای آسیبپذیریهای دیگری باشد (مانند کنترل دسترسی ضعیف)، و باید کاملاً آزمایش شود.
129 |
130 | ### پی گیری (TRACE)
131 |
132 | روش `TRACE` (یا معادل روش `TRACK` مایکروسافت) باعث می شود که سرور محتوای درخواست را بازتاب دهد. این منجر به آسیبپذیری به نام Cross-Site Tracing (XST) شد که در سال [2003](https://www.cgisecurity.com/whitehat-mirror/WH-WhitePaper_XST_ebook.pdf) (PDF) منتشر شد، که میتوان از آن برای دسترسی به کوکیهایی استفاده کرد که دارای پرچم `HttpOnly` هستند (flag set). روش `TRACE` سالهاست که در همه مرورگرها و افزونهها مسدود شده است و به همین دلیل این مشکل دیگر قابل استفاده نیست. با این حال، ممکن است همچنان توسط ابزارهای اسکن خودکار علامت گذاری شود، و روش `TRACE` فعال شده در یک وب سرور نشان می دهد که به درستی سخت نشده است.
133 |
134 | ### اتصال (CONNECT)
135 |
136 | روش `CONNECT` باعث می شود وب سرور یک اتصال TCP را به سیستم دیگری باز کند و سپس ترافیک مشتری را به آن سیستم منتقل کند. این می تواند به مهاجم اجازه دهد تا ترافیک پروکسی را از طریق سرور، به منظور پنهان کردن آدرس منبع خود، دسترسی به سیستم های داخلی یا دسترسی به خدماتی که به لوکال هاست متصل هستند، انجام دهد. نمونه ای از یک درخواست `CONNECT` در زیر نشان داده شده است:
137 |
138 | ```http
139 | CONNECT 192.168.0.1:443 HTTP/1.1
140 | Host: example.org
141 | ```
142 |
143 | ### پچ (PATCH)
144 |
145 | روش `PATCH` در [RFC 5789](https://datatracker.ietf.org/doc/html/rfc5789) تعریف شده است و برای ارائه دستورالعملهایی در مورد چگونگی تغییر یک شی استفاده میشود. خود RFC تعریف نمیکند که این دستورالعملها در چه قالبی باید باشند، اما روشهای مختلفی در استانداردهای دیگر تعریف شدهاند، مانند [RFC 6902 - JavaScript Object Notation (JSON) Patch](https://datatracker.ietf.org/doc/html/rfc6902).
146 |
147 | به عنوان مثال، اگر کاربری به نام "foo" با ویژگی های زیر داشته باشیم:
148 |
149 | ```json
150 | {
151 | "role": "user",
152 | "email": "foo@example.org"
153 | }
154 | ```
155 |
156 | درخواست JSON PATCH زیر می تواند برای تغییر نقش این کاربر "admin" بدون تغییر آدرس ایمیل استفاده شود:
157 |
158 | ```http
159 | PATCH /api/users/foo HTTP/1.1
160 | Host: example.org
161 |
162 | { "op": "replace", "path": "/role", "value": "admin" }
163 | ```
164 |
165 | اگرچه RFC بیان میکند که باید شامل دستورالعملهایی برای نحوه اصلاح شی (object) باشد، روش `PATCH` معمولاً برای گنجاندن محتوای تغییر یافته استفاده میشود، همانطور که در زیر نشان داده شده است. مانند درخواست قبلی، این مقدار "role" را بدون تغییر بقیه شی به "admin" تغییر میدهد. این برخلاف روش `PUT` است که کل شی را بازنویسی میکند (و در نتیجه منجر به یک شی بدون ویژگی "email" میشود).
166 |
167 | ```http
168 | PATCH /api/users/foo HTTP/1.1
169 | Host: example.org
170 |
171 | {
172 | "role": "admin"
173 | }
174 | ```
175 |
176 | مانند روش `PUT`، این عملکرد ممکن است دارای ضعف های کنترل دسترسی یا آسیب پذیری های دیگر باشد. بهعلاوه، برنامهها ممکن است در هنگام تغییر یک شی، همان سطح اعتبارسنجی ورودی را انجام ندهند که هنگام ایجاد آن انجام میدهند. این می تواند به طور بالقوه اجازه تزریق مقادیر مخرب را بدهد (مانند یک حمله اسکریپت نویسی بین سایتی ذخیره شده (stored cross-site scripting attack))، یا می تواند به اشیاء شکسته یا نامعتبر اجازه دهد که ممکن است منجر به مشکلات مربوط به منطق تجاری (business logic) شود.
177 |
178 | ### آزمایش بای پس کنترل دسترسی (Testing for Access Control Bypass)
179 |
180 | اگر صفحه ای در برنامه زمانی که کاربران تلاش می کنند و مستقیماً به آن دسترسی پیدا می کنند، به صفحه ورود با کد `302` هدایت می کند، ممکن است بتوان با درخواست با روش HTTP متفاوت، مانند `HEAD`، `POST` یا حتی یک روش ساخته شده مانند `FOO`، اگر برنامه وب با `HTTP/1.1 200 OK` به جای `HTTP/1.1 302 Found` مورد انتظار پاسخ دهد، ممکن است امکان دور زدن احراز هویت یا مجوز وجود داشته باشد. مثال زیر نشان میدهد که چگونه درخواست `HEAD` ممکن است منجر به تنظیم صفحه کوکیهای مدیریتی به جای هدایت کاربر به صفحه ورود به سیستم شود:
181 |
182 | ```http
183 | HEAD /admin/ HTTP/1.1
184 | Host: example.org
185 | ```
186 |
187 | ```http
188 | HTTP/1.1 200 OK
189 | [...]
190 | Set-Cookie: adminSessionCookie=[...];
191 | ```
192 |
193 | از طرف دیگر، ممکن است درخواست مستقیم به صفحاتی که باعث عملکرد می شوند وجود داشته باشد، مانند:
194 |
195 | ```http
196 | HEAD /admin/createUser.php?username=foo&password=bar&role=admin HTTP/1.1
197 | Host: example.org
198 | ```
199 |
200 | یا:
201 |
202 | ```http
203 | FOO /admin/createUser.php
204 | Host: example.org
205 | Content-Length: 36
206 |
207 | username=foo&password=bar&role=admin
208 | ```
209 |
210 | ### آزمایش برای نادیده گرفتن روش HTTP (Testing for HTTP Method Overriding)
211 |
212 | برخی از چارچوبهای وب راهی برای نادیده گرفتن روش HTTP واقعی در درخواست با شبیهسازی افعال HTTP از دست رفته و ارسال سرصفحه سفارشی در درخواستها ارائه میکنند. هدف اصلی از این کار دور زدن یک برنامه میان افزاری (مانند فایروال پروکسی یا برنامه وب) است که روش های خاصی را مسدود می کند. هدرهای جایگزین HTTP زیر به طور بالقوه می توانند مورد استفاده قرار گیرند:
213 |
214 | - `X-HTTP-Method`
215 | - `X-HTTP-Method-Override`
216 | - `X-Method-Override`
217 |
218 | به منظور آزمایش این، در سناریوهایی که افعال محدود شده مانند `PUT` یا `DELETE` یک `405 Method not allowed` را برمیگردانند، همان درخواست را با اضافه کردن سرصفحههای جایگزین برای نادیده گرفتن روش HTTP دوباره پخش کنید و مشاهده کنید که سیستم چگونه پاسخ میدهد. برنامه باید با یک کد وضعیت متفاوت پاسخ دهد (به عنوان مثال `200 OK`) در مواردی که نادیده گرفتن روش پشتیبانی می شود.
219 |
220 | وب سرور در مثال زیر به روش `DELETE` اجازه نمی دهد و آن را مسدود می کند:
221 |
222 | ```http
223 | DELETE /resource.html HTTP/1.1
224 | Host: example.org
225 | ```
226 |
227 | ```http
228 | HTTP/1.1 405 Method Not Allowed
229 | [...]
230 | ```
231 |
232 | پس از افزودن هدر `X-HTTP-Method`، سرور با 200 به درخواست پاسخ می دهد:
233 |
234 | ```http
235 | GET /resource.html HTTP/1.1
236 | Host: example.org
237 | X-HTTP-Method: DELETE
238 | ```
239 |
240 | ```http
241 | HTTP/1.1 200 OK
242 | [...]
243 | ```
244 |
245 | ## اصلاح
246 |
247 | - مطمئن شوید که فقط روش های مورد نیاز مجاز هستند و روش های مجاز به درستی پیکربندی شده اند.
248 | - اطمینان حاصل کنید که هیچ راه حلی برای دور زدن اقدامات امنیتی اجرا شده توسط عوامل کاربر، چارچوب ها یا سرورهای وب اجرا نمی شود.
249 |
250 | ## ابزارها
251 |
252 | - [Ncat](https://nmap.org/ncat/)
253 | - [cURL](https://curl.haxx.se/)
254 | - [Nmap http-methods NSE script](https://nmap.org/nsedoc/scripts/http-methods.html)
255 |
256 | ## منابع
257 |
258 | - [RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1)](https://datatracker.ietf.org/doc/html/rfc7231)
259 | - [RFC 5789 - PATCH Method for HTTP](https://datatracker.ietf.org/doc/html/rfc5789)
260 | - [HTACCESS: BILBAO Method Exposed](https://web.archive.org/web/20160616172703/http://www.kernelpanik.org/docs/kernelpanik/bme.eng.pdf)
261 | - [Fortify - Misused HTTP Method Override](https://vulncat.fortify.com/en/detail?id=desc.dynamic.xtended_preview.often_misused_http_method_override)
262 | - [Mozilla Developer Network - Safe HTTP Methods](https://developer.mozilla.org/en-US/docs/Glossary/Safe/HTTP)
263 |
--------------------------------------------------------------------------------
/4-Web_Application_Security_Testing/01-Information_Gathering/10-Map_Application_Architecture.md:
--------------------------------------------------------------------------------
1 | # Map Application Architecture (fa-IR)
2 |
3 | معماری برنامه نقشه (فارسی)
4 |
5 | |شناسه |
6 | |------------|
7 | |WSTG-INFO-10|
8 |
9 | ## خلاصه
10 |
11 | برای اینکه به طور موثر یک برنامه را آزمایش کنید و بتوانید توصیه های معناداری در مورد نحوه رسیدگی به هر یک از مسائل شناسایی شده ارائه دهید، مهم است که بفهمید واقعاً چه چیزی را آزمایش می کنید. علاوه بر این، می تواند به تعیین اینکه آیا اجزای خاص باید خارج از محدوده آزمایش در نظر گرفته شوند، کمک کند.
12 |
13 | برنامه های وب مدرن می توانند به طور قابل توجهی از نظر پیچیدگی متفاوت باشند، از یک اسکریپت ساده که روی یک سرور واحد اجرا می شود تا یک برنامه بسیار پیچیده که در ده ها سیستم، زبان و مؤلفه مختلف پخش شده است. همچنین ممکن است اجزای دیگری در سطح شبکه مانند فایروال ها یا سیستم های حفاظت از نفوذ وجود داشته باشد که می تواند تأثیر قابل توجهی در آزمایش داشته باشد.
14 |
15 | ## اهداف آزمایش
16 |
17 | - معماری برنامه و فناوری های مورد استفاده را درک کنید.
18 |
19 | ## چگونه آزمایش کنیم
20 |
21 | هنگام آزمایش از منظر جعبه سیاه، مهم است که سعی کنید تصویر واضحی از نحوه عملکرد برنامه و اینکه چه فناوری ها و مؤلفه هایی در آن وجود دارند ایجاد کنید. در برخی موارد امکان آزمایش اجزای خاص (مانند فایروال برنامه وب) وجود دارد، در حالی که برخی دیگر را می توان با بررسی رفتار برنامه شناسایی کرد.
22 |
23 | بخش های زیر یک نمای کلی از اجزای معماری رایج را به همراه جزئیات نحوه شناسایی آنها ارائه می دهد.
24 |
25 | ### اجزای برنامه (Application Components)
26 |
27 | #### وب سرور (Web Server)
28 |
29 | برنامه های ساده ممکن است روی یک سرور اجرا شوند که با استفاده از مراحلی که در بخش [Fingerprint Web Server](02-Fingerprint_Web_Server.md) در راهنما توضیح داده شده است، قابل شناسایی هستند.
30 |
31 | #### پلتفرم به عنوان سرویس (PaaS) (Platform-as-a-Service (PaaS))
32 |
33 | در مدل پلتفرم به عنوان سرویس (PaaS)، وب سرور و زیرساخت های زیربنایی توسط ارائه دهنده خدمات مدیریت می شوند و مشتری فقط مسئول برنامه ای است که این برنامه بر روی آنها مستقر شده است. از دیدگاه آزمایش، دو تفاوت اصلی وجود دارد:
34 |
35 | - مالک برنامه به زیرساخت اصلی دسترسی ندارد، بنابراین نمی تواند مستقیماً هیچ مشکلی را برطرف کند.
36 | - آزمایش زیرساخت به احتمال زیاد خارج از محدوده هر گونه تعاملی است.
37 |
38 | در برخی موارد، شناسایی استفاده از PaaS امکان پذیر است، زیرا ممکن است برنامه از یک نام دامنه خاص استفاده کند (به عنوان مثال، برنامه های مستقر در Azure App Services یک دامنه `azurewebsites.net.*` دارند - اگرچه ممکن است از دامنه های سفارشی نیز استفاده کنند). با این حال، در موارد دیگر، تعیین اینکه آیا PaaS در حال استفاده است یا خیر دشوار است.
39 |
40 | #### بدون سرور (Serverless)
41 |
42 | در یک مدل بدون سرور، توسعه دهندگان کدی را ارائه می کنند که مستقیماً بر روی یک پلتفرم میزبانی به عنوان توابع جداگانه اجرا می شود، نه به عنوان یک برنامه وب بزرگتر سنتی که در وبروت (webroot) مستقر شده است. این باعث می شود آن را به خوبی برای معماری های مبتنی بر میکروسرویس مناسب کند. همانند محیط PaaS، آزمایش زیرساخت احتمالاً خارج از محدوده است.
43 |
44 | در برخی موارد استفاده از کد بدون سرور ممکن است با وجود هدرهای خاص HTTP نشان داده شود. به عنوان مثال، توابع AWS Lambda معمولاً هدرهای زیر را برمی گرداند:
45 |
46 | ```text
47 | X-Amz-Invocation-Type
48 | X-Amz-Log-Type
49 | X-Amz-Client-Context
50 | ```
51 |
52 | توابع Azure کمتر آشکار هستند. آنها معمولاً هدر `Server: Kestrel` را برمی گردانند - اما این به تنهایی برای اطمینان از اینکه یک تابع Azure App است، به جای کد دیگری که روی Kestrel اجرا می شود کافی نیست.
53 |
54 | #### میکروسرویس ها (Microservices)
55 |
56 | در معماری مبتنی بر میکروسرویس، API برنامه از چندین سرویس گسسته تشکیل شده است، نه اینکه به عنوان یک برنامه یکپارچه اجرا شود. خود سرویس ها اغلب در داخل کانتینرها (معمولاً با Kubernetes) اجرا می شوند و می توانند از سیستم عامل ها و زبان های مختلف استفاده کنند. اگرچه آنها معمولاً پشت یک دروازه و دامنه API واحد قرار دارند، استفاده از چندین زبان (اغلب در پیام های خطای دقیق نشان داده می شود) می تواند نشان دهد که میکروسرویس ها در حال استفاده هستند.
57 |
58 | #### ذخیره سازی استاتیک (Static Storage)
59 |
60 | بسیاری از برنامه ها محتوای ثابت را به جای میزبانی مستقیم بر روی سرور اصلی وب، بر روی پلتفرم های ذخیره سازی اختصاصی ذخیره می کنند. دو پلتفرم متداول عبارتند از Amazon's S3 Buckets و Azure's Storage Accounts و به راحتی با نام دامنه قابل شناسایی هستند:
61 |
62 | - سطل های S3 آمازون (Amazon S3 Buckets) `BUCKET.s3.amazonaws.com` یا `s3.REGION.amazonaws.com/BUCKET` هستند
63 | - حساب های ذخیره سازی Azure (یا Azure Storage Accounts) `ACCOUNT.blob.core.windows.net` هستند
64 |
65 | این حسابهای ذخیرهسازی اغلب میتوانند فایلهای حساس را افشا کنند، همانطور که در بخش [Testing Cloud Storage Guide](../02-Configuration_and_Deployment_Management_Testing/11-Test_Cloud_Storage.md) بحث شد.
66 |
67 | #### پایگاه داده (Database)
68 |
69 | اکثر برنامه های وب غیر پیش پا افتاده از نوعی پایگاه داده برای ذخیره محتوای پویا استفاده می کنند. در برخی موارد امکان تعیین پایگاه داده وجود دارد، اگرچه معمولاً به مسائل دیگر در برنامه متکی است. این اغلب می تواند توسط:
70 |
71 | - پورت سرور را اسکن می کند و به دنبال هر پورت باز مرتبط با پایگاه داده خاص است.
72 | - راهاندازی پیامهای خطای مرتبط با SQL (یا NoSQL) (یا یافتن خطاهای موجود از [موتور جستجو](../01-Information_Gathering/01-Conduct_Search_Engine_Discovery_Reconnaissance_for_Information_Leakage.md)).
73 |
74 | در مواردی که تعیین قطعی پایگاه داده امکان پذیر نیست، اغلب می توانید بر اساس سایر جنبه های برنامه حدس درستی بزنید:
75 |
76 | - ا Windows، IIS و ASP.NET اغلب از سرور Microsoft SQL استفاده می کنند.
77 | - ا سیستم های جاسازی شده اغلب از SQLite استفاده می کنند.
78 | - ا PHP اغلب از MySQL یا PostgreSQL استفاده می کند.
79 | - ا APEX اغلب از Oracle استفاده می کند.
80 |
81 | اینها قوانین سختی نیستند، اما اگر اطلاعات بهتری در دسترس نباشند، مطمئناً می توانند نقطه شروع معقولی به شما بدهند.
82 |
83 | #### احراز هویت (Authentication)
84 |
85 | اکثر برنامه ها دارای نوعی احراز هویت برای کاربران هستند. چندین بک اند های (back ends) احراز هویت وجود دارد که می توان از آنها استفاده کرد، مانند:
86 |
87 | - پیکربندی وب سرور (از جمله فایل های `htaccess.`) یا رمزهای عبور سخت کدگذاری شده در اسکریپت ها.
88 | - معمولاً به عنوان احراز هویت پایه HTTP نشان داده می شود که با یک پنجره بازشو (pop-up) در مرورگر و یک HTTP هدر `WWW-Authenticate: Basic` نشان داده می شود.
89 | - حساب های کاربری محلی در پایگاه داده.
90 | - معمولاً در یک فرم یا نقطه پایانی (endpoint) API در برنامه یکپارچه می شود.
91 | - یک منبع احراز هویت مرکزی موجود مانند اکتیو دایرکتوری یا یک سرور LDAP.
92 | - ممکن است از احراز هویت NTLM استفاده کند که با HTTP هدر `WWW-Authenticate: NTLM` نشان داده شده است.
93 | - ممکن است در یک فرم به برنامه وب ادغام شود.
94 | - ممکن است نیاز باشد که نام کاربری در قالب "DOMAIN\username" وارد شود، یا ممکن است فهرستی از دامنه های موجود ارائه شود.
95 | - Single Sign-On (SSO) با ارائه دهنده داخلی یا خارجی.
96 | - معمولاً از OAuth، OpenID Connect یا SAML استفاده میکند.
97 |
98 | برنامهها ممکن است گزینههای متعددی را برای احراز هویت کاربر فراهم کنند (مانند ثبت یک حساب محلی یا استفاده از حساب فیسبوک موجود خود)، و ممکن است از مکانیسمهای مختلفی برای کاربران و مدیران عادی استفاده کنند.
99 |
100 | #### خدمات و APIهای شخص ثالث (Third Party Services and APIs)
101 |
102 | تقریباً همه برنامههای وب شامل منابع شخص ثالثی هستند که توسط مشتری بارگذاری میشوند یا با آنها تعامل دارند. این موارد می تواند شامل موارد زیر باشد:
103 |
104 | - محتوای فعال ([Active content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content#mixed_active_content)) (مانند اسکریپت ها، شیوه نامه ها، فونت ها و iframe ها).
105 | - محتوای غیرفعال ([Passive content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content#mixed_passivedisplay_content)) (مانند تصاویر و ویدیوها).
106 | - API های خارجی
107 | - دکمه های رسانه های اجتماعی
108 | - شبکه های تبلیغاتی
109 | - درگاه های پرداخت
110 |
111 | این منابع مستقیماً توسط مرورگر کاربر درخواست می شوند، بنابراین با استفاده از ابزارهای توسعه دهنده یا یک پروکسی رهگیری به راحتی قابل شناسایی هستند. در حالی که شناسایی آنها مهم است (زیرا می توانند بر امنیت برنامه تأثیر بگذارند)، به یاد داشته باشید که آنها معمولاً خارج از محدوده آزمایش هستند، زیرا متعلق به اشخاص ثالث هستند.
112 |
113 | ### اجزای شبکه (Network Components)
114 |
115 | #### پروکسی معکوس (Reverse Proxy)
116 |
117 | یک پروکسی معکوس در مقابل یک یا چند سرور بکاند قرار میگیرد و درخواستها را به مقصد مناسب هدایت میکند. آنها می توانند عملکردهای مختلفی را اجرا کنند، مانند:
118 |
119 | - به عنوان [متعادل کننده بار](#متعادل-کننده-بار-load-balancer) یا [فایروال برنامه وب](#فایروال-برنامه-وب-web-application-firewall-waf) عمل می کند.
120 | - امکان میزبانی چندین برنامه در یک آدرس IP یا دامنه (در زیر پوشه ها (subfolders)).
121 | - اجرای فیلتر IP یا سایر محدودیت ها.
122 | - ذخیره محتوا از بک اند برای بهبود عملکرد.
123 |
124 | شناسایی یک پروکسی معکوس همیشه امکان پذیر نیست (مخصوصاً اگر فقط یک برنامه در پشت آن وجود داشته باشد)، اما گاهی اوقات می توانید آن را با موارد زیر شناسایی کنید:
125 |
126 | - عدم تطابق بین سرور فرانت اند و برنامه (مانند هدر `Server: nginx` با یک برنامه ASP.NET).
127 | - این گاهی اوقات می تواند منجر به آسیب پذیری های قاچاق در درخواست ([request smuggling vulnerabilities](https://portswigger.net/web-security/request-smuggling)) شود.
128 | - هدرهای تکراری (مخصوصا هدر `Server`).
129 | - چندین برنامه میزبانی شده در یک آدرس IP یا دامنه (به خصوص اگر از زبان های مختلف استفاده می کنند).
130 |
131 | #### متعادل کننده بار (Load Balancer)
132 |
133 | یک Load Balanser در مقابل چندین سرور بکاند قرار میگیرد و درخواستها را بین آنها تخصیص میدهد تا افزونگی و ظرفیت پردازش بیشتری را برای برنامه فراهم کند.
134 |
135 | تشخیص متعادل کننده بار ها ممکن است دشوار باشد، اما گاهی اوقات می توان با درخواست های متعدد و بررسی پاسخ ها برای تفاوت ها آن ها را تشخیص داد، مانند:
136 |
137 | - زمان سیستم متناقض
138 | - آدرس های IP داخلی مختلف یا نام میزبان در پیام های خطای دقیق.
139 | - آدرسهای مختلف از جعل درخواست سمت سرور (SSRF) ([Server-Side Request Forgery (SSRF)](../07-Input_Validation_Testing/19-Testing_for_Server-Side_Request_Forgery.md)) بازگردانده شد.
140 |
141 | همچنین ممکن است با وجود کوکی های خاصی مشخص شوند (برای مثال، متعادل کننده بار F5 BIG-IP یک کوکی به نام `BIGipServer` ایجاد می کند.
142 |
143 | #### شبکه تحویل (توزیع) محتوا (CDN) (Content Delivery Network (CDN))
144 |
145 | شبکه تحویل محتوا (CDN) مجموعهای از سرورهای پراکسی ذخیرهسازی شده از نظر جغرافیایی است که برای بهبود عملکرد وبسایت و ایجاد انعطافپذیری بیشتر برای وبسایت طراحی شده است.
146 |
147 | معمولاً با اشاره به دامنه عمومی به سرورهای CDN، و سپس پیکربندی CDN برای اتصال به سرورهای پشتیبان صحیح (که گاهی اوقات به عنوان "منبع" شناخته می شود) پیکربندی می شود.
148 |
149 | ساده ترین راه برای شناسایی یک CDN، انجام جستجوی WHOIS برای آدرس های IP است که دامنه به آنها رسیدگی می کند. اگر آنها متعلق به یک شرکت CDN هستند (مانند Akamai، Cloudflare یا Fastly - برای فهرست کاملتر به [ویکیپدیا](https://en.wikipedia.org/wiki/Content_delivery_network#Notable_content_delivery_service_providers) مراجعه کنید) مانند این است که یک CDN در حال استفاده است.
150 |
151 | هنگام آزمایش یک سایت پشت CDN، باید نکات زیر را در نظر داشته باشید:
152 |
153 | - ا IP ها و سرورها متعلق به ارائه دهنده CDN هستند و احتمالاً خارج از محدوده آزمایش زیرساخت هستند.
154 | - ا بسیاری از CDN ها همچنین دارای ویژگی هایی مانند تشخیص ربات، محدود کردن نرخ و فایروال برنامه های وب هستند.
155 | - ا CDN ها معمولاً محتوا را در حافظه پنهان نگه می دارند، بنابراین هر تغییری که در بک اند وب سایت ایجاد می شود ممکن است بلافاصله ظاهر نشود.
156 |
157 | اگر سایت پشت یک CDN باشد، شناسایی سرورهای بکاند میتواند مفید باشد. اگر کنترل دسترسی مناسبی برای آنها اعمال نشده باشد، ممکن است بتوانید CDN (و هرگونه حفاظتی که ارائه می دهد) را با دسترسی مستقیم به سرورهای پشتیبان دور بزنید. روشهای مختلفی وجود دارد که به شما امکان میدهد سیستم پشتیبان را شناسایی کنید:
158 |
159 | - ایمیلهای ارسال شده توسط برنامه ممکن است مستقیماً از سرور پشتیبان ارسال شوند که میتواند نشانی IP آن را نشان دهد.
160 | - سنگ زنی DNS، انتقال منطقه یا لیست های شفافیت گواهی برای دامنه ممکن است آن را در یک زیر دامنه نشان دهد.
161 | - اسکن محدوده IP شناخته شده برای استفاده توسط شرکت ممکن است سرور انتهایی را پیدا کند.
162 | - سوء استفاده از جعل درخواست سمت سرور ([Server-Side Request Forgery (SSRF)](../07-Input_Validation_Testing/19-Testing_for_Server-Side_Request_Forgery.md)) ممکن است آدرس IP را آشکار کند.
163 | - پیامهای خطای دقیق از برنامه ممکن است آدرسهای IP یا نام میزبان را در معرض نمایش بگذارد.
164 |
165 | ### اجزای امنیتی (Security Components)
166 |
167 | #### فایروال (دیوار آتشی) شبکه (Network Firewall)
168 |
169 | اکثر وب سرورها توسط یک فیلترینگ بسته یا فایروال بازرسی حالتی محافظت می شوند که هر گونه ترافیک شبکه را که مورد نیاز نیست مسدود می کند. برای تشخیص این مورد، پورت اسکن سرور را انجام دهید و نتایج را بررسی کنید.
170 |
171 | اگر اکثر پورت ها به صورت "بسته" نشان داده شوند (یعنی یک بسته (پکت) `RST` را در پاسخ به بسته اولیه `SYN` برمی گردانند) این نشان می دهد که سرور ممکن است توسط فایروال محافظت نشود. اگر پورت ها به صورت "فیلتر شده" نشان داده شوند (یعنی هنگام ارسال بسته `SYN` به یک پورت استفاده نشده پاسخی دریافت نمی شود) به احتمال زیاد یک فایروال در محل وجود دارد.
172 |
173 | علاوه بر این، اگر سرویسهای نامناسبی در معرض دید جهانیان قرار گیرند (مانند SMTP، IMAP، MySQL، و غیره)، این نشان میدهد که یا فایروال وجود ندارد، یا اینکه فایروال بهخوبی پیکربندی شده است.
174 |
175 | #### سیستم تشخیص و پیشگیری از نفوذ شبکه (Network Intrusion Detection and Prevention System)
176 |
177 | یک سیستم تشخیص نفوذ شبکه (Intrusion Detection System (IDS)) فعالیت های مشکوک یا مخرب در سطح شبکه (مانند پورت یا اسکن آسیب پذیری) را شناسایی می کند و هشدارها را افزایش می دهد. یک سیستم پیشگیری از نفوذ (Intrusion Prevention System (IPS)) مشابه است، اما همچنین برای جلوگیری از فعالیت - معمولاً با مسدود کردن آدرس IP منبع، اقداماتی را انجام می دهد.
178 |
179 | یک IPS را معمولاً میتوان با اجرای ابزارهای اسکن خودکار (مانند اسکنر پورت) در مقابل هدف و مشاهده مسدود شدن IP منبع شناسایی کرد. با این حال، بسیاری از ابزارهای سطح برنامه ممکن است توسط یک IPS شناسایی نشوند (به خصوص اگر TLS را رمزگشایی نکند).
180 |
181 | #### فایروال برنامه وب (Web Application Firewall (WAF))
182 |
183 | فایروال برنامه وب (WAF) محتویات درخواستهای HTTP را بررسی میکند و مواردی را که مشکوک یا مخرب به نظر میرسند مسدود میکند، یا به صورت پویا سایر کنترلها مانند CAPTCHA یا محدود کردن نرخ را اعمال میکند. آنها معمولاً بر اساس مجموعه ای از امضاهای بد شناخته شده و عبارات منظم، مانند مجموعه قوانین اصلی OWASP ([OWASP Core Rule Set](https://owasp.org/www-project-modsecurity-core-rule-set/)) هستند. WAF ها می توانند در محافظت در برابر برخی از انواع حملات (مانند تزریق SQL یا اسکریپت بین سایتی (cross-site scripting)) موثر باشند، اما در برابر انواع دیگر (مانند کنترل دسترسی یا مسائل مربوط به منطق تجاری) موثر نیستند.
184 |
185 | یک WAF را می توان در چندین مکان مستقر کرد، از جمله:
186 |
187 | - در خود وب سرور.
188 | - در یک ماشین مجازی یا دستگاه سخت افزاری جداگانه.
189 | - در فضای ابری مقابل سرور انتهایی.
190 |
191 | از آنجایی که WAF درخواستهای مخرب را مسدود میکند، میتوان با افزودن رشتههای حمله رایج به پارامترها و مشاهده مسدود بودن یا نبودن آنها، آن را شناسایی کرد. برای مثال، سعی کنید پارامتری به نام `foo` با مقداری مانند `UNION SELECT 1 '` یا `<` اضافه کنید. اگر این درخواستها مسدود شوند، نشان میدهد که ممکن است یک WAF وجود داشته باشد. علاوه بر این، محتویات صفحات مسدود ممکن است اطلاعاتی در مورد فناوری خاصی که در حال استفاده است ارائه دهد. در نهایت، برخی از WAF ها ممکن است کوکی ها یا هدرهای HTTP را به پاسخ ها اضافه کنند که می تواند حضور آنها را آشکار کند.
192 |
193 | اگر یک WAF مبتنی بر ابر استفاده میشود، ممکن است با استفاده از روشهای مشابهی که در بخش [شبکه تحویل محتوا](#شبکه-تحویل-توزیع-محتوا-cdn-content-delivery-network-cdn) بحث شده است، با دسترسی مستقیم به سرور پشتیبان، آن را دور بزنید.
194 |
--------------------------------------------------------------------------------
/4-Web_Application_Security_Testing/01-Information_Gathering/08-Fingerprint_Web_Application_Framework.md:
--------------------------------------------------------------------------------
1 | # Fingerprint Web Application Framework (fa-IR)
2 |
3 | انگشت نگاری چارچوب برنامه وب (فارسی)
4 |
5 | |شناسه |
6 | |------------|
7 | |WSTG-INFO-08|
8 |
9 | ## خلاصه
10 |
11 | هیچ چیز جدیدی در زیر نور خورشید وجود ندارد و تقریباً هر برنامه وب که ممکن است به توسعه آن فکر کنید قبلاً توسعه یافته است. با وجود تعداد زیادی از پروژه های نرم افزاری رایگان و متن باز که به طور فعال در سرتاسر جهان توسعه یافته و مستقر شده اند، به احتمال زیاد یک آزمایش امنیتی برنامه با هدفی مواجه خواهد شد که به طور کامل یا تا حدی به این برنامه ها یا چارچوب (فریمورک) های شناخته شده (مثلاً WordPress، phpBB، Mediawiki و غیره) وابسته است. دانستن اجزای برنامه وب که در حال آزمایش هستند کمک قابل توجهی به فرآیند آزمایش می کند و همچنین تلاش مورد نیاز در طول آزمایش را به شدت کاهش می دهد. این برنامه های وب شناخته شده دارای هدرهای HTML، کوکی ها و ساختارهای دایرکتوری هستند که می توان آنها را برای شناسایی برنامه شمارش کرد. اکثر چارچوب های وب دارای چندین نشانگر (marker) در آن مکان ها هستند که به مهاجم یا آزمایش کننده کمک می کند تا آنها را تشخیص دهد. این اساساً کاری است که همه ابزارهای خودکار انجام می دهند، آنها به دنبال یک نشانگر از یک مکان از پیش تعریف شده می گردند و سپس آن را با پایگاه داده امضاهای شناخته شده مقایسه می کنند. برای دقت بهتر معمولا از چندین نشانگر استفاده می شود.
12 |
13 | ## اهداف آزمایش
14 |
15 | - انگشت نگاری اجزای مورد استفاده توسط برنامه های وب.
16 |
17 | ## چگونه آزمایش کنیم
18 |
19 | ### آزمایش جعبه سیاه (Black-Box Testing)
20 |
21 | چندین مکان متداول (رایج) وجود دارد که باید به منظور شناسایی چارچوب ها یا مؤلفه ها در نظر گرفته شود:
22 |
23 | - هدرهای HTTP
24 | - کوکی ها
25 | - کد منبع (سورس کد) HTML
26 | - فایل ها و پوشه های خاص
27 | - پسوند فایل
28 | - پیغام خطا
29 |
30 | #### هدرهای HTTP (HTTP Headers)
31 |
32 | ابتدایی ترین شکل شناسایی یک چارچوب وب، نگاه کردن به فیلد `X-Powered-By` در هدر پاسخ HTTP (HTTP response header) است. ابزارهای زیادی را می توان برای انگشت نگاری یک هدف استفاده کرد، ساده ترین آنها netcat است.
33 |
34 | ا HTTP Request-Response زیر را در نظر بگیرید:
35 |
36 | ```text
37 | $ nc 127.0.0.1 80
38 | HEAD / HTTP/1.0
39 |
40 | HTTP/1.1 200 OK
41 | Server: nginx/1.0.14
42 | [...]
43 | X-Powered-By: Mono
44 | ```
45 |
46 | از فیلد `X-Powered-By`، می فهمیم که چارچوب برنامه وب احتمالاً `Mono` خواهد بود. با این حال، اگرچه این رویکرد ساده و سریع است، اما این روش در 100% موارد کار نمی کند. این امکان وجود دارد که به راحتی هدر `X-Powered-By` را با یک پیکربندی مناسب غیرفعال کنید. همچنین چندین تکنیک وجود دارد که به یک وب سایت اجازه می دهد هدرهای HTTP را مبهم کند (به یک مثال در بخش [اصلاح](#اصلاح) مراجعه کنید). در مثال بالا همچنین می توانیم توجه داشته باشیم که نسخه خاصی از `nginx` برای ارائه محتوا استفاده می شود.
47 |
48 | بنابراین در همان مثال، آزمایش کننده می تواند هدر `X-Powered-By` را از دست بدهد یا پاسخی مانند زیر دریافت کند:
49 |
50 | ```text
51 | HTTP/1.1 200 OK
52 | Server: nginx/1.0.14
53 | Date: Sat, 07 Sep 2013 08:19:15 GMT
54 | Content-Type: text/html;charset=ISO-8859-1
55 | Connection: close
56 | Vary: Accept-Encoding
57 | X-Powered-By: Blood, sweat and tears
58 | ```
59 |
60 | گاهی اوقات هدرهای HTTP بیشتری وجود دارد که به یک چارچوب خاص اشاره می کنند. در مثال زیر، با توجه به اطلاعات درخواست HTTP، می توان مشاهده کرد که هدر `X-Powered-By` حاوی نسخه PHP است. با این حال، هدر `X-Generator` اشاره می کند که چارچوب استفاده شده در واقع `Swiftlet` است، که به آزمایش کننده نفوذ کمک می کند تا بردارهای حمله خود را گسترش دهد. هنگام انجام انگشت نگاری، هر هدر HTTP را برای وجود چنین نشتی به دقت بررسی کنید.
61 |
62 | ```text
63 | HTTP/1.1 200 OK
64 | Server: nginx/1.4.1
65 | Date: Sat, 07 Sep 2013 09:22:52 GMT
66 | Content-Type: text/html
67 | Connection: keep-alive
68 | Vary: Accept-Encoding
69 | X-Powered-By: PHP/5.4.16-1~dotdeb.1
70 | Expires: Thu, 19 Nov 1981 08:52:00 GMT
71 | Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
72 | Pragma: no-cache
73 | X-Generator: Swiftlet
74 | ```
75 |
76 | #### کوکی ها (Cookies)
77 |
78 | یکی دیگر از روش های مشابه و تا حدودی مطمئن تر برای تعیین چارچوب فعلی وب، کوکی های فریمورک خاص (framework-specific cookies) هستند.
79 |
80 | درخواست HTTP زیر را در نظر بگیرید:
81 |
82 | \
83 | *شکل 1-4.1.8: Cakephp HTTP Request*
84 |
85 | کوکی `CAKEPHP` به طور خودکار تنظیم شده است، که اطلاعاتی در مورد چارچوب مورد استفاده ارائه می دهد. لیستی از نام های رایج کوکی ها در بخش کوکی ها ارائه شده است. هنوز محدودیت هایی در تکیه بر این مکانیسم شناسایی وجود دارد - امکان تغییر نام [کوکی ها](#کوکی-ها-cookies) وجود دارد. به عنوان مثال، برای چارچوب `CakePHP` انتخاب شده، این کار را می توان از طریق پیکربندی زیر انجام داد (گزیده ای از `core.php`):
86 |
87 | ```php
88 | /**
89 | * The name of CakePHP's session cookie.
90 | *
91 | * Note the guidelines for Session names states: "The session name references
92 | * the session id in cookies and URLs. It should contain only alphanumeric
93 | * characters."
94 | * @link http://php.net/session_name
95 | */
96 | Configure::write('Session.cookie', 'CAKEPHP');
97 | ```
98 |
99 | با این حال، احتمال ایجاد این تغییرات نسبت به تغییرات هدر `X-Powered-By` کمتر است، بنابراین این رویکرد برای شناسایی را می توان به عنوان قابل اعتمادتر در نظر گرفت.
100 |
101 | #### کد منبع HTML (HTML Source Code)
102 |
103 | این تکنیک بر اساس یافتن الگوهای خاصی در کد منبع صفحه HTML است. اغلب می توان اطلاعات زیادی پیدا کرد که به آزمایش کننده کمک می کند تا یک جزء خاص را تشخیص دهد. یکی از نشانگرهای رایج کامنت های HTML هستند که مستقیماً به افشای چارچوب منجر می شوند. اغلب مسیرهای خاص فریمورک (چارچوب) را می توان یافت، به عنوان مثال پیوند (لینک) هایی به پوشه های CSS یا JS مخصوص چارچوب. در نهایت، متغیرهای اسکریپت خاص نیز ممکن است به چارچوب خاصی اشاره کنند.
104 |
105 | از اسکرین شات زیر به راحتی می توان چارچوب مورد استفاده و نسخه آن را با نشانگرهای ذکر شده یاد گرفت. کامنت ها، مسیرهای خاص و متغیرهای اسکریپت همگی می توانند به مهاجم کمک کنند تا به سرعت نمونه ای از چارچوب ZK را تعیین کند.
106 |
107 | \
108 | *شکل 2-4.1.8: نمونه منبع HTML چارچوب ZK*
109 |
110 | اغلب چنین اطلاعاتی در بخش `` پاسخ های HTTP، در تگ `` ها یا در انتهای صفحه قرار می گیرند. با این وجود، کل پاسخ ها باید تجزیه و تحلیل شوند، زیرا می تواند برای اهداف دیگری مانند بازرسی سایر کامنت های مفید و زمینه های پنهان مفید باشد. گاهی اوقات، توسعه دهندگان وب اهمیت زیادی به مخفی کردن اطلاعات مربوط به فریمورک )چارچوب) ها یا اجزای مورد استفاده نمی دهند. هنوز هم ممکن است به چیزی شبیه به این در پایین صفحه برخورد کنید:
111 |
112 | \
113 | *شکل 3-4.1.8: صفحه پایین Banshee*
114 |
115 | ### فایل ها و پوشه های خاص (Specific Files and Folders)
116 |
117 | رویکرد دیگری وجود دارد که به مهاجم یا آزمایش کننده کمک می کند تا برنامه ها یا اجزای سازنده را با دقت بالا شناسایی کند. هر جزء وب ساختار فایل و پوشه خاص خود را در سرور دارد. اشاره شده است که می توان مسیر خاصی را از منبع صفحه HTML مشاهده کرد اما گاهی اوقات آنها به صراحت در آنجا ارائه نمی شوند و همچنان در سرور قرار دارند.
118 |
119 | برای کشف آنها از تکنیکی به نام مرور اجباری (forced browsing) یا "dirbusting" استفاده می شود. Dirbusting عبارت است از وادار کردن یک هدف با نام پوشه ها و فایل های شناخته شده و نظارت بر پاسخ های HTTP برای شمارش محتوای سرور. از این اطلاعات می توان هم برای یافتن فایل های پیش فرض و حمله به آنها و هم برای انگشت نگاری برنامه وب استفاده کرد. Dirbusting را می توان به روش های مختلفی انجام داد، مثال زیر یک حمله موفقیت آمیز dirbusting علیه یک هدف مبتنی بر وردپرس را با کمک لیست تعریف شده و عملکرد مزاحم Burp Suite نشان می دهد.
120 |
121 | \
122 | *شکل 4-4.1.8: Dirbusting با Burp*
123 |
124 | ما می توانیم ببینیم که برای برخی از پوشه های خاص وردپرس (به عنوان مثال، `/wp-includes/` و `/wp-admin/` و `/wp-content/`) پاسخهای HTTP به ترتیب 403 (ممنوع)، 302 (یافت، هدایت به `wp-login.php`) و 200 (OK) هستند. این نشان دهنده خوبی است که هدف از وردپرس پشتیبانی می کند. به همین ترتیب می توان پوشه های پلاگین برنامه های مختلف و نسخه های آنها را پاکسازی کرد. در تصویر زیر می توانید یک فایل CHANGELOG معمولی از یک پلاگین Drupal را مشاهده کنید که اطلاعاتی در مورد برنامه مورد استفاده ارائه می دهد و یک نسخه آسیب پذیر افزونه را فاش می کند.
125 |
126 | \
127 | *شکل 5-4.1.8: افشای Drupal Botcha*
128 |
129 | نکته: قبل از شروع پخش، ابتدا فایل `robots.txt` را بررسی کنید. گاهی اوقات پوشه های خاص برنامه و سایر اطلاعات حساس را می توان در آنجا یافت. نمونه ای از چنین فایل `robots.txt` در تصویر زیر ارائه شده است.
130 |
131 | \
132 | *شکل 6-4.1.8: افشای اطلاعات ربات ها*
133 |
134 | فایل ها و پوشه های خاص برای هر برنامه خاص متفاوت است. اگر برنامه یا مؤلفه شناسایی شده منبع باز باشد، ممکن است راه اندازی یک نصب موقت در طول آزمایش های نفوذ برای درک بهتر زیرساخت ها یا قابلیت هایی که ارائه می شود و چه فایل هایی ممکن است روی سرور باقی بماند، ارزش داشته باشد. با این حال، چندین لیست فایل خوب در حال حاضر وجود دارد. یکی از مثال های خوب، [فهرست واژه های FuzzDB از فایل ها/پوشه های قابل پیش بینی](https://github.com/fuzzdb-project/fuzzdb) است.
135 |
136 | #### پسوندهای فایل (File Extensions)
137 |
138 | ا URL ها ممکن است شامل پسوندهای فایل باشند که می تواند به شناسایی پلتفرم یا فناوری وب نیز کمک کند.
139 |
140 | به عنوان مثال، ویکی OWASP از PHP استفاده می کند:
141 |
142 | ```text
143 | https://wiki.owasp.org/index.php?title=Fingerprint_Web_Application_Framework&action=edit§ion=4
144 | ```
145 |
146 | در اینجا برخی از پسوندهای رایج فایل های وب و فناوری های مرتبط آورده شده است:
147 |
148 | - `.php` -- PHP
149 | - `.aspx` -- Microsoft ASP.NET
150 | - `.jsp` -- صفحات سرور جاوا
151 |
152 | #### پیغام خطا(Error Messages)
153 |
154 | همانطور که در تصویر زیر مشاهده می شود، مسیر فایل سیستم فهرست شده به استفاده از وردپرس (`wp-content`) اشاره دارد. همچنین آزمایش کنندگان باید بدانند که وردپرس مبتنی بر PHP است (`functions.php`).
155 |
156 | \
157 | *شکل 7-4.1.8: خطای تجزیه وردپرس*
158 |
159 | ## شناسه های مشترک (Common Identifiers)
160 |
161 | ### کوکی ها (Cookies)
162 |
163 | | چارچوب | نام کوکی |
164 | |--------------|-----------------------------------|
165 | | Zope | zope3 |
166 | | CakePHP | cakephp |
167 | | Kohana | kohanasession |
168 | | Laravel | laravel_session |
169 | | phpBB | phpbb3_ |
170 | | WordPress | wp-settings |
171 | | 1C-Bitrix | BITRIX_ |
172 | | AMPcms | AMP |
173 | | Django CMS | django |
174 | | DotNetNuke | DotNetNukeAnonymous |
175 | | e107 | e107_tz |
176 | | EPiServer | EPiTrace, EPiServer |
177 | | Graffiti CMS | graffitibot |
178 | | Hotaru CMS | hotaru_mobile |
179 | | ImpressCMS | ICMSession |
180 | | Indico | MAKACSESSION |
181 | | InstantCMS | InstantCMS[logdate] |
182 | | Kentico CMS | CMSPreferredCulture |
183 | | MODx | SN4[12symb] |
184 | | TYPO3 | fe_typo_user |
185 | | Dynamicweb | Dynamicweb |
186 | | LEPTON | lep[some_numeric_value]+sessionid |
187 | | Wix | Domain=.wix.com |
188 | | VIVVO | VivvoSessionId |
189 |
190 | ### کد منبع HTML (HTML Source Code)
191 |
192 | | برنامه | کلمه کلیدی |
193 | |-------------|--------------------------------------------------------------------------------|
194 | | WordPress | `` |
195 | | phpBB | `` |
197 | | Joomla | `` |
198 | | Drupal | `` |
199 | | DotNetNuke | `DNN Platform - [http://www.dnnsoftware.com](http://www.dnnsoftware.com)` |
200 |
201 | #### نشانگرهای عمومی (General Markers)
202 |
203 | - `%framework_name%`
204 | - `powered by`
205 | - `built upon`
206 | - `running`
207 |
208 | #### نشانگرهای خاص (Specific Markers)
209 |
210 | | چارچوب | کلمه کلیدی |
211 | |-------------------|--------------------------------|
212 | | Adobe ColdFusion | `` |
216 | | Indexhibit | `ndxz-studio` |
217 |
218 | ## اصلاح
219 |
220 | در حالی که می توان تلاش هایی برای استفاده از نام های مختلف کوکی ها (از طریق تغییر تنظیمات)، مخفی کردن یا تغییر مسیرهای فایل/دایرکتوری (از طریق بازنویسی یا تغییر کد منبع)، حذف هدرهای شناخته شده و غیره انجام داد. صاحبان/مدیران سیستم باید بدانند که این تلاش ها فقط باعث کاهش ابتدایی ترین دشمنان می شود. زمان/تلاش ممکن است برای آگاهی ذینفعان و فعالیت های تعمیر و نگهداری راه حل بهتر استفاده شود.
221 |
222 | ## ابزارها
223 |
224 | لیستی از ابزارهای عمومی و شناخته شده در زیر ارائه شده است. همچنین بسیاری از ابزارهای کاربردی دیگر و همچنین ابزارهای انگشت نگاری مبتنی بر چارچوب وجود دارد.
225 |
226 | ### WhatWeb
227 |
228 | وب سایت: [https://github.com/urbanadventurer/WhatWeb](https://github.com/urbanadventurer/WhatWeb)
229 |
230 | در حال حاضر یکی از بهترین ابزارهای انگشت نگاری موجود در بازار است. در یک ساخت پیش فرض کالی لینوکس ([Kali Linux](https://www.kali.org/)) گنجانده شده است. زبان: روبی (Ruby) مچ شده برای انگشت نگاری با:
231 |
232 | - رشته های متنی (حساس به حروف کوچک و بزرگ)
233 | - عبارات با قاعده
234 | - پرس و جو های پایگاه داده گوگل هک (مجموعه محدودی از کلمات کلیدی)
235 | - هش های MD5
236 | - تشخیص URL
237 | - الگوهای تگ HTML
238 | - کد ruby سفارشی برای عملیات غیرفعال و تهاجمی
239 | - خروجی نمونه در تصویر زیر ارائه شده است:
240 |
241 | \
242 | *شکل 8-4.1.8: نمونه خروجی Whatweb*
243 |
244 | ### Wappalyzer
245 |
246 | وب سایت: [https://www.wappalyzer.com/](https://www.wappalyzer.com/)
247 |
248 | ا Wappalyzer در مدل های چندگانه موجود است که محبوب ترین آنها احتمالاً افزونه های Firefox/Chrome است. آنها فقط بر روی تطبیق عبارات معمولی کار می کنند و به هیچ چیز دیگری غیر از صفحه برای بارگذاری در مرورگر نیاز ندارند. به طور کامل در سطح مرورگر کار می کند و نتایج را در قالب آیکون می دهد. اگرچه گاهی اوقات دارای نکات مثبت کاذب است، اما این بسیار مفید است که بدانید چه فناوری هایی برای ساختن یک وب سایت هدف بلافاصله پس از مرور یک صفحه استفاده شده است.
249 |
250 | نمونه خروجی یک افزونه در تصویر زیر ارائه شده است.
251 |
252 | \
253 | *شکل 9-4.1.8: خروجی Wappalyzer برای وب سایت OWASP*
254 |
255 | ## منابع
256 |
257 | ### کاغذهای سفید (Whitepapers)
258 |
259 | - [Saumil Shah: "An Introduction to HTTP fingerprinting"](https://web.archive.org/web/20190526182734/https://net-square.com/httprint_paper.html)
260 | - [Anant Shrivastava : "Web Application Finger Printing"](https://anantshri.info/articles/web_app_finger_printing.html)
261 |
--------------------------------------------------------------------------------
/4-Web_Application_Security_Testing/01-Information_Gathering/04-Enumerate_Applications_on_Webserver.md:
--------------------------------------------------------------------------------
1 | # Enumerate Applications on Webserver (fa-IR)
2 |
3 | شمارش برنامه ها در وب سرور (فارسی)
4 |
5 | |شناسه |
6 | |------------|
7 | |WSTG-INFO-04|
8 |
9 | ## خلاصه
10 |
11 | یک مرحله مهم در آزمایش آسیب پذیری های برنامه های وب، این است که بفهمیم کدام برنامه های خاص روی سرور وب میزبانی می شوند. بسیاری از برنامه ها دارای آسیب پذیری ها و استراتژی های حمله شناخته شده هستند که می توانند برای به دست آوردن کنترل از راه دور یا سوء استفاده از داده ها مورد سوء استفاده قرار گیرند. علاوه بر این، بسیاری از برنامه ها اغلب به اشتباه پیکربندی می شوند یا بروزرسانی نمی شوند، زیرا این تصور وجود دارد که آنها فقط "داخلی" استفاده می شوند و بنابراین هیچ تهدیدی وجود ندارد. با گسترش وب سرورهای مجازی، رابطه سنتی نوع 1:1 بین یک آدرس IP و یک وب سرور در حال از دست دادن اهمیت اصلی خود است. غیر معمول نیست که چندین وب سایت یا برنامه داشته باشیم که نام نمادین آنها به آدرس IP یکسان منتقل شود. این سناریو به محیط های میزبانی محدود نمی شود، بلکه برای محیط های معمولی شرکت ها نیز اعمال می شود.
12 |
13 | گاهی اوقات به متخصصان امنیتی مجموعه ای از آدرس های IP به عنوان هدف برای آزمایش داده می شود. می توان بحث کرد که این سناریو بیشتر شبیه یک درگیری از نوع آزمایش نفوذ است، اما در هر صورت انتظار می رود که چنین تخصیصی تمام برنامه های وب قابل دسترسی از طریق این هدف را آزمایش کند. مشکل این است که آدرس IP داده شده میزبان یک سرویس HTTP در پورت 80 است، اما اگر آزمایش کننده باید با مشخص کردن آدرس IP به آن دسترسی پیدا کند (که تنها چیزی است که می دانند) "No web server configured at this address" یا پیامی مشابه را گزارش می کند. اما آن سیستم می تواند تعدادی از برنامه های وب مرتبط با نام های نمادین (DNS) نامرتبط را "پنهان کند". بدیهی است که میزان تجزیه و تحلیل عمیقاً تحت تأثیر این است که آزمایش کننده همه برنامه ها را آزمایش می کند یا فقط برنامه هایی را آزمایش می کند که از آنها آگاه است.
14 |
15 | گاهی اوقات، مشخصات هدف غنی تر است. ممکن است به آزمایش کننده فهرستی از آدرس های IP و نام های نمادین مربوط به آنها داده شود. با این وجود، این لیست ممکن است اطلاعات جزئی را منتقل کند، به عنوان مثال، می تواند برخی از نام های نمادین را حذف کند و مشتری ممکن است حتی از آن آگاه نباشد (این امر در سازمان های بزرگ بیشتر اتفاق می افتد).
16 |
17 | سایر مسائلی که بر دامنه ارزیابی تأثیر می گذارد توسط برنامه های وب منتشر شده در URL های غیر آشکار (به عنوان مثال، `http://www.example.com/some-strange-URL`) نشان داده می شود که در جای دیگری به آنها اشاره نمی شود. این ممکن است به اشتباه (به دلیل پیکربندی نادرست)، یا عمدی (به عنوان مثال، رابط های اداری تبلیغ نشده) اتفاق بیفتد.
18 |
19 | برای رسیدگی به این مسائل، لازم است که برنامه وب را کشف کنید.
20 |
21 | ## اهداف آزمایش
22 |
23 | - برنامه های در محدوده موجود در وب سرور را برشمارید.
24 |
25 | ## چگونه آزمایش کنیم
26 |
27 | کشف برنامه وب فرآیندی است با هدف شناسایی برنامه های وب در یک زیرساخت معین. بعدی معمولاً به عنوان مجموعه ای از آدرس های IP (شاید یک بلوک خالص) مشخص می شود، اما ممکن است شامل مجموعه ای از نام های نمادین DNS یا ترکیبی از این دو باشد. این اطلاعات قبل از اجرای یک ارزیابی (آزمایش)، خواه یک آزمون نفوذ به سبک کلاسیک باشد یا یک ارزیابی متمرکز بر برنامه، ارائه می شود. در هر دو مورد، مگر اینکه قوانین تعامل خلاف این را مشخص کند (به عنوان مثال، فقط برنامه واقع در URL را آزمایش کنید `/http://www.example.com`)، ارزیابی باید تلاش کند تا جامع ترین دامنه باشد، یعنی باید همه برنامه های قابل دسترسی از طریق هدف داده شده را شناسایی کند. مثال های زیر به بررسی چند تکنیک می پردازد که می توان برای دستیابی به این هدف به کار برد.
28 |
29 | > برخی از تکنیک های زیر برای وب سرورهای اینترنتی استفاده می شود، یعنی خدمات جستجوی مبتنی بر وب DNS و IP معکوس و استفاده از موتورهای جستجو. نمونه ها از آدرس های IP خصوصی (مانند `192.168.1.100`) استفاده می کنند (مگر اینکه خلاف آن مشخص شده باشد) که نشان دهنده آدرس های IP عمومی هستند و فقط برای مقاصد ناشناس استفاده می شوند.
30 |
31 | سه عامل وجود دارد که بر تعداد برنامه های مرتبط با یک نام DNS (یا یک آدرس IP) تأثیر می گذارد:
32 |
33 | **1- URL پایه متفاوت (Different Base URL)
**
34 |
35 | نقطه ورود واضح برای یک برنامه وب `www.example.com` است، به عنوان مثال، با این علامت کوتاه، ما به برنامه وب فکر می کنیم که منشا آن `/http://www.example.com` است (همین مورد برای HTTPS نیز صدق می کند). با این حال، حتی اگر این رایج ترین وضعیت است، هیچ چیز برنامه را مجبور به شروع در `/` نمیکند.
36 |
37 | به عنوان مثال، یک نام نمادین ممکن است به سه برنامه وب مرتبط باشد. مانند:
38 |
39 | `http://www.example.com/url1` `http://www.example.com/url2` `http://www.example.com/url3`
40 |
41 | در این حالت، آدرس `/http://www.example.com` با یک صفحه معنادار مرتبط نمی شود و این سه برنامه پنهان می شوند، مگر اینکه آزمایش کننده صریحاً بداند چگونه به آنها دسترسی پیدا کند، یعنی آزمایش کننده url2 ،url1 یا url3 را بشناسد. معمولاً نیازی به انتشار برنامه های تحت وب به این روش نیست، مگر اینکه مالک بخواهد به صورت استاندارد در دسترس باشد و آماده باشد تا کاربران را از موقعیت مکانی دقیق آنها مطلع کند. این بدان معنا نیست که این برنامه ها مخفی هستند، فقط وجود و مکان آنها به صراحت تبلیغ نشده است.
42 |
43 | **2- پورت های غیر استاندارد (Non-standard Ports)**
44 |
45 | در حالی که برنامه های وب معمولاً روی پورت 80 (HTTP) و 443 (HTTPS) هستند، هیچ چیز جادویی در مورد این شماره پورت ها وجود ندارد. در واقع، برنامه های وب ممکن است با پورت های TCP دلخواه مرتبط باشند و می توان با تعیین شماره پورت به صورت زیر به آنها ارجاع داد: `/http[s]://www.example.com:port`. به عنوان مثال، `/http://www.example.com:20000`.
46 |
47 | **3- هاست (میزبان) های مجازی (Virtual Hosts)**
48 |
49 | ا DNS اجازه می دهد تا یک آدرس IP واحد با یک یا چند نام نمادین مرتبط شود. برای مثال، آی پی آدرس `192.168.1.100` ممکن است با DNS نام های `www.example.com`، `helpdesk.example.com`، `webmail.example.com` مرتبط باشد. لزومی ندارد که همه نام ها متعلق به یک دامنه DNS باشند. این رابطه 1 به N ممکن است برای ارائه محتوای مختلف با استفاده از به اصطلاح میزبان های مجازی منعکس شود. اطلاعاتی که میزبان مجازی مورد نظر ما را مشخص می کند در سربرگ میزبان HTTP 1.1 ([Host header](https://tools.ietf.org/html/rfc2616#section-14.23)) تعبیه شده است.
50 |
51 | کسی به وجود برنامه های وب دیگر علاوه بر `www.example.com` واضح مشکوک نیست، مگر اینکه از `helpdesk.example.com` و `webmail.example.com` اطلاع داشته باشد.
52 |
53 | ### رویکردها به آدرس شماره 1 - URL های غیر استاندارد
54 |
55 | هیچ راهی برای اطمینان کامل از وجود برنامه های وب غیر استاندارد وجود ندارد. از آنجایی که استاندارد نیست، هیچ معیار ثابتی بر قرارداد نامگذاری حاکم نیست، با این حال تعدادی تکنیک وجود دارد که آزمایش کننده می تواند برای به دست آوردن بینش بیشتر از آنها استفاده کند.
56 |
57 | اول، اگر وب سرور به درستی پیکربندی نشده باشد و امکان مرور فهرست را فراهم کند، ممکن است بتوان این برنامه ها را شناسایی کرد. اسکنرهای آسیب پذیری ممکن است در این زمینه کمک کنند.
58 |
59 | دوم، این برنامه ها ممکن است توسط صفحات وب دیگر ارجاع داده شوند و این احتمال وجود دارد که توسط موتورهای جستجوی وب فهرست بندی و فهرست بندی شده باشند. اگر آزمایش کنندگان به وجود چنین برنامه های مخفی در `www.example.com` مشکوک شوند، می توانند با استفاده از اپراتور سایت جستجو کنند و نتیجه یک پرس و جو را برای `site: www.example.com` بررسی کنند. در میان URL های بازگردانده شده ممکن است یکی وجود داشته باشد که به چنین برنامه غیر آشکاری اشاره می کند.
60 |
61 | گزینه دیگر این است که URL هایی را که احتمالاً کاندیدای برنامه های منتشر نشده باشند بررسی کنید. به عنوان مثال، ممکن است یک صفحه ایمیل وب از آدرس های اینترنتی مانند `/https://www.example.com/webmail`، `https://webmail.example.com` و یا `/https://mail.example.com` قابل دسترسی باشد. همین امر در مورد رابط های اداری نیز صدق می کند، که ممکن است در URL های مخفی (مثلاً یک رابط اداری Tomcat) منتشر شوند و در عین حال به جایی ارجاع داده نشده باشند. بنابراین انجام کمی جستجو به سبک فرهنگ لغت (یا "حدس زدن هوشمند") می تواند نتایجی را به همراه داشته باشد. اسکنرهای آسیب پذیری ممکن است در این زمینه کمک کنند.
62 |
63 | ## رویکردها به آدرس شماره 2 - پورت های غیر استاندارد
64 |
65 | بررسی وجود برنامه های وب در پورت های غیر استاندارد آسان است. یک اسکنر پورت مانند nmap می تواند با استفاده از `sV-` گزینه شناسایی سرویس را انجام دهد و سرویس های http[s] را در پورت های دلخواه شناسایی کند. آنچه مورد نیاز است اسکن کامل فضای آدرس پورت 64k TCP است.
66 |
67 | برای مثال، دستور زیر با اسکن اتصال TCP، تمام پورت های آی پی `192.168.1.100` را باز می کند و سعی می کند مشخص کند که چه سرویس هایی به آن ها متصل هستند (فقط سوئیچ های ضروری نشان داده می شوند – nmap دارای مجموعه گسترده ای از گزینه ها است که بحث در مورد آنها خارج از محدوده است):
68 |
69 | `nmap –Pn –sT –sV –p0-65535 192.168.1.100`
70 |
71 | کافی است خروجی را بررسی کنید و به دنبال HTTP یا نشانه سرویس های پوشیده شده با TLS باشید (که باید برای تایید اینکه HTTPS هستند) بررسی شود. به عنوان مثال، خروجی دستور قبلی می تواند به صورت زیر باشد:
72 |
73 | ```text
74 | Interesting ports on 192.168.1.100:
75 | (The 65527 ports scanned but not shown below are in state: closed)
76 | PORT STATE SERVICE VERSION
77 | 22/tcp open ssh OpenSSH 3.5p1 (protocol 1.99)
78 | 80/tcp open http Apache httpd 2.0.40 ((Red Hat Linux))
79 | 443/tcp open ssl OpenSSL
80 | 901/tcp open http Samba SWAT administration server
81 | 1241/tcp open ssl Nessus security scanner
82 | 3690/tcp open unknown
83 | 8000/tcp open http-alt?
84 | 8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
85 | ```
86 |
87 | از این مثال می توان دید که:
88 |
89 | - یک سرور HTTP آپاچی روی پورت 80 اجرا می شود.
90 | - به نظر می رسد یک سرور HTTPS در پورت 443 وجود دارد (اما این باید تأیید شود، مثلاً با مراجعه `https://192.168.1.100` به مرورگر).
91 | - در پورت 901 یک رابط وب Samba SWAT وجود دارد.
92 | - سرویس در پورت 1241 HTTPS نیست، بلکه Nessus daemon با TLS پوشیده شده است.
93 | - پورت 3690 دارای یک سرویس نامشخص است (nmap انگشت نگاری خود را - در اینجا برای وضوح حذف شده است - همراه با دستورالعمل هایی برای ارسال آن برای ادغام در پایگاه داده انگشت نگاری nmap، پس می دهد، مشروط بر اینکه بدانید کدام سرویس را نشان می دهد).
94 | - سرویس نامشخص دیگری در پورت 8000. این احتمالاً HTTP است، زیرا یافتن سرورهای HTTP در این پورت غیر معمول نیست. بیایید این موضوع را بررسی کنیم:
95 |
96 | ```text
97 | $ telnet 192.168.10.100 8000
98 | Trying 192.168.1.100...
99 | Connected to 192.168.1.100.
100 | Escape character is '^]'.
101 | GET / HTTP/1.0
102 |
103 | HTTP/1.0 200 OK
104 | pragma: no-cache
105 | Content-Type: text/html
106 | Server: MX4J-HTTPD/1.0
107 | expires: now
108 | Cache-Control: no-cache
109 |
110 |
111 | ...
112 | ```
113 |
114 | این تایید می کند که در واقع یک سرور HTTP است. از طرف دیگر، آزمایش کنندگان می توانستند URL را با یک مرورگر وب بازدید کنند. یا از دستورات GET یا HEAD Perl استفاده کرد که تعاملات HTTP مانند آنچه در بالا داده شد را تقلید می کند (هر چند درخواست های HEAD ممکن است توسط همه سرورها رعایت نشود).
115 |
116 | - آپاچی تامکت (Apache Tomcat) در پورت 8080 اجرا می شود.
117 |
118 | همین کار ممکن است توسط اسکنرهای آسیب پذیری انجام شود، اما ابتدا بررسی کنید که اسکنر انتخابی قادر به شناسایی سرویس های HTTP[S] است که روی پورت های غیر استاندارد اجرا می شوند. به عنوان مثال، Nessus قادر است آنها را بر روی پورت های دلخواه شناسایی کند (به شرطی که دستور اسکن تمام پورت ها داده شود)، و با توجه به nmap، تعدادی آزمایش بر روی آسیب پذیری های وب سرور شناخته شده و همچنین پیکربندی TLS/SSL ارائه خواهد کرد. خدمات HTTPS همانطور که قبلا اشاره شد، Nessus همچنین می تواند برنامه های محبوب یا رابط های وب را که در غیر این صورت ممکن است مورد توجه قرار نگیرند (به عنوان مثال، یک رابط اداری Tomcat) شناسایی کند.
119 |
120 | ### رویکردها به آدرس شماره 3 - میزبان های مجازی
121 |
122 | تعدادی تکنیک وجود دارد که ممکن است برای شناسایی نام های DNS مرتبط با یک آدرس IP معین استفاده شود `x.y.z.t`.
123 |
124 | #### انتقالات منطقه DNS (DNS Zone Transfers)
125 |
126 | این تکنیک امروزه استفاده محدودی دارد، با توجه به این واقعیت که انتقال منطقه تا حد زیادی توسط سرورهای DNS رعایت نمی شود. با این حال، ممکن است ارزش امتحان کردن را داشته باشد. اول از همه، آزمایش کننده ها باید سرورهای نام (name servers) سرویس دهنده `x.y.z.t` را تعیین کنند. اگر یک نام نمادین برای آن `x.y.z.t` شناخته شود (بگذارید باشد `www.example.com`)، سرورهای نام (name servers) آن را می توان با ابزارهایی مانند `nslookup`، `host` یا `dig` با درخواست رکوردهای DNS NS تعیین کرد.
127 |
128 | اگر هیچ نام نمادینی برای آن `x.y.z.t` شناخته نشده باشد، اما تعریف هدف شامل حداقل یک نام نمادین باشد، آزمایش کنندگان ممکن است سعی کنند همان فرآیند را اعمال کنند و سرور نام (name server) آن نام را پرس و جو کنند (به این امید که `x.y.z.t` توسط آن سرور نام نیز ارائه شود). به عنوان مثال، اگر هدف شامل آدرس آی پی `x.y.z.t` و نام `mail.example.com` باشد، سرورهای نام دامنه `example.com` را تعیین کنید.
129 |
130 | مثال زیر نحوه شناسایی سرورهای نام `www.owasp.org` را با استفاده از دستور `host` نشان می دهد:
131 |
132 | ```text
133 | $ host -t ns www.owasp.org
134 | www.owasp.org is an alias for owasp.org.
135 | owasp.org name server ns1.secure.net.
136 | owasp.org name server ns2.secure.net.
137 | ```
138 |
139 | اکنون ممکن است یک انتقال منطقه به سرورهای نام دامنه `example.com` درخواست شود. اگر آزمایش کننده خوش شانس باشد، لیستی از ورودی های DNS برای این دامنه را دریافت می کند. این شامل موارد بدیهی `www.example.com` و نه چندان آشکار `helpdesk.example.com` و `webmail.example.com` (و احتمالاً دیگران) خواهد بود. همه نام هایی را که با انتقال منطقه بازگردانده شده اند بررسی کنید و همه نام هایی را که مربوط به هدف مورد ارزیابی هستند در نظر بگیرید.
140 |
141 | تلاش برای درخواست انتقال منطقه `owasp.org` از یکی از سرورهای نام آن:
142 |
143 | ```text
144 | $ host -l www.owasp.org ns1.secure.net
145 | Using domain server:
146 | Name: ns1.secure.net
147 | Address: 192.220.124.10#53
148 | Aliases:
149 |
150 | Host www.owasp.org not found: 5(REFUSED)
151 | ; Transfer failed.
152 | ```
153 |
154 | #### پرس و جوهای معکوس DNS (DNS Inverse Queries)
155 |
156 | این فرآیند مشابه فرآیند قبلی است، اما به رکوردهای DNS معکوس (PTR) متکی است. به جای درخواست انتقال منطقه، نوع رکورد را روی PTR تنظیم کنید و یک پرس و جو در آدرس IP داده شده صادر کنید. اگر آزمایش کننده ها خوش شانس باشند، ممکن است یک ورودی نام DNS را دریافت کنند. این تکنیک به وجود نقشه های نام نمادین IP (IP-to-symbolic name maps) متکی است که تضمینی نیست.
157 |
158 | #### جستجوهای DNS مبتنی بر وب (Web-based DNS Searches)
159 |
160 | این نوع جستجو شبیه به انتقال منطقه DNS است، اما متکی به خدمات مبتنی بر وب است که جستجوهای مبتنی بر نام را در DNS امکان پذیر می کند. یکی از این خدمات، سرویس [Netcraft Search DNS](https://searchdns.netcraft.com/?host) است. آزمایش کننده ممکن است فهرستی از نام های متعلق به دامنه انتخابی شما را جستجو کند، مانند `example.com`. سپس آنها بررسی خواهند کرد که آیا نام هایی که به دست آورده اند با هدف مورد بررسی مرتبط است یا خیر.
161 |
162 | #### خدمات IP معکوس (Reverse-IP Services)
163 |
164 | سرویس های IP معکوس مشابه پرس وجوهای معکوس DNS هستند، با این تفاوت که آزمایش کننده ها به جای سرور نام، یک برنامه مبتنی بر وب را درخواست می کنند. تعدادی از این خدمات در دسترس است. از آنجایی که آنها تمایل به بازگرداندن نتایج جزئی (و اغلب متفاوت) دارند، بهتر است از چندین سرویس برای به دست آوردن تجزیه و تحلیل جامع تر استفاده کنید.
165 |
166 | - [MxToolbox Reverse IP](https://mxtoolbox.com/ReverseLookup.aspx)
167 | - [DNSstuff](https://www.dnsstuff.com/) (خدمات متعدد در دسترس است)
168 | - [Net Square](https://web.archive.org/web/20190515092354/http://www.net-square.com/mspawn.html) (درخواست های متعدد در دامنه ها و آدرس های IP، نیاز به نصب دارد)
169 |
170 | #### گوگل کردن (Googling)
171 |
172 | به دنبال جمع آوری اطلاعات از تکنیک های قبلی، آزمایش کنندگان می توانند به موتورهای جستجو برای اصلاح و افزایش تحلیل خود اعتماد کنند. این ممکن است شواهدی از نام های نمادین اضافی متعلق به هدف، یا برنامه های قابل دسترسی از طریق URL های غیر آشکار به دست دهد.
173 |
174 | برای مثال، با در نظر گرفتن مثال قبلی در مورد `www.owasp.org`، آزمایش کننده می تواند از گوگل و سایر موتورهای جستجو به دنبال اطلاعات (از این رو، نام های DNS) مربوط به دامنه های جدید کشف شده `webgoat.org`، `webscarab.com` و `webscarab.net` پرس و جو کند.
175 |
176 | تکنیک های گوگل در [تست: عنکبوت ها، ربات ها و خزنده ها](01-Conduct_Search_Engine_Discovery_Reconnaissance_for_Information_Leakage.md) توضیح داده شده است.
177 |
178 | #### گواهی های دیجیتال (Digital Certificates)
179 |
180 | اگر سرور اتصالات را از طریق HTTPS بپذیرد، نام مشترک (CN) و نام جایگزین موضوع (SAN) در گواهی ممکن است شامل یک یا چند نام میزبان (hostname) باشد. با این حال، اگر وب سرور گواهی قابل اعتمادی نداشته باشد، یا علامت های عام در حال استفاده باشد، ممکن است هیچ اطلاعات معتبری برنگردد.
181 |
182 | ا CN و SAN را می توان با بازرسی دستی گواهی یا از طریق ابزارهای دیگر مانند OpenSSL به دست آورد:
183 |
184 | ```text
185 | openssl s_client -connect 93.184.216.34:443 /dev/null | openssl x509 -noout -text | grep -E 'DNS:|Subject:'
186 |
187 | Subject: C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, CN = www.example.org
188 | DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net
189 | ```
190 |
191 | ## ابزارها
192 |
193 | - DNS lookup tools such as `nslookup`, `dig` and similar.
194 | - Search engines (Google, Bing, and other major search engines).
195 | - Specialized DNS-related web-based search service: see text.
196 | - [Nmap](https://nmap.org/)
197 | - [Nessus Vulnerability Scanner](https://www.tenable.com/products/nessus)
198 | - [Nikto](https://www.cirt.net/nikto2)
199 |
--------------------------------------------------------------------------------