>백엔드 개발 >PHP 튜토리얼 >문자 세트 조작을 사용하여 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?

문자 세트 조작을 사용하여 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-25 00:00:19195검색

Can SQL Injection Bypass `mysql_real_escape_string()` Using Character Set Manipulation?

mysql_real_escape_string()을 회피하는 SQL 주입

광범위하게 사용됨에도 불구하고 mysql_real_escape_string()은 SQL 주입 공격에 면역되지 않습니다.

공격

요구 사항: 데이터베이스 연결은 big5, cp932, gb2312, gbk 또는 sjis와 같은 취약한 문자 집합을 사용해야 합니다.

단계:

  1. 설정 인코딩: SET NAMES를 사용하여 서버 인코딩을 취약한 문자 집합으로 설정합니다.
  2. 페이로드 구성: 잘못된 멀티바이트 문자(예: 0xbf27)가 포함된 페이로드를 생성합니다. 취약한 문자 집합입니다.
  3. 다음을 사용하여 이스케이프하세요. mysql_real_escape_string(): mysql_real_escape_string()을 사용하여 페이로드를 이스케이프합니다. 그러면 초기 바이트(예: 0x27) 앞에 백슬래시가 삽입됩니다.
  4. 데이터베이스에 문의: 이스케이프된 페이로드를 쿼리.

결과: 클라이언트-서버 인코딩 불일치로 인해 쿼리에 이스케이프 처리되지 않은 작은따옴표가 포함되어 SQL 삽입이 성공했습니다.

못생긴

mysql_real_escape_string()의 버그: 이전에 MySQL 버전, 유효하지 않은 멀티바이트 문자는 클라이언트가 연결 인코딩을 알고 있었더라도 이스케이프 목적을 위해 단일 바이트로 처리되었습니다.

PDO 취약점: PDO의 에뮬레이트된 준비된 문은 mysql_real_escape_string을 사용하여 구성됩니다. () 따라서 이 공격에 취약합니다.

The Saving Grace

안전한 방법:

  • utf8 또는 latin1과 같은 취약하지 않은 문자 집합을 사용하세요.
  • 두 문자 집합 모두 올바르게 설정하세요. 클라이언트와 서버.
  • 에서 에뮬레이트된 준비된 문을 비활성화합니다. PDO.

위 내용은 문자 세트 조작을 사용하여 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.