graylobo
527
2021-07-08 13:29:27
6
198

Sql Injection 을 방어하기위한 Parameterized Query에 대한 궁금증


해커들의 백도어 SQL Injection - C# 프로그래밍 배우기 (Learn C# Programming) (csharpstudy.com)

위 글을 예로 들면


sql injection 을 시도하는 쿼리 (위에서 injectionQuery)를 일반 sql 문(위에서 sql)에 사용시

개발자가 의도치않은 작업을 수행하게끔 공격자가 치환코드를 주입하게 되는데 이를

parameterized Query로 (위에서 parameterizedSql) 개선하면 방어할수있다는 건 알겠는데요,

이게 어떤 원리로 방어가 되는건지 정확히 이해가 안되어서요 

클라이언트앱 코드상에서 

author=' " + injectionQuery + " ' 를

author=@author 으로 바꾼다해도 어차피 최종적으로 서버가 이해하려면 

@author 에 대입한 값이 치환돼야 할텐데

@author에 injectionQuery의 값이 들어가게되면

서버측에서 해석될때는 동일하게 해석되는게 아닌가요?



0
  • 답변 6

  • 오후
    3k
    2021-07-08 13:44:36

    author=' " + injectionQuery + " ' 

    >>   ~~~~~ author='Albert'; update Book set title='getcha' .....;   

    >> select 문 종료후 update 문(추가적 sql) 동작



    author=@author

    >>   ~~~~~ author='Albert\'\; update Book set title=\'getcha\' .....;   

    하나의 값으로(변수형에맞게) 바인딩


  • woo.s.o
    521
    2021-07-08 13:55:28 작성 2021-07-08 14:13:13 수정됨

    한가지 예를 들지요 

    인젝션 공격으로 injectionQuery 에 ' OR 1=1 --을 넣게 된다면


    SELECT * FROM Book WHERE auth='' OR 1=1 --


    전체 출력이 되버리는 거죠(--는 주석문으로 뒤에 오는 문자열 다 무시 하게 됩니다)

    해당 값이 의도와 다르게 나오게 되겠죠?


    Prepared Statement 경우 DBMS에서 들어오는 값에 대해 문자열로 인식하기 때문에 의미 없게 되버 립니다.

    ' OR 1=1 --이 들어오더라도 '' OR 1=1 --' 이렇게 문자열로 한번 더 감아 버리게 되는 거죠

    SELECT * FROM Book WHERE auth='' OR 1=1 --' 혹은 

    SELECT * FROM Book WHERE auth="' OR 1=1 --" 일겁니다.

    위 처럼 되면  싱글 쿼터 때문에  SQL Syntax가 나게 될테고 아래라면 더블쿼터로 문자로 인식 해서 데이터가 아무것도 안나오겠죠


  • graylobo
    527
    2021-07-08 14:39:45

    @author에 대입한 값이 서버가 받아들일땐  문자열로 한번더 감싸줘서 들어온다면

    sql injection 쿼리가 아닌 정상쿼리도 문자열로 한번더 감싸주게되므로 문법 오류가 발생되는게 아닌가요?


    만약 SELECT * FROM Book WHERE author=@author 일때

    @author에 david 이라는 값을 사용자로부터 받으면 

    SELECT * FROM Book WHERE author='david' 으로 받아야 되는걸

    SELECT * FROM Book WHERE author=\''david'\' 으로 최종 해석하게될텐데

    이렇게되면 syntax 에러가 나게되는거 아닌가요?


  • 오후
    3k
    2021-07-08 14:57:20

    ' " ; 등을 escape 처리된 하나의 문자열로 받아들인다고 생각하시면됩니다.

  • woo.s.o
    521
    2021-07-09 09:35:10

    더블쿼터,싱글쿼터에 대해 설명하다 보니 약간 설명이 부족하여 오해의 소지가 있었네요

    위의 분이 설명 드린것 처럼 특수문자에 해당하는 부분을 전부 문자열로 인식하여 쿼리문 조작을 못하도록 합니다

    " ' " + injectionQuery  +" ' " 엔 싱글 쿼터로 해당 문법을 조작 가능 하지만

    아래 author=@author의 경우는 문자열에 대한 표시가 없고 @author 자체를 문자열로 만들기에 어떠한 문자라도 다 문자열화 하는거죠

  • graylobo
    527
    2021-07-09 09:51:11 작성 2021-07-09 10:16:04 수정됨

    SELECT * FROM Book WHERE author=@author 일때

    사용자가 @author에 Albert을 넣으면

    서버에서는 SELECT * FROM Book WHERE author='Albert'  이렇게 해석하고


    @author에 injectionQuery("Albert'; update Book set title='getcha') 를 넣으면

    SELECT * FROM Book WHERE author='Albert\'\; update Book set title=\'getcha\'

    이런식으로 뒤에 update문이 붙더라도 서버에서는 하나의 Select문으로 해석하게돼서  공격을 방어한다는것 같네요

    (Parameterized Query 사용 안할시 
    SELECT * FROM Book WHERE author='Albert; update Book set title='getcha' 로
    Select문 종료후 Update문 수행하게 됨)


    답변주신 분들께 감사드립니다

  • 로그인을 하시면 답변을 등록할 수 있습니다.