분류 php

7가지 PHP 실수로 웹사이트가 해커에게 노출

컨텐츠 정보

  • 조회 522 (작성일 )

본문

이러한 실수를 저지르면 해커가 Cross Site Scripting, SQL Injection, Path Traversal 및 기타 공격을 사용하여 웹 애플리케이션을 공격하여 웹 사이트를 장악합니다.


흔한 실수와 그 예방법을 살펴보자.


1- Echo user input 


아래 코드는 웹사이트에 XSS 취약점을 생성하기에 충분합니다.


echo '<p>' . $_GET['name'] . '</p>'; // vulnerable to XSS


응답 내용을 생성하기 위해 사용자 입력을 직접 사용하지 마십시오. 위험한 코드를 이스케이프하려면 사용자 입력에 적절한 인코딩을 사용해야 합니다. PHP에는 사용할 수 있는 html 특수 문자를 인코딩하는 내장 htmlentities() 함수가 있습니다.


echo '<p>' . htmlentities($_GET['name']) . '</p>'; // safe code


때때로 사용자 입력은 페이지 생성을 위해 간접적으로 사용됩니다. 예를 들어, 사용자 입력은 응답에 사용되기 전에 데이터베이스에 저장될 수 있습니다.


2- 파일 경로에서 사용자 입력 사용 


사용자 입력이 포함된 파일 경로를 생성하고 사용하는 것은 다음과 같은 치명적인 취약점을 유발할 수 있는 가장 위험한 실수 중 하나입니다.

아래 코드는 파일 포함 취약점의 예입니다.


include $_GET['file']; // vulnerable to remote/local file inclusion


파일 포함 취약점을 방지하려면:

  • ./ 및 ../를 포함하는 모든 상대 경로를 절대 경로로 해석하고 최종 파일이 있어야 할 디렉토리에 있는지 확인하십시오.
  • 가능하면 허용 목록에 있는 입력만 수락하려고 합니다.
  • null 바이트, 물음표, 세미콜론 등과 같은 파일 이름에 잘못된 문자가 있는지 확인하십시오.
  • 스키마(http://, ftp:// 등)로 시작하는 URL을 포함하지 마십시오.

3- 사용자 입력과 SQL 쿼리 연결 


사용자 입력을 사용하여 SQL 쿼리를 생성하면 사용자가 원래 SQL 명령을 조작하고 임의의 명령을 삽입할 수 있습니다. 이것을 SQL 인젝션이라고 합니다.

해커는 SQL 주입 취약점을 악용하여 데이터베이스에 드롭과 같은 명령을 실행하거나 시스템 명령을 실행할 수 있습니다.


예제 코드:

<?php
$db = new SQLite3('products.db');
$id = $_GET['id'];
// below line is vulnerable to SQLI
$name = $db->querySingle("SELECT name from products where productId=$id");
// below line is not vulnerable
$name = $db->querySingle("SELECT name from products where productId='" .
SQLite3::escapeString($id) . "'");

echo $name ;


SQL 주입을 방지하기 위해 SQL 쿼리를 생성하기 위해 준비된 문을 사용하는 것은 항상 좋은 습관입니다. SQLI를 피하는 또 다른 방법은 사용자 입력에서 특수 문자를 이스케이프하는 것입니다(위의 예와 같이).


4- 사용자 입력 실행 


PHP의 아래 명령은 PHP 코드 또는 OS 명령의 실행을 허용합니다.

  • eval()
  • preg_replace()
  • system()
  • exec()
  • passthru()
  • shell_exec()

위의 함수에 대한 인수로 사용자 입력을 전달하면 해커가 서버에서 임의의 명령을 실행할 수 있는 명령 실행 취약점이 발생할 수 있습니다. 예를 들어 아래 코드를 고려하십시오.

$ip = $_GET['ip'];
echo exec("ping $ip");


위의 코드는 사용자가 모든 IP를 ping할 수 있는 ping 서비스입니다. 사용자가 IP 주소로 1 & echo 123을 입력하면 echo 명령이 서버에서 실행됩니다.


명령 실행 취약점을 방지하는 방법:

  • eval(), system(), ... 같은 함수를 사용하지 마십시오.
  • 허용 목록에 있는 입력 수락
  • &, 세미콜론과 같은 특수 문자에 대한 입력 확인

popen() 함수는 명령 실행에 간접적으로 사용할 수도 있습니다. 따라서 사용할 때 주의하십시오.


5- 사용자 입력으로 리디렉션 


PHP에서 사용자를 리디렉션하는 것은 일반적이고 쉽습니다. 아래 코드를 사용하여 수행할 수 있습니다.


header('Location: ' . $_GET['url']); // vulnerable code


그러나 이것은 취약합니다! 사용자를 다른 웹사이트로 리디렉션하는 데 악용될 수 있습니다.


열린 리디렉션을 방지하려면 사용자를 리디렉션하기 전에 URL이 오프사이트 링크가 아닌지 확인하십시오.


6- 오류 보고 켜기 


PHP 오류는 경로/파일, 데이터베이스 오류, OS 유형 및 기타 정보와 같은 정보를 공개합니다. 프로덕션에서 모든 종류의 PHP 오류를 표시하면 해커가 웹 사이트에 더 쉽게 침입할 수 있습니다.


error_reporting(E_ALL); // bad code for production
error_reporting(); // safe for production usage


7- phpInfo() 


phpInfo() 함수는 엄청난 양의 정보를 표시합니다. PHP 버전 번호, 활성 확장, 구성 및 시스템 경로는 이러한 정보의 몇 가지 예입니다.

이 정보는 해커가 서버에 대해 알아보고 공격을 보다 성공적으로 수행하는 데 사용할 수 있습니다. 정보 공개를 피하려면 프로덕션 서버에서 phpInfo() 함수를 사용하지 않는 것이 좋습니다.


결론 


PHP 애플리케이션에서 사용자 입력을 처리하는 것은 까다로울 수 있으며 다양한 취약점이 발생하기 쉽습니다. XSS, SQL 주입 및 로컬 파일 포함은 사용자 입력과 관련된 설명된 취약점 중 일부입니다. 사용자 입력을 엄격하게 확인하고 eval() 및 phpInfo()와 같은 위험한 함수를 사용하여 더 안전한 코드를 사용하지 않도록 하십시오.


참고: 다음은 알고 있어야 하는 기본적이고 가장 일반적인 문제입니다. 이 기사에서 @moay가 언급한 것과 같은 더 복잡한 보안 취약점이 있습니다.


출처 : https://dev.to/smartscanner/these-7-php-mistakes-leave-your-website-open-to-the-hackers-2bje