https://github.com/php/php-src/issues/19777
며칠전 PHP 저장소를 살펴보다가 이슈하나가 눈에띄더군요.
이 링크의 글인데요.
결론은 어느 해킹 대회가 열렸는데 PDO 파서의 취약점을 이용하여 바인딩 쿼리를 사용해도 우회점이 있었다는 겁니다.
내용:
실제로 PDO는 기본적으로 MySQL의 모든 준비된 명령문을 에뮬레이션합니다 .
PDO::ATTR_EMULATE_PREPARES 이건 true 가 기본값이라 false 로 지정해야합니다.
SELECT $col FROM fruit WHERE name = ? 이라는 쿼리가 있을때
SELECT `?\0` FROM fruit WHERE name = ? 같이 컬럼 변수에 \0 이라는 널바이트문자열이 들어가면
PDO 의 준비된 명령문 파서의 취약점으로 인해 값이 주입됩니다.
SELECT `?#\0` FROM fruit WHERE name = ? 이렇게 되다가
SELECT `'x'#\0` FROM fruit WHERE name = ? x 가 들어가게되고
PDO 에뮬레이션 활성화 이후 최종 결과
SELECT `'x`;#'#\0` FROM fruit WHERE name = ?
/* SELECT `'x`; 와 동일 */ 결국 where 구문은 사라지게되죠.
조치요약:
1. ATTR_EMULATE_PREPARES 끄기 <- 기본값이 true 이고 제일 문제되는 취약점.
2. 쿼리에 들어갈 입력값들 \0, \x00 등 널바이트 체크 하기
ATTR_EMULATE_PREPARES 이거 false 로 지정하면 코드 바꿔야할점들은
on duplicate key 가 있는 쿼리에서 같은 매개변수로 지정할수없고
이름을 다르게 해서 넣어야되네요.
PHP 업데이트하고 ATTR_EMULATE_PREPARES도 꺼야겠습니다.
확인해보니 Medoo 라는 DB 라이브러리 쓰는데 이거 못끄게 되어있어서 삭제해야겠어요. ㅠ