SQL문에서 union 처리...
본문
common.lib.php 파일에 sql_query함수를 보면
$sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql);
위처럼 union의 사용을 허락하지 않습니다.
그런데, union 이라는 회사, 혹은 제품명이 들어가는 쿼리를 실행할 경우...문제가 되네요...
제품명이 unionpay001 이라고 할 경우도 쿼리가 실행이 되지 않습니다.
그렇다면...정규식을 수정해서 select from union까지 체크하는것을 select.*from.*union.*select.* 이런식으로
처리하면 union이라는 쿼리를 실행하게 되지만...보안상 헛점이 생길까요...?
어차피 union이라는 키워드를 삽입해서 공격할 것이라면 select가 뒤에 반드시 와야 겠죠?
그러니깐 union뒤에 select가 없으면 쿼리를 통과시켜도 괜찮을까요?
!-->답변 1
저방법도 괜찮겠습니다만 테이블명에 union이 들어가는경우(예: bo_table=union) 서브쿼리가 있는 경우에 다시 문제가 생기겠군요.
union조인을 하려면 어쨌든 union 키워드 앞뒤로 공백이 들어가야 할테니 아래처럼 하는건 어떨까요.
$sql = preg_replace("#^select.*from.*\sunion\s.*#i", "select 1", $sql);
저도 보안헛점에 대해서는 자신이 없네요. 아무래도 버그레포팅을 해두시는게 좋을듯 합니다.
답변을 작성하시기 전에 로그인 해주세요.