SQL 인젝션에서 무고한 MySQL의 보호
저자:
Ashfaq 안사

이용 후기:
평가:
5
10월 19, 2012
마지막으로 수정:일월 18, 2013

개요:

PHP에서 MySQL의 주입을 방지하는 방법에 대한 자세한 안내. SQL 주입을 방지하기 위해 코딩 규칙과 기능을 확보.

소개

 

이것은 당신의 결백을 보호하는 방법에 대한 간략한 가이드 MySQL을 에서 데이터베이스 SQL 인젝션 공격.
 

SQL 주입은 무엇입니까?

 

이름에서 알 수 있듯이, SQL 주입 사용자가 응용 프로그램에 SQL 문을 삽입 할 때 발생.
 
어떻게 이런 일이 않습니다?
 
우리는 사용자 이름과 암호를 사용하는 간단한 로그인 폼이 있다고, 및 데이터베이스에 대해 검증. 사용자 이름과 암호의 유효성을 검사하는 경우, 사용자가 시스템에 로그인.
 

이에 대한 코드는 다음과 같은 것을 볼 수 있었다:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?PHP
// POST 요청에서 사용자 및 암호를 얻을 수
$USER_NAME = $_POST[ '사용자 이름' ];
$암호  = $_POST[ '비밀번호' ];

$질문 = "FIRST_NAME을 선택, LAST_NAME, users_table WHERE 이름 = 'FROM ACCOUNT_NUMBER$USER_NAME'AND 암호 ='$암호' ";

$결과 = mysql_query( $질문 );

// MySQL은 무엇을 발견하는지 확인, 그것이 성공하면 다음 레코드를 얻을
( 위해서는 mysql_num_rows( $결과 ) > 0 ) {
    $데이터 = mysql_fetch_assoc( $결과 );
    에코 '환영' . $사용자 . '!';
    에코 '계좌 번호는: ' . $데이터[ 'ACCOUNT_NUMBER' ] . ';
} //errorr 메시지를 출력
그렇지 않으면 {
    에코 '사용자 이름 또는 암호 유효하지! 다시 시도하십시오!';
}
?>

 

위의 스크립트는 잘 작동하고 자신의 은행 계좌 번호를 확인하기 위해 정품 사용자가 자신의 사용자 이름과 암호를 입력 할 수.
 

의 내가 입력하는 가정하자 “데모” 내 이름으로, 과 “demopass” 내 암호, 다음 MySQL로 전달되는 SQL 쿼리는 다음과 같습니다합니다:
 

1
선택 FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE 이름 = '데모' 암호 = 'Demopass' ;

 

우리의 입력 데이터가 데이터베이스에 성공적으로 검증 될 경우, 그리고 우리는 시스템에 로그인하고 우리는 다른 계좌 번호가 표시됩니다 우리가 시스템에 대한 액세스를 얻을하지 않습니다 그리고 우리는 오류 메시지가 표시됩니다 “사용자 이름 또는 암호 유효하지! 다시 시도하십시오!
 

악의적 인 사용자가 SQL 문을 종료하기위한 것입니다 다른 문자를 입력 문제.
 

사용자가 사용자 이름으로 로그인을 시도하는 가정하자 dem'o 및 암호 demopass.
 

지금, SQL 문이 어떻게되는지 보자.
 

1
선택 FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE 이름 = ''o'AND 암호 ='demopass' ;

 

MySQL은 문을 실행하는 경우, 만 취급합니다 “dem” 사용자 이름과 때와는 또 다른 발견 ‘o', 다음은 취급 ‘o‘ SQL 명령과하고 인식하지 않기 때문에 그것은 메시지를 던져 및 오류합니다 ‘o‘ 유효한 SQL 명령으로.
 
ERROR 1064 (42000): 당신은 당신의 SQL 구문에 오류가 있습니다; 'O 근처에 사용할 올바른 구문 MySQL 서버 버전에 해당하는 설명서를 확인’ 및 암호 =”demopass”; ” 라인 1
 

최고. 위의 오류 메시지가 SQL 구문에서 몇 가지 오류가 있다는 것을 말한다. 면 마법의 따옴표 활성화 된, 우리는 위의 오류 메시지를 가지고하지 않을 수 있습니다.
 

지금, 의는 악의적 인 사용자가 같은 사용자 이름을 입력하면 어떻게되는지 보자 (‘ OR '1'= '1) 및 암호 “demopass“.

SQL 쿼리는 다음과 같이 표시됩니다:

1
선택 FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE 이름 = ' OR '1 '='1 ' 암호 = 'Demopass' ;

 

위의 SQL 쿼리는 무엇을 의미 하는가? 그것은 동일한 이름을 가진 모든 행을 찾기 위해 MySQL을 알려줍니다 “” (공백) 또는 (1= 1) 과 동일한 암호 “demopass“.
 

의는 SQL 문을 사용하여 실제로 무엇을 잘못 이해하는 것이 더 논리적으로 위의 SQL 쿼리를 표현하자:
 

username을 = “” OR “1= 1” 과 암호 = “demopass”
 

지금, 우리는 이미 1 = 1은 항상 TRUE 될 것을 알고. 따라서, 암호가 정확하고 사용자 이름이 잘못된 경우 사용자가 시스템에 로그인 할 수 있습니다.
 

의 다른 공격 문자열로 더 악화 시나리오를 분석하자.
 

공격 문자열: ‘ OR 1 = 1–
 

주의하시기 바랍니다 (#) 하는 데 사용됩니다 SQL 문을 종료. 의는 SQL 쿼리에 공격 문자열을 넣어 보자하고 최종 SQL 문이 모양을 볼 수.
 

지금, 우리는 공격자도 암호를 알고하지 않는 것으로 간주합니다.
 

1
선택 FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE 이름 = ' OR 1=1--'AND 암호 ='idonotknow ' ;

 

SQL 문이 MySQL을 해석하는 방법을 참조하십시오.
 

username을 = “” OR 1 = 1– 과 암호 = “idonotknow”
 

주의하시기 바랍니다 위의 문장에서. 우리가 알고로 명령문은 SQL의 터미네이터 1= 1 항상 TRUE입니다, SQL 쿼리 문 터미네이터 나머지는 실행되지 않습니다 후.
 

따라서, 테이블에있는 모든 레코드가 반환 얻을 것이다 및 사용자가 시스템에 로그인합니다. 공격자는 데이터베이스의 첫 번째 레코드의 계좌 번호를 볼 수있을 것이다.
 

의 무죄 MySQL의 도와 드리겠습니다
 

마법의 따옴표

 

마법의 따옴표 PHP 스크립트 언어의 논란 기능입니다, 특수 문자가 전달되기 전에 백 슬래시로 준비 - 종료됩니다 상기.
 

마법의 따옴표 새로운 설치에서 기본적으로 사용 하였다 PHP3PHP4, 그들의 작업 장면 뒤에 즉시 명확하지 이후, 개발자는 자신의 존재와 그들이 일으킬 수있는 잠재적 문제를 인식 할 수 있습니다.
 

우리는 켜해야합니다 마법의 따옴표php.ini 파일 웹 사이트의 웹 루트에있는 파일을.
 

어떻게 매직 견적 도움?

 

우리는이 인용 문자를 이스케이프 할 필요가 ( 단일 및 이중 두 따옴표, 뿐만 아니라 백 슬래시).
이것은 그들 앞에 슬래시를 넣어 이루어집니다.
 

So usename = dem'o 된다 DEM 'O , 그대로와 MySQL은 따옴표 함께 작업 할 수 있습니다 “보호” 슬래쉬.
 

의이 때 어떤 일이 일어나는지 보자 마법의 따옴표 켜져. 의 공격자가 마법의 주가에 영향을받는 방법을 알아 보겠습니다.
 

1
선택 FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE 이름 = '\' OR = 1 - ' 암호 = 'idonotknow' ;

 

사용자 이름은 다음과 같이 해석됩니다: \’ OR 1 = 1–

즉, 완벽의 SQL 쿼리를 탈출, 아무것도 주입하지받을 수 있습니다. magic_quotes_gpc 옵션 우리에게 위험한 따옴표를 이스케이프. 따라서, 공격자가 시스템에 로그인 할 수 없습니다.

마법의 금리 문제

 

마법의 따옴표 단지 몇 문자 앞에 백 슬래시를 삽입, 아무것도 없습니다. 이 공동 발생 만 이상 만 같은 특별한 경우에 SQL 주입으로부터 우리를 보호. 우리가 가지고있는 경우 ON display_errors, 우리는 당신의 데이터베이스 정보와 함께 아주 행복 공격자가 바로 자신의 눈 앞에 출력했다. 당신이하지 않는 경우에도, 아직도 블라인드 SQL 인젝션 사전 SQL 주입 방법을 사용의 가능성은 우회하는 것이 가능하다입니다 magic_quotes_gpc 옵션 기능.
 
그래서, 우리는 엉터리없는 데이터를 이스케이프하는 방법이 필요합니다, 문자 세트 문제로 경향이 없습니다, 마법 번식 인하 인용하는 경향이되지 않습니다.
 
11월 2005 핵심 PHP 개발자는 이러한 문제의 계정을 결정하는 마법의 따옴표 기능은 PHP에서 제거 될 것이다 6.
한 번 마법의 따옴표 기능은 철회, 다음 자르기 몇 가지 주요 문제가있을거야.
 

SQL 주입 완화
 

방지하는 방법에는 여러 가지가 있습니다 MySQL을 내 주사 PHP. 가장 일반적인 방법은 같은 기능을 사용하는 addslashes()인 mysql_real_escape_string().
 

addslashes()

 

addslashes() 데이터베이스 쿼리에서 소독 할 필요가 문자 앞에 백 슬래시로 문자열을 반환합니다. 이 문자는 작은 따옴표입니다 (‘ = ’) 따옴표 (” = ”) 그리고 널 바이트에게 (%00 = \0).
 

addslashes() 쿼리 문자열을 따옴표로 감싸 경우에만 작동합니다. 다음과 같은 문자열은 여전히​​ SQL 인젝션에 취약 할 것이다:
 

1
2
3
$USER_NAME = addslashes( $_POST[ '사용자 이름' ] );
$암호  = addslashes( $_POST[ '비밀번호' ] );
$질문 = "FIRST_NAME을 선택, LAST_NAME, users_table WHERE 이름 = 'FROM ACCOUNT_NUMBER$USER_NAME'AND 암호 ='$암호' ";

인 mysql_real_escape_string()

 

인 mysql_real_escape_string() 보다 조금 더 강력하다 addslashes() 그것은 MySQL의의 라이브러리 함수 호출로 인 mysql_real_escape_string, 다음의 문자에 백 슬래시를 붙인다하는: \x00에서, \N, \R, \, ', ” 및 X1A.
 

와 마찬가지로 addslashes(), 인 mysql_real_escape_string() 쿼리 문자열을 따옴표로 감싸 경우에만 작동합니다. 다음과 같은 문자열은 여전히​​ SQL 인젝션에 취약 할 것이다:
 

1
2
3
$USER_NAME = 인 mysql_real_escape_string( $_POST[ '사용자 이름' ] );
$암호  = 인 mysql_real_escape_string( $_POST[ '비밀번호' ] );
$질문 = "FIRST_NAME을 선택, LAST_NAME, users_table WHERE 이름 = 'FROM ACCOUNT_NUMBER$USER_NAME'AND 암호 ='$암호' ";

 

sprintf를()

 

sprintf를() 동적 인수는 처리 할 수​​ 가정 해 방식으로 처리 될 수 있도록 변환 사양을 사용할 수 있습니다. 예를 들면, 사용자 ID 번호의 호출은 문자열 인 경우, %의 인수가 문자열로 처리하기 위해 사용된다. 다음과 같이 이것의 예는:
 

1
2
3
$USER_NAME = $_POST[ '사용자 이름' ];
$암호  = $_POST[ '비밀번호' ];
$질문 = sprintf를("FIRST_NAME을 선택, LAST_NAME, users_table WHERE 이름 = 'FROM ACCOUNT_NUMBER%의'AND 암호 ='%의' ", $USER_NAME, $암호);

 

을 htmlentities($했다, ENT_QUOTES)

 

을 htmlentities() 두번째에 위치하는 선택적인 quote_style 인자와 함께, 수의 사용 ENT_QUOTES, 따옴표와 큰 따옴표 둘 다 변환되는. 이 같은 의미로 작동합니다 addslashes()인 mysql_real_escape_string() 따옴표에 관해서, 그러나, 대신 백 슬래시를 앞에의, 그것은 인용 부호 HTML 엔티티를 사용합니다.
 

사용에 추가 ENT_QUOTES 이내 을 htmlentities(), 세 번째 매개 변수는 변환에서 설정 한 문자의 사용을 강제하는 설정할 수 있습니다. 이 사용하는 예상치 못한 결과를 중지하는 데 도움이됩니다 멀티 바이트 문자의 문자는 다음과 같은 설정 BIG5GPK.
 

다음은 방지하기 위해 도움이 될 코드의 예입니다 SQL 인젝션 PHP에서.
 

1
2
3
4
5
$USER_NAME = $_POST[ '사용자 이름' ];
$USER_NAME = 을 htmlentities( $USER_NAME, ENT_QUOTES, 'UTF-8' );
$암호  = $_POST[ '비밀번호' ];
$암호  = 을 htmlentities( $암호, ENT_QUOTES, 'UTF-8' );
$질문 = "FIRST_NAME을 선택, LAST_NAME, users_table WHERE 이름 = 'FROM ACCOUNT_NUMBER$USER_NAME'AND 암호 ='$암호' ";

 

최적화 SQL 코드

 

데이터베이스 서버는 복잡한 짐승 그들은 당신이 필요로하는 것보다 훨씬 더 많은 기능을 가지고. 보안이 관련된만큼, 더 나은 결코. 예를 들면, the xp_cmdshell을 에 확장 저장 프로 시저 MS의 SQL 쉘에 대한 액세스를 제공하고 이것은 단지 어떤 해커의 꿈입니다. 이 절차 및 기타 기능을 사용하지 않도록 설정해야하는 이유입니다, 쉽게 오용 될 수있는. 당신이없이 할 수있는 기능을 바로 제거하거나 적어도 해제.
 

기본 SQL 오류 메시지를 사용하지 않도록 설정

 

그들은 데이터베이스와 SQL 쿼리에 대한 추가 정보를 제공하기 때문에 에러 메시지는 공격자에게 유용한. 모든 SQL 공격은 일반적으로 SQL에서 발행 한 오류의 유형을 기반으로, 그것은 오류의 유형은 웹 사이트 나 응용 프로그램을 해킹 해커의 접근을 결정 의미. 보안을 손상하지 않는 더 나은 솔루션을 표시하는 것 일반 오류 메시지 단순히 오류가 발생했습니다 알리는.
 

안전하게 데이터베이스 자격 증명을 저장

 

의 경우 피해를 최소화하기 위해 SQL 주입 공격, 항상 별도의 암호화 된 파일에서 데이터베이스 자격 증명을 저장. 해커의 침입을 관리하는 기업도, 그는 데이터베이스에 많은 작업을 수행 할 수 없기 때문에 그 또는 그녀는 많은 도움이되지 않습니다.
 

최소 권한 원리를 사용하여

 

최소 권한의 원칙은 매우 유용하고 적용 SQL 주입 뿐만 아니라. 항상 생각하거나 무엇에 대해 두 번 확인 권한 당신은에 제공하는 사용자 또는 대상. 당신은 어떤 사용자에게 사회자 액세스를 제공하는 병약 한 가정, 이렇게 단지 그에게 그 / 그녀가 필요로하는 테이블의 액세스를 제공합니다, 오히려 그에게 전체 데이터베이스의 접근을 증명보다. 당신은 시스템에 대한 액세스를 제공해야하는 경우, 에 그것의 더 나은 데이터베이스 내에서 분할 된 테이블 공간을 작성하고 특정 테이블 스페이스에 대한 액세스를 제공합니다. 이 기술은 것 과감하게 공격 표면을 감소.
 

쉘을 사용하지 않도록 설정

 

많은 데이터베이스는 쉘 액세스를 제공 본질적으로 무엇을 공격 자나 해커가 요구되는 데이터베이스에. 이 때문에이 열려있는 허점을 닫을 필요. 모든 서비스 제공 업체는 다른 방법이 있습니다 쉘의 실행을 비활성화 자신의 데이터베이스에. 그래서 특정 데이터베이스 또는 테이블 스페이스 또는 특정 테이블에 대한 쉘 액세스를 사용하지 않도록 설정하는 방법에 대해 데이터베이스 설명서를 참조.
 

취약점을 확인하는 SQL 주입 도구를 사용하여

 

아니지만 적어도 마지막으로, 해커처럼 생각. 어떻게 해커를 통해 내 데이터베이스를 해킹 할 수 SQL 인젝션, 그 허점을 찾는 데 사용할 수있는 도구 및 기술. 당신은 항상 같은 SQL 인젝션 해킹 도구의 드라이 런이 있어야합니다 SQLI, Haviz, SQL injectme 기타. 당신은 그 망막 취약점 스캐너를 감당할 수있는 더 많은 경우는 너무 좋은. 그것은 모든 최신 노출 된 취약점의 구성으로.

정말 감사합니다. 난 당신이 모두 즐길 있어야 희망. 우리가 더 잘 할 수 있도록 의견을주세요.

 
 

28,916 전체보기, 15 조회 수 오늘

다음 두 개의 탭은 아래 내용을 변경.

Ashfaq 안사

보안 연구원
아슈 파크 안사리는의 창시자이다 HackSys 팀 코드 이름 "표범". 그는 정보 보안의 다양한 측면에 경험을 가진 보안 연구원입니다. 그는 저술 "HackSys 익스트림 취약 드라이버" 과 "죽음의 쉘 코드". 그는 또한 작성 및 낮은 수준의 소프트웨어 개발에 대한 다양한 백서를 발표했다. 그의 핵심 관심에있다 "낮은 수준의 착취", "리버스 엔지니어링", "프로그램 분석" 과 "하이브리드 퍼징". 그는 인공 지능과 기계 학습의 팬보이입니다. 그는의 장 리드입니다 널 푸네.

회신을 남겨주

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드는 표시됩니다 *