이러한 실수를 저지르면 해커가 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
파일 포함 취약점을 방지하려면:
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 명령의 실행을 허용합니다.
위의 함수에 대한 인수로 사용자 입력을 전달하면 해커가 서버에서 임의의 명령을 실행할 수 있는 명령 실행 취약점이 발생할 수 있습니다. 예를 들어 아래 코드를 고려하십시오.
$ip = $_GET['ip'];
echo exec("ping $ip");
위의 코드는 사용자가 모든 IP를 ping할 수 있는 ping 서비스입니다. 사용자가 IP 주소로 1 & echo 123을 입력하면 echo 명령이 서버에서 실행됩니다.
명령 실행 취약점을 방지하는 방법:
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
등록된 댓글이 없습니다.