2012-07-25 3 views
0

오늘 우리 서버에 이상한 문제가 나타났습니다. 우리는 GET 요청을 성공적으로 통과 한 mysql 쿼리에서 % 및 _ 기호로 DDOS를 얻었습니다. 예 :cakephp 이스케이프 함수 또는 mysql_real_escape_string이 안전하지 않습니까?

domain.com/search/%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25v%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25a 

cakephp는 필터하지 않는 것으로 보입니까? official mysql guide에 그들은이 문제에 관해 많이 씁니다. 그것은 그들이이 문제를 해결하는 증명 방법은 다음과 같습니다

addcslashes(mysql_real_escape_string(“%something_”), “%_”); 

CakePHP는 프레임 워크 모델에서 모든 곳에서 사용되는 기능 escape()있다. 무엇 MySQL의 특수 문자를 이스케이프에 대해이 같은

/** 
* Returns a quoted and escaped string of $data for use in an SQL statement. 
* 
* @param string $data String to be prepared for use in an SQL statement 
* @param string $column The column into which this data will be inserted 
* @param boolean $safe Whether or not numeric data should be handled automagically if no column data is provided 
* @return string Quoted and escaped data 
*/ 
    function value($data, $column = null, $safe = false) { 
     $parent = parent::value($data, $column, $safe); 

     if ($parent != null) { 
      return $parent; 
     } 
     if ($data === null || (is_array($data) && empty($data))) { 
      return 'NULL'; 
     } 
     if ($data === '' && $column !== 'integer' && $column !== 'float' && $column !== 'boolean') { 
      return "''"; 
     } 
     if (empty($column)) { 
      $column = $this->introspectType($data); 
     } 

     switch ($column) { 
      case 'boolean': 
       return $this->boolean((bool)$data); 
      break; 
      case 'integer' : 
      case 'float' : 
      case null : 
       if ($data === '') { 
        return 'NULL'; 
       } 
       if (is_float($data)) {                            
        return str_replace(',', '.', strval($data)); 
       } 
       if ((is_int($data) || is_float($data) || $data === '0') || (
        is_numeric($data) && strpos($data, ',') === false && 
        $data[0] != '0' && strpos($data, 'e') === false)) { 
         return $data; 
        } 
      default: 
       $data = "'" . mysqli_real_escape_string($this->connection, $data) . "'"; 
      break; 
     } 

     return $data; 
    } 

단지 기본적인 보호 전년도 몇 가지 변수 유형과 물건 ...을 ?? : 그것은 포함 된 내용을 보면 약 1 년 전 나는 mysql query =에서 백분율 기호의 도움으로 인용 부호를 벗어날 수있는 방법을 읽었습니다. 그 당시에는 블라인드 주사의 과장이었습니다. 그리고 그 트릭은 모두가 mysqli_real_escape_string을 사용하기 때문에 거의 모든 곳에서 효과가있었습니다.

여기에 질문을 올려야합니다 : cakephp에서 변수를 벗어나는 방법 - 정말요?

업데이트 : IRC의 일부 사람들은 요청 문자열을 이스케이프 처리하고 자체 쿼리하지 말아야한다고 말합니다. 그들은 아마 맞아, 그럼 어떻게 % 및 _ 사용자 정의 함수를 사용하지 않고 GET 요청 문자열에있는 문자를 탈출 할 수 있습니다 .. 어떤 sanitize 메서드는 그것을합니까?

+0

'%'와'_'는'비교 '의 문맥에서 단지 특수 문자입니다. 따라서 대답은 간단합니다 :'str_replace (array ('%', '_'), array ('\\ %', '\ _'), $ str)'$ str'을 데이터베이스에 전달하기 전에 'LIKE' 비교에서 사용하기 위해. 예를 들어 다른 비교 연산자에 삽입하거나 사용하면 어쨌든 위험하지 않습니다. 사실이 문제가 실제로 발생합니까? 나는 MySQL이 하나 이상의'%'시퀀스를 하나의'% '로 연속적으로 처리 할 것이라고 생각했을 것이다. – DaveRandom

+0

예 우리는 그 위에 URL을 가진 DDOS를 가지고 있었기 때문에 그것이 매우 중요합니다. 나는 그것을 개인적으로 추적했다 – holms

+1

예. 그러나 그것은 실제로 어떤 효과가 있었습니까? MySQL 또는 웹 서버 프로세스에만 영향을 줍니까? DDoS 공격의 최악의 결과는 무엇입니까? – DaveRandom

답변

1

이것은 Cake가 SQL 주입에 취약하다는 것을 의미하지는 않습니다. 이것은 CakePHP에서 LIKE 검색 쿼리를 사용한다는 것과 와일드 카드 문자를 사용하고 있다는 것을 의미합니다.

이상적인 행동이라고 생각하지 않습니다. 개발 중에도 이것을 발견 했으므로 지금은 LIKE을 사용하고 있습니다.

$term = str_replace('%', ' ', $term); 

자신의 손으로 도주 할 필요없이 프레임 워크가 처리합니다.

+0

잘 병목 현상은 아마도 GET 요청 문자열 일 수 있습니다. 그래서 어떤 사용자 정의 방법을 사용하고 싶지 않습니다. 질문을 업데이트했습니다. cakephp의 모든 메소드가 % 및 _ 기호를 요청 문자열에서 이스케이프 처리합니까? – holms

0

표시하려는 코드 예제는 안전합니다. 이 줄은

$data = "'" . mysqli_real_escape_string($this->connection, $data) . "'"; 

의 특수 문자를 이스케이프합니다. 메서드는 변수의 유형을 확인합니다. 문자열이 아닌 경우에는 이스케이프 할 필요가 없습니다.

mysql_real_escape_string()의 "취약점"에 대한 출처를 확인하는 것이 좋을 것입니다.

+1

'mysql_real_escape_string()'의 취약점은'SET NAMES' 쿼리를 실행할 때만 나타납니다.이 경우 libmysql이 이스케이프를 수행하는 동안 수행하는 문자 집합 평가는 연결 문자 집합이 변경 되었기 때문에 결함이 있지만 libmysql은 그것에 대해 알지 못하며 이스케이프 작업에서 이전 문자 집합을 계속 사용합니다. 그것 외에는 안전하고 문제는'SET NAMES' 대신에'mysql_set_charset()'을 사용함으로써 완전히 완화 될 수 있습니다. 예, 보안 구멍은 매우 작지만 여전히 구멍입니다. – DaveRandom

+0

@Juhana이 함수는 %와 _를 벗어나지 못합니다. 최근 param을 얻으려는 이유로 chars가 있기 때문에 최근에 DDOS가 있습니다. GET 문자열에서 필터링 할 수있는 간단한 함수를 요청하는 CAKEPHP 프레임 워크에서 요청합니다. 내 생각에이 문자들은 기본적으로 mysql_real_escape_string() (cakephp의 sanitazation 클래스에 의해 사용된다)으로 이스케이프되어야한다. – holms

+0

DDOS는 새 니타 이징과 아무 관련이 없다. 'LIKE'를 사용한다면, 문자들을 수동으로 이스케이프합니다. '% '또는'_'를 이스케이프하는 다른 곳에서는 아무런 효과가 없습니다. Cake는 자동적으로 그것들을 벗어날 수 없다. 그렇지 않으면'LIKE' 쿼리를 전혀 사용할 수 없다. – JJJ

관련 문제