https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%9D%D0%B5%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2&feed=atom&action=historyВведение в практическую безопасность (2019)/Небезопасная загрузка файлов - История изменений2024-03-29T09:15:27ZИстория изменений этой страницы в викиMediaWiki 1.32.0https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%9D%D0%B5%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2&diff=191&oldid=prevAsterite: /* Но далеко не только это */2019-03-17T18:43:59Z<p><span dir="auto"><span class="autocomment">Но далеко не только это</span></span></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Предыдущая</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Версия 18:43, 17 марта 2019</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l33" >Строка 33:</td>
<td colspan="2" class="diff-lineno">Строка 33:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>К уязвимостям небезопасной загрузки файлов также можно относить уязвимости, связаные не с созданием загруженного файла на диске, а с его обработкой на сервере (или способом хранения). К примеру, изображение может загружаться на серевер и как-то обрабатываться (конвертироваться в другой формат например), после чего возвращаться клиенту или передаваться еще куда-то - и в софте, занимающимся обаботкой, может быть уязвимость. На диске на сервере оно может при этом не сохраняться вообще.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>К уязвимостям небезопасной загрузки файлов также можно относить уязвимости, связаные не с созданием загруженного файла на диске, а с его обработкой на сервере (или способом хранения). К примеру, изображение может загружаться на серевер и как-то обрабатываться (конвертироваться в другой формат например), после чего возвращаться клиенту или передаваться еще куда-то - и в софте, занимающимся обаботкой, может быть уязвимость. На диске на сервере оно может при этом не сохраняться вообще.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Больше </del>про уязвимости загрузки файлов можно найти в [https://khashaev.ru/secsem/file-upload/slides.pdf этих отличных слайдах от Артура Хашаева]. [https://www.owasp.org/index.php/Unrestricted_File_Upload Вот про уязвимый file upload на OWASP].</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Еще инфу </ins>про уязвимости загрузки файлов можно найти в [https://khashaev.ru/secsem/file-upload/slides.pdf этих отличных слайдах от Артура Хашаева]. [https://www.owasp.org/index.php/Unrestricted_File_Upload Вот про уязвимый file upload на OWASP].</div></td></tr>
</table>Asteritehttps://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%9D%D0%B5%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2&diff=188&oldid=prevAsterite: /* Но далеко не только это */2019-03-17T18:12:28Z<p><span dir="auto"><span class="autocomment">Но далеко не только это</span></span></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Предыдущая</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Версия 18:12, 17 марта 2019</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l33" >Строка 33:</td>
<td colspan="2" class="diff-lineno">Строка 33:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>К уязвимостям небезопасной загрузки файлов также можно относить уязвимости, связаные не с созданием загруженного файла на диске, а с его обработкой на сервере (или способом хранения). К примеру, изображение может загружаться на серевер и как-то обрабатываться (конвертироваться в другой формат например), после чего возвращаться клиенту или передаваться еще куда-то - и в софте, занимающимся обаботкой, может быть уязвимость. На диске на сервере оно может при этом не сохраняться вообще.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>К уязвимостям небезопасной загрузки файлов также можно относить уязвимости, связаные не с созданием загруженного файла на диске, а с его обработкой на сервере (или способом хранения). К примеру, изображение может загружаться на серевер и как-то обрабатываться (конвертироваться в другой формат например), после чего возвращаться клиенту или передаваться еще куда-то - и в софте, занимающимся обаботкой, может быть уязвимость. На диске на сервере оно может при этом не сохраняться вообще.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Больше про уязвимости загрузки файлов можно найти в [https://khashaev.ru/secsem/file-upload/slides.pdf этих отличных слайдах от Артура Хашаева]<del class="diffchange diffchange-inline">, вот </del>про</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Больше про уязвимости загрузки файлов можно найти в [https://khashaev.ru/secsem/file-upload/slides.pdf этих отличных слайдах от Артура Хашаева]<ins class="diffchange diffchange-inline">. [https://www.owasp.org/index.php/Unrestricted_File_Upload Вот </ins>про <ins class="diffchange diffchange-inline">уязвимый file upload на OWASP].</ins></div></td></tr>
</table>Asteritehttps://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%9D%D0%B5%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2&diff=187&oldid=prevAsterite: /* PHP web shell */2019-03-17T18:11:23Z<p><span dir="auto"><span class="autocomment">PHP web shell</span></span></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Предыдущая</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Версия 18:11, 17 марта 2019</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l14" >Строка 14:</td>
<td colspan="2" class="diff-lineno">Строка 14:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> system("ls /");</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> system("ls /");</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>и, получив ссылку на него (к примеру, <code>/uploads/5c8e82bb8ad66/attack.php</code>) обратится по ней, то в результате этот PHP-код выполнится и в ответе сервера будет произведение чисел 5 и 1451, а также список файлов в корневой директории сервера (функция PHP <code>system</code> работает так же как одноимённая функция библиотеки Си - то есть выполняет команду shell. В итоге атакующий получает '''выполнение произвольного кода''' на сервере ('''RCE''').</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>и, получив ссылку на него (к примеру, <code>/uploads/5c8e82bb8ad66/attack.php</code>) обратится по ней, то в результате этот PHP-код выполнится и в ответе сервера будет произведение чисел 5 и 1451, а также список файлов в корневой директории сервера (функция PHP <code>system</code> работает так же как одноимённая функция библиотеки Си - то есть выполняет команду shell<ins class="diffchange diffchange-inline">)</ins>. В итоге атакующий получает '''выполнение произвольного кода''' на сервере ('''RCE''').</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>==== Обход механизмов защиты ====</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>==== Обход механизмов защиты ====</div></td></tr>
</table>Asteritehttps://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%9D%D0%B5%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2&diff=186&oldid=prevAsterite: /* PHP web shell */2019-03-17T18:11:08Z<p><span dir="auto"><span class="autocomment">PHP web shell</span></span></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Предыдущая</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Версия 18:11, 17 марта 2019</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l14" >Строка 14:</td>
<td colspan="2" class="diff-lineno">Строка 14:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> system("ls /");</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> system("ls /");</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>и, получив ссылку на него (к примеру, <code>/uploads/5c8e82bb8ad66/attack.php</code>) обратится по ней, то в результате этот PHP-код выполнится и в ответе сервера будет произведение чисел 5 и 1451, а также список файлов в корневой директории сервера. В итоге атакующий получает '''выполнение произвольного кода''' на сервере ('''RCE''').</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>и, получив ссылку на него (к примеру, <code>/uploads/5c8e82bb8ad66/attack.php</code>) обратится по ней, то в результате этот PHP-код выполнится и в ответе сервера будет произведение чисел 5 и 1451, а также список файлов в корневой директории сервера <ins class="diffchange diffchange-inline">(функция PHP <code>system</code> работает так же как одноимённая функция библиотеки Си - то есть выполняет команду shell</ins>. В итоге атакующий получает '''выполнение произвольного кода''' на сервере ('''RCE''').</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>==== Обход механизмов защиты ====</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>==== Обход механизмов защиты ====</div></td></tr>
</table>Asteritehttps://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%9D%D0%B5%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2&diff=185&oldid=prevAsterite: Новая страница: «__NOTOC__ '''Загрузка файлов''' пользователями - довольно частая часть функциональности веб-пр…»2019-03-17T18:08:42Z<p>Новая страница: «__NOTOC__ '''Загрузка файлов''' пользователями - довольно частая часть функциональности веб-пр…»</p>
<p><b>Новая страница</b></p><div>__NOTOC__<br />
'''Загрузка файлов''' пользователями - довольно частая часть функциональности веб-приложения (аватарки, хостинг файлов, посылка вложений вместе с сообщениями и т. д.). Небезопасная реализация этого механизма может приводить к очень серьезным уязвимостям.<br />
<br />
== Создание загруженного файла на сервере ==<br />
<br />
Самый простой способ реализации механизма загрузки файлов - просто создавать на файловой системе сервера файл с таким же содержимым как файл, отправленый пользователем (проще говоря, "класть" присланный пользователем файл куда-то на файловую систему сервера). После загрузки файл либо доступен пользователю по прямой ссылке (т. е. определенные URL-адреса мапятся на загруженные файлы и существует URL, обращение к которому ведет к отдаче загруженного файла), либо как то еще обрабатывается веб-приложением. Само веб-приложение во многом состоит из файлов на диске, поэтому добавление файлов на сервер может быть небезопасным, так как (в общем случае) может изменить логику работы приложения.<br />
<br />
=== PHP web shell ===<br />
<br />
Простейшим примером является загрузка файла с расширением <code>.php</code> на сайт, работающий на '''PHP'''. По умолчанию PHP-сайты работают так что пользователь обращается по URL к файлу (URL сайта, начиная с первого <code>/</code>, мапятся на определенную директорию на сервере, она называется '''web root''') и, если этот файл имеет расширение <code>php</code> (или другое расширение из предопределенного списка расширений для PHP-файлов), то содержимое этого файла выполняется как код на PHP, вывод этого кода возвращается пользователю в ответе (кстати, так работает не только PHP, но и '''ASP.NET Web Forms''', '''JSP''', '''ASP'''). В результате, если пользователь может загрузить на сайт файл c расширением <code>.php</code> и обратиться к нему по URL (т. е. этот файл будет создан где-то внутри '''web root'''), то, если сервер специально не настроен чтобы файлы из директории для загрузок не выполнялись, PHP-код в нём будет выполнен. Это можно попробовать на стенде http://fu.stands.course.secsem.ru - хотя сайт предназначен для загрузки изображений, если атакующий загрузит на него файл <code>attack.php</code> c кодом<br />
<pre><?php<br />
echo "5 * 1451 = ", 5 * 1451;<br />
echo " ls /: ";<br />
system("ls /");<br />
</pre><br />
и, получив ссылку на него (к примеру, <code>/uploads/5c8e82bb8ad66/attack.php</code>) обратится по ней, то в результате этот PHP-код выполнится и в ответе сервера будет произведение чисел 5 и 1451, а также список файлов в корневой директории сервера. В итоге атакующий получает '''выполнение произвольного кода''' на сервере ('''RCE''').<br />
<br />
==== Обход механизмов защиты ====<br />
<br />
Даже когда создатель сайта знает о возможной опасности и использует механизмы защиты, они могут оказаться неэффективными.<br />
<br />
Проверка типа файла '''на клиенте''' (т. е. в браузере) с помощью выставления типа атрибута <code>accept</code> у file input или с помощью JavaScript-кода неэффективна просто потому что атакующий может не использовать браузер (а использовать вместо него тот же Burp Suite или скрипт на Питоне).<br />
<br />
Нередко запрещается загрузка "опасных" расширений , однако, во первых, черный список может быть неполным (кроме <code>php</code> в качестве расширения для PHP-файлов распознаётся, как правило, <code>php3</code>, <code>php4</code>, <code>php5</code>, <code>pht</code>, <code>phtml</code>) или проверка может тривиальным образом обходиться (например расширение <code>pHP</code> может обойти чёрный список, но быть воспринятым как расширение PHP-скрипта сервером). Также, из-за особенностей конфигурации сервера файл может быть проинтерпретирован как PHP-скрипт когда <code>.php</code> является '''не последним''' расширением (т. е. например <code>attk.php.jpg</code>).<br />
<br />
Другим вариантом может быть проверка '''содержимого''' на то, относится ли оно к ожидаемому типу (скажем, изображению или видео). Однако, тут атакующему помогает то что PHP довольно толерантен к содержимому скриптов - PHP-код начинается с <code><?php</code> (или просто <code><?</code> если включена настройка <code>short_open_tag</code>) и может заканчиваться на <code>?></code> - всё что находится за пределами этих маркеров (эдакого "тэга") просто выдаётся в вывод as is без ошибок, какие бы байты там ни были.<br />
В результате, PHP-скрипт может быть вполне валидной картинкой и, если где-то в середине неё встретится <code><?php system("echo ATTACK HERE"); ?></code>, этот код выполнится. Здесь атакующему может помешать то что в бинарном файле может просто случайно встретиться маркер начала PHP-кода, то что идет после него скорее всего не будет валидным PHP-кодом и выполнение упадёт с ошибкой. Для борьбы с этим можно стараться брать медиафайлы поменьше (чтобы снизить вероятность того что в них найдется определённая последовательность байт), ну и проверять их. Другая вещь, которая может осложнить эту атаку ещё больше - преобразование файла на сервере (resize картинки, пережатие видео) - однако, успешно атаковать бывает можно и в этих случаях.<br />
<br />
== Но далеко не только это ==<br />
<br />
Небезопасная загрузка файлов может быть далеко не только в PHP и упомянутых ASP.NET Web Forms/JSP/ASP, загрузить файлы с исходным кодом и добиться их выполнения бывает можно и в случае сайтов на '''Python''' и '''JavaScript''' и других платформ. Вообще, файлы с исходным кодом не являются единственным вектором атаки, другим вариантом является загрузка конфигурационных файлов, для того же PHP бывает можно загрузить конфигурационный файл <code>.htaccess</code>, который позволяет внести изменения в конфигурацию сервера для данной директории, что в конечном итоге также даёт выполнение произвольного кода (точно так же в случае ASP.NET бывает можно загрузить конфигурационный файл <code>web.config</code>).<br />
<br />
К уязвимостям небезопасной загрузки файлов также можно относить уязвимости, связаные не с созданием загруженного файла на диске, а с его обработкой на сервере (или способом хранения). К примеру, изображение может загружаться на серевер и как-то обрабатываться (конвертироваться в другой формат например), после чего возвращаться клиенту или передаваться еще куда-то - и в софте, занимающимся обаботкой, может быть уязвимость. На диске на сервере оно может при этом не сохраняться вообще.<br />
<br />
Больше про уязвимости загрузки файлов можно найти в [https://khashaev.ru/secsem/file-upload/slides.pdf этих отличных слайдах от Артура Хашаева], вот про</div>Asterite