# وب اپلیکیشن آسیب پذیر لعنتی

وب اپلیکیشن آسیب پذیر لعنتی (DVWA)، یک وب اپلیکیشن مبتنی بر پی‌اچ‌پی/مای‌اسکیوال است که به شدت آسیب‌پذیر طراحی شده است. هدف اصلی این وب اپلیکیشن برای متخصصان امنیت می باشد که در یک محیط امن ابزار ها و توانایی خودشان را محک بزنند، به توسعه‌دهندگان کمک می کند تا نحوه ایمن سازی یک وب اپلیکیشن را متوجه شوند همچنین به دانش آموزان و معلمان کمک می کند تا در یک محیط تحت نظارت در مورد امنیت وب اپلیکیشن مطالعه کنند.  

هدف DVWA، **تمرین بخشی از متداول‌ترین آسیب‌پذیری‌های وب**، در **سطوح متفاوتی از دشواری**، با بهرا‌گیری از یک رابط کاربری آسان است. 
لطفاً در نظر داشته باشد که در این نرم‌افزار آسیب‌پذیری‌های **مستند شده و مستند نشده** وجود دارد.
این عمدی است. شما را تشویق می‌کنیم که تا حد امکان سعی کنید مشکلات بیشتری را کشف کنید.

- - -

## هشدار!

وب اپلیکیشن آسیب پذیر لعنتی، به‌ شکل خطرناکی آسیب‌پذیر است! **آن را در پوشه‌های اچ‌تی‌ام‌ال عمومی سرویس دهندهٔ میزبانی خود یا هر سروری که در اینترنت قرار دارد بارگذاری نکنید**، چراکه مورد نفوذ قرار خواهند گرفت. برای این کار استفاده از یک ماشین مجازی پیشنهاد می‌شود (مثل [ورچوال باکس](https://www.virtualbox.org/) یا [وی‌ام‌ویر](https://www.vmware.com/)) که در حالت شبکه‌ای NAT پیکربندی شده باشد. در داخل ماشین مجازی می‌توانید [زمپ](https://www.apachefriends.org/) را برای سرور وب و پایگاه دادهٔ خود دانلود کنید.
 
### تکذیب‌نامه

ما در مورد اینکه از این اپلیکیشن (DVWA) چگونه استفاده می‌شود هیچ مسؤولیتی نمی‌پذیریم. ما هدف این برنامه را به صراحت بیان کرده‌ایم و از آن نباید برای مقاصد بدخواهانه استفاده شود. ما هشدارها و اقدامات خود را در جهت جلوگیری از نصب DVWA بر روی سرویس‌دهندگان وب برخط انجام داده‌ایم. اگر به سرور وب شما از طریق یک نسخه از DVWA نفوذ شد، تقصیری متوجه ما نیست. مسؤولیت آن بر عهدهٔ کسی است که آن را بارگذاری و نصب کرده است.

- - -

## مجوز

این فایل بخشی از وب اپلیکیشن آسیب پذیر لعنتی (DVWA) است.

وب اپلیکیشن آسیب پذیر لعنتی (DVWA) یک نرم‌افزار آزاد است. شما می‌توانید آن را تحت مجوز نسخه سوم‌ یا به‌اختیر خودتان نسخه‌های جدید‌تری از مجوز عمومی گنو (GNU) که توسط بنیاد نرم‌افزار آزاد منشر شده است، توزیع کنید و/یا تغییر دهید.

وب اپلیکیشن آسیب پذیر لعنتی (DVWA) به امید اینکه سودمند واقع شود توزیع شده است، لیکن بدون هیچگونه تضمینی، حتی به صورت ضمنی که برای مقاصد خاصی مناسب باشد ارائه می‌شود. مجوز عمومی گنو را برای اطلاعات بیشتر ببینید.  

شما می‌بایست یک رونوشت از مجوز عمومی گنو را همرا با وب اپلیکیشن آسیب پذیر لعنتی (DVWA) دریافت کرده‌باشید. اگر این اتفاق نیفتاده است، <https://www.gnu.org/licenses/> را ببینید.

- - -

## بین‌المللی سازی

این فایل به زبان‌های مختلف دیگری موجود است:

- انگلیسی: [English](README.md) (نسخهٔ مرجع)
- عربی: [العربية](README.ar.md)
- چینی: [简体中文](README.zh.md)
- فرانسوی: [Français](README.fr.md)
- کره ای: [한국어](README.ko.md)
- لهستانی: [Polski](README.pl.md)
- پرتغالی: [Português](README.pt.md)
- اسپانیایی: [Español](README.es.md)
- ترکی: [Türkçe](README.tr.md)
- اندونزی: [Indonesia](README.id.md)
- ویتنامی: [Vietnamese](README.vi.md)
- ایتالیایی: [Italiano](README.it.md)
  
اگر مایل به ارائه ترجمه هستید، لطفاً یک PR ارسال کنید. البته توجه داشته باشید که این به این معنی نیست که فقط آن را از طریق Google Translate اجرا کنید و ارسال کنید، در غیر این صورت رد خواهد شد. نسخه ترجمه شده خود را با اضافه کردن یک فایل جدید 'README.xx.md' ارسال کنید که در آن xx کد دو حرفی زبان مورد نظر شما است (بر اساس [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)).
  
- - -

## دانلود

در حالیکه ممکن است نسخه‌های متفاوتی از DVWA در اطراف پراکنده شده باشند، تنها نسخه پشتیبانی شده،آخرین نسخه از مخزن رسمی گیت‌هاب است. شما یا می‌توانید آن را از طریق کلون کردن مخزن:

```

git clone https://github.com/digininja/DVWA.git

```

یا [دانلود نسخهٔ زیپ‌شدهٔ فایلها](https://github.com/digininja/DVWA/archive/master.zip).
- - -
## نصب

### نصب خودکار 🛠️

**توجه داشته باشید، این یک اسکریپت رسمی DVWA نیست، بلکه توسط [IamCarron](https://github.com/iamCarron/) نوشته شده است. کار زیادی برای ایجاد این اسکریپت انجام شده است و وقتی ایجاد شد، هیچ کار مخربی انجام نداد، با این حال توصیه می‌شود محظ احتیاط قبل از اجرای کورکورانه اسکریپت روی سیستم خود، آن را بررسی کنید. لطفاً هرگونه اشکالی را به [IamCarron](https://github.com/iamCarron/) گزارش دهید، نه اینجا.**

یک اسکریپت پیکربندی خودکار برای DVWA در دستگاه‌های مبتنی بر دبیان، از جمله کالی، اوبونتو، کوبونتو، لینوکس مینت، زورین او اس...

**توجه: این اسکریپت به دسترسی روت نیاز دارد و برای سیستم‌های مبتنی بر دبیان طراحی شده است. مطمئن شوید که آن را با کاربر روت اجرا می‌کنید.**

#### الزامات نصب

#### یک خطی
این دستور، اسکریپت نصب نوشته شده توسط [@IamCarron](https://github.com/IamCarron) را دانلود و به طور خودکار اجرا می‌کند. اگر ما به نویسنده و اسکریپت، همانطور که در زمان بررسی آن بود، اعتماد نداشتیم، این مورد در اینجا لحاظ نمی‌شد، اما همیشه احتمال سوءاستفاده‌ی کسی وجود دارد، بنابراین اگر از اجرای کد شخص دیگری بدون بررسی آن توسط خودتان احساس امنیت نمی‌کنید، مراحل دستی را دنبال کنید و می‌توانید پس از دانلود، آن را بررسی کنید.

```sh
sudo bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh)"
```

##### اجرای دستی اسکریپت

۱. **اسکریپت را دانلود کنید:**

```sh
wget https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh
```

۲. **اسکریپت را قابل اجرا کنید**

```sh
chmod +x Install-DVWA.sh
```

۳. **اسکریپت را با دسترسی root اجرا کنید:**

```sh
sudo ./Install-DVWA.sh
```

  ### ویدئو‌های نصب
- [نصب بر کالی‌لینوکس در ورچوال‌باکس](https://www.youtube.com/watch?v=WkyDxNJkgQ4)
- [نصب در وینوز با استفاده از زمپ](https://youtu.be/Yzksa_WjnY0)
- [نصب بر روی ویندوز ۱۰](https://www.youtube.com/watch?v=cak2lQvBRAo)

### ویندوز+زمپ

اگر تا به حال تنظیمات وب سرور را انجام نداده‌اید، ساده‌ترین راه برای نصب DVWA دانلود و نصب [XAMPP](https://www.apachefriends.org/) است.

برنامه XAMPP یک توزیع آپاچی با نصب بسیار آسان برای لینوکس، سولاریس، ویندوز و مک او اس ایکس است. این برنامه شامل وب سرور آپاچی، MySQL، PHP، Perl، یک سرور FTP و phpMyAdmin است.
  
این [ویدیو](https://youtu.be/Yzksa_WjnY0) مراحل نصب ویندوز را به شما نشان می‌دهد، در سایر سیستم عامل‌ها نصب آن زیاد تفاوت ندارد. 

### داکر

به لطف [hoang-himself](https://github.com/hoang-himself) و [JGillam](https://github.com/JGillam)، هر کامیت به شاخه `master` باعث می‌شود یک Image داکر ساخته شود و آماده دریافت از ساخت کانتینر گیت‌هاب باشد.

برای اطلاعات بیشتر در مورد آنچه دریافت می‌کنید، می‌توانید [Image از پیش ساخته شده داکر] (https://github.com/digininja/DVWA/pkgs/container/dvwa) را مرور کنید.

#### شروع کار

پیش‌نیازها: داکر و داکر کامپوز.

- اگر از Docker Desktop استفاده می‌کنید، هر دوی این موارد باید از قبل نصب شده باشند.
- - اگر Docker Engine را روی لینوکس ترجیح می‌دهید، حتماً [راهنمای نصب] آنها (https://docs.docker.com/engine/install/#server) را دنبال کنید.

**همانطور که در بالا مشاهده می کنید، ما از آخرین نسخه Docker پشتیبانی می‌کنیم.**
اگر روی لینوکس از نسخه‌ی Docker که از طریق package manager نصب شده استفاده کنید، احتمالاً کار می‌کند؛ اما اگر مشکلی پیش بیاد، پشتیبانی رسمی و تضمینی نداره و فقط در حد «تلاش می‌کنیم کمک کنیم» خواهد بود.

ارتقاء داکر از نسخه مدیریت بسته به نسخه آپ‌استریم مستلزم آن است که نسخه‌های قدیمی را همانطور که در دفترچه‌های راهنمای آنها برای [اوبونتو](https://docs.docker.com/engine/install/ubuntu/#uninstall-old-versions)، [فدورا](https://docs.docker.com/engine/install/fedora/#uninstall-old-versions) و سایر موارد مشاهده شده است، حذف نصب کنید. داده‌های داکر شما (کانتینرها، تصاویر، ولوم‌ها و غیره) نباید تحت تأثیر قرار گیرند، اما در صورت بروز مشکل، حتماً [به داکر](https://www.docker.com/support) اطلاع دهید و در عین حال از موتورهای جستجو استفاده کنید.

سپس، برای شروع:

۱. برای بررسی نصب صحیح داکر و داکر کامپوز، دستورهای `docker version` و `docker compose version` را اجرا کنید. باید بتوانید نسخه‌های آنها را در خروجی مشاهده کنید.

  برای مثال:
```text
>>> docker version
Client:
[...]
    Version: 23.0.5
[...]
Server: Docker Desktop 4.19.0 (106363)
    Engine:
[...]
        Version:          23.0.5
>>> docker compose version
Docker Compose version v2.17.3
```

اگر نتیجه ای نمی‌بینید یا خطای command not found دریافت می‌کنید، پیش‌نیازهای راه‌اندازی Docker و Docker Compose را دنبال کنید.

۲. این مخزن را کلون یا دانلود کرده و از حالت فشرده خارج کنید (به [دانلود](#دانلود) مراجعه کنید).
۳. یک ترمینال باز کنید و دایرکتوری آن را به این پوشه (`DVWA`) تغییر دهید.
۴. دستور `docker compose up -d` را اجرا کنید.

حالا DVWA در آدرس `http://localhost:4280` در دسترس است.

توجه داشته باشید که DVWA موجود در کانتینر،  به جای پورت پیش‌فرض ۸۰، بر روی پورت ۴۲۸۰ حالت Listening می‌باشد.

برای اطلاعات بیشتر در مورد این تصمیم، به [من می‌خواهم DVWA را روی یک پورت متفاوت اجرا کنم](#i-want-to-run-dvwa-on-a-different-port) مراجعه کنید.

#### ساخت در Local

اگر تغییرات Local ایجاد کرده‌اید و می‌خواهید پروژه را از Local بسازید، به `compose.yml` بروید و `pull_policy: always` را به `pull_policy: build` تغییر دهید.

اجرای دستور `docker compose up -d` باید باعث شود که داکر صرف نظر از آنچه در رجیستری موجود است، یک تصویر از سیستم محلی بسازد.

همچنین این را هم مطالعه کنید: [`pull_policy`](https://github.com/compose-spec/compose-spec/blob/master/05-services.md#pull_policy).

#### پردازش فایل های Local

اگر تغییرات محلی ایجاد می‌کنید و نمی‌خواهید پروژه را برای هر تغییر Build کنید:

۱. به فایل `compose.yml` بروید و این خط را از حالت کامنت خارج کنید:
```yaml
# volumes:
#   - ./:/var/www/html
```
۲. برای کپی کردن فایل پیکربندی پیش‌فرض، دستور `cp config/config.inc.php.dist config/config.inc.php` را اجرا کنید.
۳. دستور `docker compose up -d` را اجرا کنید تا تغییرات در فایل‌های محلی روی کانتینر اعمال شود.

### نسخه PHP

در حالت ایده‌آل، شما باید از آخرین نسخه پایدار PHP استفاده کنید، زیرا این نسخه‌ای است که این برنامه روی آن توسعه داده و آزمایش خواهد شد.

به کسانی که سعی در استفاده از PHP 5.x دارند، پشتیبانی ارائه نخواهد شد.


نسخه‌های پایین‌تر از ۷.۳ مشکلات شناخته‌شده‌ای دارند که باعث ایجاد عدم عملکرد صحیح می‌شود، بیشتر برنامه کار خواهد کرد، اما ممکن است مواردی به صورت تصادفی درست عمل نکنند. مگر اینکه دلیل بسیار خوبی برای استفاده از چنین نسخه قدیمی داشته باشید، پشتیبانی ارائه نخواهد شد.

### دسترسی های لینوکس

اگر از توزیع لینوکس مبتنی بر دبیان استفاده می‌کنید، باید بسته‌های زیر _(یا معادل آنها)_ را نصب کنید:

- apache2
- libapache2-mod-php
- mariadb-server
- mariadb-client
- php php-mysqli
- php-gd

توصیه می‌کنم قبل از این کار، یک به‌روزرسانی انجام دهید، فقط برای اینکه مطمئن شوید آخرین نسخه همه چیز را دریافت می‌کنید.

```sh
apt update
apt install -y apache2 mariadb-server mariadb-client php php-mysqli php-gd libapache2-mod-php
```

این سایت به جای MariaDB با MySQL کار خواهد کرد، اما ما اکیداً MariaDB را توصیه می‌کنیم زیرا به صورت پیش‌فرض کار می‌کند، در حالی که برای عملکرد صحیح MySQL باید تغییراتی ایجاد کنید.

### ماژول‌های آپاچی

اگر می‌خواهید از API lab استفاده کنید، باید ماژول آپاچی `mod_rewrite` را فعال کنید. برای انجام این کار در لینوکس، دستور زیر را اجرا کنید:

```sh
a2enmod rewrite
```

سپس Apache را راه اندازی مجدد کنید:

```sh
apachectl restart
```

### فایل های Vendor

اگر می‌خواهید از ماژول API استفاده کنید، باید مجموعه‌ای از فایل‌های Vendor را با استفاده از [Composer](https://getcomposer.org/) نصب کنید.

اول، مطمئن شوید که Composer را نصب کرده‌اید. به نظر می‌رسد نسخ قدیمی دارای مشکلاتی باشد، بنابراین من همیشه آخرین نسخه را از اینجا دریافت می‌کنم:

https://getcomposer.org/doc/00-intro.md

برای نصب، دستورالعمل‌هایی که سایت ارائه می‌دهد را دنبال کنید.

حالا به پوشه `vulnerabilities/api` بروید و دستور زیر را اجرا کنید:

```sh
composer.phar install
```

اگر Composer را در مسیر سیستم نصب نکرده‌اید، مطمئن شوید که امکان ارجاع به آن وجود دارد.


## پیکربندی‌ها
### فایل کانفیگ

برنامهٔ DVWA همرا با یک فایل کانفیگ دم‌دستی توزیع می‌شود که لازم است شما آن را در جای مناسب کپی کنید و تغییرات لازم را بر روی آن اعمال کنید. در لینوکس با فرض بر اینکه در پوشهٔ DVWAقرار دارید، به این طریق می‌توانید فایل را کپی کنید:

`cp config/config.inc.php.dist config/config.inc.php`  

در ویندوز، اگر پسوند فایل‌ها مخفی باشد، کار اندکی دشوارتر می‌شود. اگر در این مورد مطمئن نیستید، برای توضیحات بیشتر این پست وبلاگ را ببینید:

[چگونه در ویندوز پسوند ها را نمایش دهیم](https://www.howtogeek.com/205086/beginner-how-to-make-windows-show-file-extensions/)

### پیکربندی با متغیرهای محیطی

به جای تغییر فایل پیکربندی، می‌توانید اکثر تنظیمات را با استفاده از متغیرهای محیطی نیز تنظیم کنید. در یک پیاده‌سازی Docker یا Kubernetes، این به شما امکان می‌دهد پیکربندی را بدون ایجاد یک تصویر Docker جدید تغییر دهید. متغیرها را در فایل [config/config.inc.php.dist](config/config.inc.php.dist) خواهید یافت.

اگر می‌خواهید سطح امنیتی پیش‌فرض را روی «پایین» تنظیم کنید، کافیست خط زیر را به فایل [compose.yml](./compose.yml) اضافه کنید:

```yml
environment:
  - DB_SERVER=db
  - DEFAULT_SECURITY_LEVEL=low
```

### نصب دیتابیس

برای راه‌اندازی پایگاه داده، کافیست روی دکمه‌ی «Setup DVWA» در منوی اصلی کلیک کنید، سپس روی دکمه‌ی «Create / Reset Database» کلیک کنید. این کار پایگاه داده را برای شما با مقداری داده ایجاد/بازنشانی می‌کند.

اگر هنگام ایجاد پایگاه داده خود با خطایی مواجه شدید، مطمئن شوید که اعتبارنامه‌های ( نام کاربری و رمز عبور ) پایگاه داده شما در
`./config/config.inc.php` 
صحیح هستند.
**نکته:** _فایل  `config.inc.php.dist`  یک فایل نمونه است، و با `config.inc.php` متفاوت است._

متغیرها به طور پیش‌فرض به صورت زیر تنظیم شده‌اند:

```php
$_DVWA[ 'db_server'] = '127.0.0.1';
$_DVWA[ 'db_port'] = '3306';
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = 'p@ssw0rd';
$_DVWA[ 'db_database' ] = 'dvwa';
```

نکته، اگه شما از MariaDB به جای MySQL (به صورت پیش‌فرضMariaDB در Kali وجود دارد)، نمیتونید از کاربر root استفاده کنید و باید یک کاربر در دیتابیس بسازید برای انجام این کار به دیتابیس خودتون متصل بشید و دستورات زیر را اجرا کنید:

```mariadb
MariaDB [(none)]> create database dvwa;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create user dvwa@localhost identified by 'p@ssw0rd';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> grant all on dvwa.* to dvwa@localhost;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
```

### غیرفعال سازی احراز هویت

بعضی از ابزارها با بخش ورود به خوبی کار نمی‌کنند و با DVWA نمی‌توانند استفاده شوند. برای رفع این مشکل، گزینه‌ای در کانفیگ وجود دارد که بتوانید کنترل ورود را غیر فعال کنید. برای این کار کافیست تنظیم زیر را در فایل کانفیگ انجام دهید:

```php
$_DVWA[ 'disable_authentication' ] = true;
```

همچنین لازم است سطح امنیت را به مقداری که برای آزمونتان مد نظر دارید تغییر دهید:

```php
$_DVWA[ 'default_security_level' ] = 'low';
```

در این حالت شما می‌توانید از تمامی امکانات بدون نیاز به ورود و تنظیم کوکی‌ها بهره ببید.
 
### سطح دسترسی به پوشه‌ها

* `./hackable/uploads/`
باید توسط وب سرویس قابل نوشتن باشد (برای آپلود فایل).

* `./external/phpids/0.6/lib/IDS/tmp/phpids_log.txt`
باید توسط وب سرویس قابل نوشتن باشد (اگر قصد استفاده از PHPIDS را دارید ).

### تنظیمات PHP

تنظیمات PHP در سیستم‌های لینوکس، احتمالاً در
`/etc/php/x.x/fpm/php.ini`
یا 
`/etc/php/x.x/apache2/php.ini`
یافت می‌شود.

* جهت بهره‌برداری به آسیب‌پذیری Remote File Inclusions (RFI)    
     * تنظیم `allow_url_include = on` مستندات: [[allow_url_include](https://secure.php.net/manual/en/filesystem.configuration.php#ini.allow-url-include)]
     * تنظیم `allow_url_fopen = on` مستندات: [[allow_url_fopen](https://secure.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen)]

* برای  خاموش‌کردن هشدار‌های پی‌اچ‌پی که کمتر شلوغ باشد (در صورت نیاز)
     * تنظیم `display_errors = off` مستندات:  [[display_errors](https://secure.php.net/manual/en/errorfunc.configuration.php#ini.display-errors)]

  حتما پس از ایجاد تغییرات سرویس PHP یا Apache را راه اندازی مجدد کنید.

### تنظیمات reCAPTCHA

این فقط برای آزمایشگاه "CAPTCHA ناامن" مورد نیاز است، اگر نمیخواهید این آزمایشگاه را ارزیابی کنید، می توانید این بخش را نادیده بگیرید.

یک جفت کلید API از <https://www.google.com/recaptcha/admin/create> دریافت کنید.

سپس به فایل
`./config/config.inc.php`
بروید و این مقادیر را به آن اضافه کنید:

- `$_DVWA[ 'recaptcha_public_key' ]`
- `$_DVWA[ 'recaptcha_private_key' ]`
### اطلاعات ورود پیش‌فرض
 
**نام کاریری پیش‌فرض = `admin`**

**کلمه عبور پیش‌فرض = `password`**

_...که به راحتی می‌تواند مورد حملات بروت‌فورس قرار گیرد ;)_

نشانی ورود: http://127.0.0.1/login.php


_نکته: اگر DVWA را در مسیرمتفاوتی نصب کرده باشد، این نیز برای شما تفاوت خواهد داشت._

- - -

## عیب یابی

تمامی مراحل با فرض این که شما در یک توزیع مبتنی بر دبیان، مانند دبیان، اوبونتو و کالی هستید. برای سایر توزیع‌ها، هستید نوشته شده است، اما دستور را در صورت لزوم به‌روزرسانی کنید.

اگر ترجیح می دهید به جای خواندن، ویدیو تماشا کنید، رایج ترین مشکلات در ویدیو [رفع مشکلات راه اندازی DVWA] (https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F) پوشش داده شده است.

## کانتینر داکر

### می‌خواهم به لاگ دسترسی داشته باشم

اگر از Docker Desktop استفاده می‌کنید، می‌توانید از برنامه گرافیکی به گزارش‌ها دسترسی پیدا کنید.
برخی از جزئیات جزئی ممکن است با نسخه های جدیدتر تغییر کنند، اما روش دسترسی باید یکسان باشد.

![Overview of DVWA compose](./docs/graphics/docker/overview.png)

![Viewing DVWA logs](docs/graphics/docker/detail.png)

همچنین می توانید از طریق Terminal به لاگ ها دسترسی داشته باشید.

1. یک ترمینال را باز کنید و دایرکتوری کاری آن را به DVWA تغییر دهید
2. گزارش های ادغام شده را نشان دهید
```sh
docker compose logs
```

در صورتی که می‌خواهید لاگ ها در یک فایل ذخیره شوند این دستور را اجرا کنید:

```sh
docker compose logs > dvwa.log
```


#### می‌خواهم DVWA را روی پورت متفاوتی اجرا کنم

به صورت پیش فرض ما از پورت 80 به چند دلیل استفاده نمی‌کنیم:
- برخی کاربران ممکن است روی پورت 80 چیزی در حال اجرا داشته باشند
- برخی کاربران ممکن است از کانتینر هایی که rootless هستند (مثل Podman) استفاده کنند، دسترسی به پورت 80 نداشته باشند.

با تغییر اتصال پورت در فایل «compose.yml» می‌توانید DVWA را در پورت دیگری در معرض دید قرار دهید.
به عنوان مثال، شما می توانید مقدار زیر را

```yml
ports:
  - 127.0.0.1:4280:80
```

به

```yml
ports:
  - 127.0.0.1:8806:80
```
تغییر دهید.

حالا DVWA روی آدرس `http://localhost8806` در دسترس است.


در مواردی که می خواهید DVWA برای همه کاربران موجود در یک شبکه قابل دسترس باشد، مقدار `127.0.0.1:` را از فایل compose.yml حذف کنید (یا آن را با IP LAN خود جایگزین کنید). در این حالت امکان مشاهده DVWA در کل شبکه فراهم می باشد.
به این 
دستگاه لوپ بک محلی پس از همه، این یک برنامه وب آسیب پذیر لعنتی است که روی دستگاه شما اجرا می شود.

#### شروع خودکار DVWA در هنگام اجرای Docker

فایل موجود [`compose.yml`](./compose.yml) به طور خودکار DVWA و پایگاه داده آن را با شروع Docker اجرا می کند.

برای غیرفعال کردن این قابلیت، می‌توانید خط 

```yml
restart: unless-stopped
```

را در فایل [`compose.yml`](./compose.yml) حذف یا کامنت کنید.

اگر می‌خواهید این رفتار را به‌طور موقت غیرفعال کنید، می‌توانید `docker compose stop` را اجرا کنید، یا از Docker Desktop استفاده کنید، `DVWA` را پیدا کنید و روی Stop کلیک کنید.

اگر می‌‌خواهید کانتینر را متوقف کنید دستور `docker compose down` را اجرا کنید.  

### فایل LOG

در سیستم‌های لینوکس، آپاچی به‌طور پیش‌فرض دو فایل گزارش ایجاد می‌کند، «access.log» و «error.log» و در سیستم مبتنی بر دبیان معمولاً در `/var/log/apache2/` یافت می‌شوند.

هنگام ارسال گزارش خطا، مشکلات و مواردی از این قبیل، لطفاً حداقل پنج خط آخر هر یک از این فایل ها را وارد کنید. در سیستم های مبتنی بر دبیان می توانید موارد زیر را دریافت کنید:

```sh
tail -n 5 /var/log/apache2/access.log /var/log/apache2/error.log
```

### سایت را مرور می‌کنم، ولی خطای ۴۰۴ می‌گیرم

[ویدیو رفع مشکل](https://youtu.be/C-kig5qrPSA?si=wTS3Aj8fycW3Idfr&t=141)

اگر شما این خطا را دریافت می‌کنید، نیاز است تسبت به محل فایل‌ها آگاهی بیشتری کسب کنید. به‌شکل پیش‌فرض، پوشهٔ ریشهٔ فایلهای آپاچی (جایی که آن را به‌دنبال محتوای وبی جستجو می‌کند)، در `/var/www/html` واقع شده است. اگر شما فایل `hello.txt` را در آن قرار دهید، برای مرور آن می‌بایست از آدرس `http://localhost/hello.txt` استفاده کنید.  

اما اگر یک پوشه در آنجا ساخته‌اید و فایل را دروت آن قرار داده‌اید - `/var/www/html/mydir/hello.txt` - می‌بایست برای مرور آن از آدرس `http://localhost/mydir/hello.txt` استفاده کنید.
 
لینوکس، نسبت به بزرگی و کوچکی حروف حساس است. لذا در مثال بالا تلاش برای مرور هرکدام از آدرس‌های زیر نیز به شما خطای ۴۰۴ را گزارش خواهد داد: 

- `http://localhost/MyDir/hello.txt`
- `http://localhost/mydir/Hello.txt`
- `http://localhost/MYDIR/hello.txt`

این چه تأثیری بر روی DVWA‌خواهد داشت؟ بسیاری از افراد با استفاده از گیت، DVWA  را در پوشهٔ `/var/www/html` دانلود می‌کنند. این منجر به ایجاد پوشهٔ `/var/www/html/DVWA/` خواهد شد که تمام فایل‌های DVWA درون آن قرار می‌گیرند. پس از آن سراغ آپاچی رفته و `http://localhost/` را مرور کرده و با خطای ۴۰۴ یا صفحهٔ خوش‌آمدگویی آپاچی مواجه می‌شوند. از آنجایی که فایل‌ها درون پوشهٔ DVWA قرار دارند، باید بجای آن، آدرس `http://localhost/DVWA` را مرور کرد. 

اشتباه رایج دیگر استفاده از آدرس `http://localhost/dvwa` است که باز هم خطای ۴۰۴ را خواهد داد. چراکه  `dvwa` با `DVWA` در لینوکس یکی نیستند و لینوکس به حروف بزرگ و کوچک حساس می باشد.

بنابرین وقتی پس از نصب با خطای `404` مواجه شدید، یک مرتبه مرور کنید که فایها را در کجا نصب کرده‌اید، نسبت به پوشهٔ ریشهٔ فایلها در چه موقعیتی قرار گرفته‌اند و بزرگی و کوچکی حروف در نام پوشه‌های استفاده‌شده چه شکلی است.


### در هنگام باز شدن صفحه سایت صفحه سفید می باشد

[ویدیو رفع مشکل](https://youtu.be/C-kig5qrPSA?si=wTS3Aj8fycW3Idfr&t=243)

این معمولاً یک مشکل پیکربندی است که مشکل دیگری را پنهان می کند. به‌طور پیش‌فرض، PHP خطاها را نمایش نمی‌دهد، و بنابراین اگر فراموش کرده‌اید که نمایش خطا را در طول فرآیند راه‌اندازی روشن کنید، هر گونه مشکل دیگری مانند عدم اتصال به پایگاه داده، بارگذاری برنامه را متوقف می‌کند اما پیامی که به شما می‌گوید چه چیزی اشتباه است پنهان می‌شود.

برای رفع این مشکل، مطمئن شوید که `display_errors` و `display_startup_errors` را در [پیکربندی PHP] (#php-configuration) تنظیم کرده‌اید و سپس Apache را مجدداً راه‌اندازی کنید.
### خطای"Access denied" موقع اجرای نصب

اگر حین اجرای اسکریپت نصب این خطا را دریافت می‌کنید، بدان معنی است که نام کاربری و کلمهٔ عبور تنظیم‌شده در قایل تنظیمات با آنچه در پایگاه داده تنظیم شده است تطابق ندارد. [ویدیو رفع مشکل](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F&t=973)


```
Database Error #1045: Access denied for user 'notdvwa'@'localhost' (using password: YES).
```

این پیام خطا به شما می‌گوید که در حال استفاده از نام کاربری `notdvwa` هستید.  

خطای زیر می گوید که فایل پیکربندی را به سمت پایگاه داده اشتباهی نشانه رفته اید. [راهنمای ویدیو](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F&t=630)
  

```
SQL: Access denied for user 'dvwa'@'localhost' to database 'notdvwa'
```

این به شما می‌گوید که با استفاده از نام کاربری `dvwa` در حال تلاش برای اتصال به پایگاه دادهٔ `notdvwa` هستید.  

اولین قدم این است که بررسی کنید نام کاربری، رمزعبور، نام دیتابیس در فایل کانفیگ به صورت صحیح وجود دارد خیر

اگر مقادیر به درستی در فایل کانفیگ تعریف شده بودند، مرحلهٔ بعدی تلاش برای ورود با نام کاریری از طریق خط فرمان است. با فرض بر اینکه شما یک نام کاربری با نام `dvwa` و یک کلمهٔ عبور با مقدار `p@ssw0rd` دارید، می‌توانید دستور زیر را اجرا کنید: 

```
mysql -u dvwa -pp@ssw0rd -D dvwa
```

*دقت کنید که هیچ فاصلهٔ خالی بعد از p- قرار ندارد*

اگر یک چنین چیزی می‌بینید، کلمهٔ عبور شما صحیح است:

```
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.3.22-MariaDB-0ubuntu0.19.10.1 Ubuntu 19.10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [dvwa]>
```

از آنجا که از طریق خط فرمان به شکل موفقیت آمیز توانسته‌اید متصل شوید، به احتمال زیاد چیزی در فایل کانفیگ اشتباه است. مجدداً آن را بررسی کنید و اگر همچنان نتوانستید موفق شوید یک issue برای رسیدگی ایجاد کنید.

اگر چنین چیزی می‌بینید، یا نام کاربری یا کلمهٔ عبورتان اشتباه است. مراحل [نصب پایگاه داده](#database-setup)  را مجدداً تکرار کنید و اطمینان حاصل کنید که در کل این فرایند از همان نام کاربری و کلمهٔ عبور استفاده می‌کنید.
  
```
ERROR 1045 (28000): Access denied for user 'dvwa'@'localhost' (using password: YES)
```

اگر خطای زیر را می‌گیرید، بدین معنا است که نام کاربری و کلمهٔ عبور شما صحیح است، لبکن سطح دسترسی آن به پایگاه داده کافی نیست. در این حالت نیز مراحل نصب را تکرار کنید و نام پایگاه داده‌ای که به آن متصل می‌شوید را چک کنید.

```
ERROR 1044 (42000): Access denied for user 'dvwa'@'localhost' to database 'dvwa'
```

  
آخرین خطایی که ممکن است دریافت کنید نیز به شرح زیر است:

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

این یک خطای احراز هویت نیست، اما به شما می‌گوید که سرور پایگاه داده در حال اجرا نیست. آن را با دستور زیر اجرا کنید:
  
```sh
sudo service mysql start
```


### خطای اتصال

[ویدیو رفع مشکل](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F&t=444)

یک خطای مشابه هم میتوان مشاهده کرد

```mariadb
Fatal error: Uncaught mysqli_sql_exception: Connection refused in /var/sites/dvwa/non-secure/htdocs/dvwa/includes/dvwaPage.inc.php:535
```

به این معنی که سرور دیتابیس شما اجرا نشده است یا آدرس IP اشتباهی تعریف شده است.

برای دیدن محل مورد انتظار سرور پایگاه داده، این خط را در فایل پیکربندی بررسی کنید:

```php
$_DVWA[ 'db_server' ]   = '127.0.0.1';
```

سپس  بررسی کنید که ایا MariaDB در حال اجرا است؟
در لینوکس این کار را می‌توان با دستور زیر انجام داد:

```sh
systemctl status mariadb.service
```

در نتیجه این دستور باید همچین خروجی داشته باشد:

```sh
● mariadb.service - MariaDB 10.5.19 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-03-14 16:04:25 GMT; 1 week 5 days ago
```

اگه مقدار active (running) را مشاهده کردید یعنی سرویس MariaDB فعال می باشد.

اگر اجرا نشده بود دستور زیر را اجرا کنید

```sh
sudo systemctl stop mariadb.service
```

به `sudo` توجه کنید و در صورت درخواست، مطمئن شوید که رمز عبور کاربر لینوکس خود را وارد می‌کنید.

در ویندوز، وضعیت را در کنسول XAMPP بررسی کنید.

### روش ورود ناشتاخته

در جدیدترین نسخه‌های MySQL، PHP دیگر نمی‌تواند با پایگاه داده در پیکربندی پیش‌فرض آن ارتباط برقرار کند. اگر سعی کنید اسکریپت راه‌اندازی را اجرا کنید و پیام زیر را دریافت کنید، به این معنی است که پیکربندی انجام شده است.  

```
Database Error #2054: The server requested authentication method unknown to the client.
```

دو راه حل پیش رو دارید که آسان‌ترین آنها حذف مای‌اس‌کیو‌ال و نصب ماریادی‌بی بجای آن است. در پایین می‌توانید راهنمای رسمی پروژهٔ ماریادی‌بی را  ببینید:

<https://mariadb.com/resources/blog/how-to-migrate-from-mysql-to-mariadb-on-linux-in-five-steps/>

راه‌حل دیگر اجرای مراحل زیر است:
1. با کاربر روت، فایل `/etc/mysql/mysql.conf.d/mysqld.cnf` را برای ویرایش باز کنید.
2. زیر سطر `[mysqld]`، عبارت زیر را اضافه کنید:
`default-authentication-plugin=mysql_native_password`
3. سرویس پایگاه داده را ریستارت کنید:
`sudo service mysql restart`
4. حالت ارزیابی ورود را برای کاربرتان بررسی کنید:

    ```sql
    mysql> select Host,User, plugin from mysql.user where mysql.user.User = 'dvwa';
    +-----------+------------------+-----------------------+
    | Host      | User             | plugin                |
    +-----------+------------------+-----------------------+
    | localhost | dvwa             | caching_sha2_password |
    +-----------+------------------+-----------------------+
    1 rows in set (0.00 sec)
    ```

5. احتمالاً `caching_sha2_password` به چشمتان خواهد خورد در این صورت دستور زیر را اجرا کنید:

    ```sql
    mysql> ALTER USER dvwa@localhost IDENTIFIED WITH mysql_native_password BY 'p@ssw0rd';
    ```
  
6. اگر دوباره بررسی کنید، ایندفعه می‌بایست `mysql_native_password` را ببینید.  

    ```sql
    mysql> select Host,User, plugin from mysql.user where mysql.user.User = 'dvwa';
    +-----------+------+-----------------------+
    | Host      | User | plugin                |
    +-----------+------+-----------------------+
    | localhost | dvwa | mysql_native_password |
    +-----------+------+-----------------------+
    1 row in set (0.00 sec)
    ```

پس از تمام این کارها، الان فرایند نصب باید بتواند به صورت عادی انجام شود.

برای اطلاعات بیشتر صفحهٔ زیر را دنبال کنید:
 <https://www.php.net/manual/en/mysqli.requirements.php>.

### خطای شماره ۲۰۰۲ پایگاه داده: چنین فایل یا پوشه‌ای وجود ندارد

سرور پایگاه داده در حال اجرا نیستو در توزیع‌های مبتنی بر دبیان می‌توانید اینگونه مشکل را برطرف کنید:

```sh
sudo service mysql start
```

### خطاهای "MySQL server has gone away" و "Packets out of order"

چندین دلیل ممکن است برای گرفتن خطاهای بالا وجود داشته باشد. اما شایع‌ترینشان این است که نسخهٔ سرور پایگاه دادهٔ شما با نسخهٔ پی‌اچ‌پی سازگاری ندارد.

این ممکن است وقتی استفاده از آخرین نسخه‌های مای‌اسکیوال و پی‌اچ‌پی به خوبی پیش‌نرود مشاهده شود. بهترین توصیه کنارگذاشتن مای‌اسکیوال و نصب ماریا‌دی‌بی است چرا که این موضوعی نیست که بتوانیم پشتیبانی بیشتری در مورد آن بدهیم.

برای اطلاعات بیشتر اینجا را ببینید:

<https://www.ryadel.com/en/fix-mysql-server-gone-away-packets-order-similar-mysql-related-errors/>

### دلیل عدم اتصال به دیتابیس در CentOS

ممکن است با SELinux به مشکل برخورده باشید. یا SELinux را غیرفعال کنید یا این دستور را اجرا کنید تا به وب سرور اجازه دهید با پایگاه داده ارتباط برقرار کند:

```sh
setsebool -P httpd_can_network_connect_db 1
```

### داکر MariaDB شروع به کار نمی‌کند

اگر هنگام تلاش برای شروع MariaDB خطای زیر را در گزارش‌های Docker مشاهده کردید، احتمالاً به دلیل کمبود حافظه کافی در دستگاه میزبان است. اگر از این در یک محیط میزبانی شده استفاده می‌کنید، بهترین راه حل افزایش اندازه دستگاه برای دریافت حافظه بیشتر و دوباره امتحان کردن است.

```sh
[Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.11.15+maria~ubu2204 started.
[Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
```

همچنین ممکن است لازم باشد خط زیر را به بخش volums فایل `compose.yml` خود اضافه کنید:

```yaml
- /sys/fs/cgroup/memory.pressure:/sys/fs/cgroup/memory.pressure
```

### چیز دیگه ای می‌مونه

برای آخرین اطلاعات عیب‌یابی، لطفاً تیکت‌های باز و بسته را در مخزن گیت مطالعه کنید:

https://github.com/digininja/DVWA/issues

قبل از ارسال تیکت، لطفاً مطمئن شوید که آخرین نسخه کد را از مخزن اجرا می‌کنید. این آخرین نسخه نیست، این آخرین کد از شاخه اصلی است.

در صورت درخواست، لطفاً حداقل اطلاعات زیر را ارسال کنید:

- سیستم عامل
- ۵ خط آخر از گزارش خطای وب سرور بلافاصله پس از وقوع هر خطایی که گزارش می‌دهید
- اگر مشکل از احراز هویت پایگاه داده است، مراحل بالا را طی کنید و از هر مرحله اسکرین شات بگیرید. این مراحل را به همراه اسکرین شاتی از بخشی از فایل پیکربندی که نام کاربری و رمز عبور پایگاه داده را نشان می‌دهد، ارسال کنید.
- شرح کاملی از مشکل، آنچه انتظار دارید اتفاق بیفتد و آنچه برای رفع آن تلاش کرده‌اید. عبارت «ورود به سیستم خراب است» برای درک مشکل شما و کمک به رفع آن برای ما کافی نیست.

- - -

## آموزش

من سعی می‌کنم چند ویدیوی آموزشی تهیه کنم که برخی از آسیب‌پذیری‌ها را بررسی کرده و نحوه شناسایی و سپس بهره‌برداری از آنها را نشان دهد. در اینجا ویدیوهایی که تاکنون ساخته‌ام را مشاهده می‌کنید:

[Finding and Exploiting Reflected XSS](https://youtu.be/V4MATqtdxss)

---

##  تزریق SQL در SQLite3

_پشتیبانی از این موضوع بسیار محدود است. قبل از ثبت خطا باید اطمینان داشته‌باشید برای کارکردن بر روی اشکالزدایی آمادگی کافی را داشته باشید. از مطرح‌کردن "فلان چیز کار نمی‌کند"  بپرهیزید_

به طور پیش‌فرض SQLi و Blind SQLi بر روی سرور ماریا‌دی‌بی یا مای‌اسکیوال استفاده شده در سایت انجام می‌شوند. اما این امکان وجود دارد که تست SQLi را بجای آن بر روی یک SQLite3‌ انجام دهید.

در اینجا چگونگی راه‌اندازی و کارکردن SQLite3 با PHP‌ توضیح داده نمی‌شود، اما چیز ساده‌ای در حد نصب `php-sqlite3` و اطمینان از فعال بودن آن را یادآوری می‌کنیم.

برای تغییر، کافیست فایل کانفیگ را ویرایش کنید و خطوط زیر را تغییر داده یا اضافه کنید:
  

```php
$_DVWA["SQLI_DB"] = "sqlite";
$_DVWA["SQLITE_DB"] = "sqli.db";
```

به طور پیش‌فرض از فایل `database/sqli.db` استفاده می‌شود. اگر به طور اتفاقی به این فایل آسب زدید، آن را از مبدا `database/sqli.db.dist` بازنویسی کنید

باقی مسائل همانند مای‌اس‌کیو‌ال است با این تفاوت که از SQLite3 بجای آن استفاده کرده‌ایم.  

- - -

👨‍💻 مشارکت‌کنندگان
-----

از تمام مشارکت‌هایتان و به‌روزرسانی این پروژه متشکرم. :heart:

  اگر ایده‌ای، نوعی بهبود یا صرفاً تمایل به همکاری دارید، از مشارکت و حضور در پروژه استقبال می‌شود، لطفاً PR خود را ارسال کنید.

<p align="center">
    <a href="https://github.com/digininja/DVWA/graphs/contributors">
      <img src="https://contrib.rocks/image?repo=digininja/DVWA&max=500">
    </a>
</p>

- - -

## گزارش آسیب‌پذیری‌ها

ساده بگم، این کارو نکنید!

سالی یک بار، کسی گزارشی برای آسیب‌پذیری‌ای که در برنامه پیدا کرده است، ارسال می‌کند، برخی از آنها به خوبی نوشته شده‌اند، گاهی اوقات بهتر از آنچه در گزارش‌های تست نفوذ پولی دیده‌ام، برخی فقط می‌گویند «هدرها را گم کرده‌اید، به من پول بدهید».

در سال ۲۰۲۳، این موضوع به سطح کاملاً جدیدی ارتقا یافت، زمانی که کسی تصمیم گرفت برای یکی از آسیب‌پذیری‌ها درخواست CVE کند، [CVE-2023-39848](https://nvd.nist.gov/vuln/detail/CVE-2023-39848) به او داده شد. کلی سر و صدا به پا شد و وقت زیادی برای اصلاح این موضوع تلف شد.

این برنامه آسیب‌پذیری‌هایی دارد، و این عمدی است. اکثر آنها به خوبی مستند شده‌اند و شما به عنوان درس روی آنها کار می‌کنید، بقیه موارد "پنهان" هستند، مواردی که باید خودتان آنها را پیدا کنید. اگر واقعاً می‌خواهید مهارت‌های خود را در یافتن موارد اضافی پنهان نشان دهید، یک پست وبلاگ بنویسید یا یک ویدیو بسازید زیرا احتمالاً افرادی هستند که علاقه‌مند به یادگیری در مورد آنها و نحوه یافتن آنها توسط شما هستند. اگر لینک را برای ما ارسال کنید، حتی ممکن است آن را در منابع قرار دهیم.

## پیوندها

صفحهٔ اصلی پروژه: <https://github.com/digininja/DVWA>

*تهیه‌شده توسط تیم DVWA*