채택완료

SQL문에서 union 처리...

2014-12-30 (화) 14:35:48 4,174

common.lib.php 파일에 sql_query함수를 보면

Copy
$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개 / 댓글 1개

채택된 답변
+20 포인트

저방법도 괜찮겠습니다만 테이블명에 union이 들어가는경우(예: bo_table=union) 서브쿼리가 있는 경우에 다시 문제가 생기겠군요.

union조인을 하려면 어쨌든 union 키워드 앞뒤로 공백이 들어가야 할테니 아래처럼 하는건 어떨까요.

$sql = preg_replace("#^select.*from.*\sunion\s.*#i", "select 1", $sql);

 

저도 보안헛점에 대해서는 자신이 없네요. 아무래도 버그레포팅을 해두시는게 좋을듯 합니다.

답변에 대한 댓글 1개

답변 감사합니다. 새해복 많이 받으세요.

답변을 작성하려면 로그인이 필요합니다.