"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > SQL Injection을 우회 할 수 있습니까?`mysql_real_escape_string ()``문자 인코딩 문제로 인해`가 있습니까?

SQL Injection을 우회 할 수 있습니까?`mysql_real_escape_string ()``문자 인코딩 문제로 인해`가 있습니까?

2025-02-20에 게시되었습니다
검색:504

Can SQL Injection Bypass `mysql_real_escape_string()` Due to Character Encoding Issues?

mysql_real_escape_string () 함수는 SQL 주입을 방지하지만 특정 경우에 우회 될 수 있습니다. 다음 php 코드를 고려하십시오 :

$ login = mysql_real_escape_string (getfrompost ( 'login')); $ password = mysql_real_escape_string (getfrompost ( 'password')); $ sql = "login = '$ login'및 password = '$ password'";

이 코드는 안전 해 보이지만 문자 세트 인코딩의 가장자리 케이스로 인해 악용 될 수 있습니다.

$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));

$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";

공격은 다음 단계에 따라 다릅니다.

문자 세트 세트 :

동일한 바이트 시퀀스가 ​​비 ASCII 문자와 ASCII 백 슬래시 ( '\')를 나타내는 인코딩 (예 : GBK)을 선택합니다.

    페이로드를 구성하십시오.
  1. call
  2. mysql_real_escape_string ()
  3. : 클라이언트는 연결이 다른 문자 세트 (예 : latin1)를 사용한다고 생각합니다. 따옴표 전에 백 슬래시를 삽입하여 구문 적으로 유효한 문자열을 만듭니다.
  4. 쿼리 제출 : 탈출 된 페이로드는 SQL 문의 일부가되어 공격자가 예상되는 보호를 우회 할 수 있습니다. 작업 원리 :
  5. 핵심 문제는 서버에서 기대하는 문자가 클라이언트가 고려한 문자와 일치하지 않는다는 것입니다. mysql_real_escape_string () 는 클라이언트가 설정 한 연결 인코딩을 기반으로 탈출하지만 경우에 따라
  6. set 이름
를 포함하여 유효하지 않은 멀티 바이트 문자를

대신 mysql_set_charset () case.

의 결과로 : 이 공격은 시뮬레이션 된 전처리 명령문이 비활성화 된 경우에도 PDO의 시뮬레이션 전처리 명세서를 우회 할 수 있습니다.

치료:

UTF8MB4 또는 UTF8과 같은 비 유명한 문자 세트를 사용 하여이 문제를 완화합니다. no_backslash_escapes sql 모드를 활성화합니다.

안전 예 :

항상

mysql_set_charset ()

또는 pdo의 dsn 문자 세트 매개 변수를 사용하여 문자 세트를 올바르게 설정합니다. MySQLI의 실제 전처리 진술 도이 공격에 면역이됩니다.

결론에서 :

mysql_real_escape_string () 는 일반적으로 강력한 보호 기능을 제공하지만 SQL 주입에 대한 완전한 방어를 보장하기 위해 이러한 잠재적 에지 사례를 인식하는 것이 중요합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3