php mysql에서 addslashes를 이용해서 인젝션을 차단하고 있거나,

euc-kr을 utf-8로 변환을 하는 작업이 있을경우, 멀티바이트를 이용해서 우회가 가능합니다.

두가지 케이스 모두 솔루션은 같으므로, 한번에 설명하겠습니다.


addslashes는 입력스트링 중에 quote(') 가 있다면 앞에 \를 붙여줌으로써, " \' " 로 변환됩니다.

그래서, quote를 소용없게 만드는것이죠.


하지만, 멀티바이트로 보내면 소용이 없습니다.


예를 들어 url encoding 구문으로 %bf%27을 보낸다면, (%27이 quote입니다.)

%bf%5C%27 로 변하게 되고. (%5C가 \ 입니다.)

결국, %bf%5C 가 한글자로 읽히게 됩니다. (유니코드이기 때문에.)

그리고 %27이 \의 간섭을 안받고 자유가 됨으로써, sql injection이 가능합니다.

posted by tunz
  • 2013.09.02 16:43

    비밀댓글입니다

    • tunz 2013.09.03 00:18 신고

      꼭 GET방식이 아니라도, POST 방식에서도 똑같은 방법으로 공격이 가능합니다.
      왜 잘 안되는지는 직접 봐야 알것같네요.

  • 초보 2013.11.18 14:48

    euc-kr을 utf-8로 변환을 하는 작업이 있을때만 공격 가능 하나요?
    잘 이해가 되질 않아서요. 만약에 어떤 게시판 검색 란에 '를 입력을 했을시 치환이 \' 으로 변환이 된다면 공격 가능한 구간이 될 것으로 판단이 되는데요..euc-kr을 utf-8로 변환을 하는 작업이라는 말이 잘 이해가 안가네요 ㅠ

    • tunz 2013.11.27 13:15 신고

      그게 넘어갈때는 single byte로 넘어갔다가,
      예를들어, %bf와 %27이 각각 다른 문자로 넘어가는 거죠.
      그리고나서, 매직쿼트 처리가 되고나서 멀티바이트로 읽히면, 공격이 가능합니다
      이때는 %bf%27이 한글자인데, 중간에 %5c가 껴버려서 %bf%5c까지 한글자가 되는거죠.