특정 상황에서 mysql_real_escape_string()
를 우회하는 SQL 인젝션
mysql_real_escape_string()
은 일반적으로 SQL 주입 취약점을 제거한다고 여겨지지만 일부 특수한 경우에는 여전히 우회될 수 있습니다.
취약점 분석
특정 시나리오에서 공격자는 데이터베이스 연결의 문자 집합이 ASCII 문자'와 '(예: gbk, sjks)를 모두 지원하도록 선택할 때 발생하는 mysql_real_escape_string()
의 결함을 악용할 수 있습니다.
공격자는 잘못된 멀티바이트 문자 시퀀스(예: xbfx27)가 포함된 페이로드를 구성할 수 있으며, mysql_real_escape_string()
을 통해 처리하면 이스케이프되지 않은 ' 문자가 생성됩니다. 따라서 쿼리에 삽입하면 SQL 삽입이 발생합니다.
예
다음 PHP 코드를 고려해보세요.
<code class="language-php">$login = mysql_real_escape_string($_POST['login']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";</code>
공격자가 $_POST['login']
의 값을 \xbf\x27 OR 1=1 /*
로 설정하면 mysql_real_escape_string()
의 보호를 우회하여 테이블의 모든 행을 검색할 수 있습니다.
완화 조치
이 취약점을 완화하려면 다음을 수행하세요.
mysql_set_charset()
또는 PDO의 DSN 문자 집합 매개 변수를 사용하여 데이터베이스 연결의 문자 집합을 명시적으로 설정하세요. 위 내용은 특정 문자 세트 조건에서 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!