오늘 우리 서버에 이상한 문제가 나타났습니다. 우리는 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 메서드는 그것을합니까?
'%'와'_'는'비교 '의 문맥에서 단지 특수 문자입니다. 따라서 대답은 간단합니다 :'str_replace (array ('%', '_'), array ('\\ %', '\ _'), $ str)'$ str'을 데이터베이스에 전달하기 전에 'LIKE' 비교에서 사용하기 위해. 예를 들어 다른 비교 연산자에 삽입하거나 사용하면 어쨌든 위험하지 않습니다. 사실이 문제가 실제로 발생합니까? 나는 MySQL이 하나 이상의'%'시퀀스를 하나의'% '로 연속적으로 처리 할 것이라고 생각했을 것이다. – DaveRandom
예 우리는 그 위에 URL을 가진 DDOS를 가지고 있었기 때문에 그것이 매우 중요합니다. 나는 그것을 개인적으로 추적했다 – holms
예. 그러나 그것은 실제로 어떤 효과가 있었습니까? MySQL 또는 웹 서버 프로세스에만 영향을 줍니까? DDoS 공격의 최악의 결과는 무엇입니까? – DaveRandom