오늘 SQL Injection 공격을 받았습니다.
그래서 최근 쿼리 로그를 확인해보니까
UPDATE TEST_TABLE SET colum = @1 WHERE colum =@2
와 같은 형식으로 들어왔습니다.
위와 같이 @1, @2 와 같은 형식으로 들어온거는 URL통한 Injection 공격방법인가요??
어디로 들어왔는지 확인을 해야지만 방어를 할수 있을거 같아서 질문합니다.
조언 부탁드립니다.
Comment 1
-
디비하는조씨
2017.06.27 11:23
바인딩 쿼리 인데 인젝션 여부와는 관련 없을듯 합니다.
(인젝션에서만 들어오거나 그렇게 들어올 수 밖에 없는것이 아님)
보통 동적쿼리 부분에서 많이 일어나고
어플리케이션에서 SP외에 에드훅 쿼리를 실행 가능할떄 많이 가능합니다.
방어 방법은 교과서 적인 이야기지만(현실에선 바꾸라 해도 안바꿈 ㅠㅠ)
어플리케이션에서 DB에 접근하는건 SP실행 권한만 주고
어플리케이션에선 실행할떄 모두 바인딩 해서 요청하게끔 작성해주면 90%는 막아냅니다.
SP내의 동적쿼리부분에서도 받아온 인자값이 문자열이고 쿼리 조합에 사용된다면
넘어올 수 있는 값을 검사하여 간접적으로 사용하도록 하는게 좋습니다.
EX)
CREATE PROC test @a varchar(1000)
AS
DECLARE @Query nvarchar(MAX) = 'select * from userinfo AS a WHERE a.username = ''' + @a + '''';
EXECUTE(@Query);
GO
위와 같은 프로시저가 있다면 인자로 다음처럼 넣는다면
EXEC test @a = 'bbb'' or '''' = ''';
다 털어가겟죠
하지만
CREATE PROC test @a varchar(1000)
AS
DECLARE @Query nvarchar(MAX) = 'select * FROM userinfo AS a WHERE a.username = ''' + CASE WHEN @a = 'aaa' THEN 'aaa' ELSE '' END + '''';
EXECUTE(@Query);
GO
이런식이라면? 위 쿼리가 정답도 아니고 말도 안되는 이야기지만(유저명을 어찌 다 알아!) 예를 들어 참고 하세요
(위 경우라면 일반 쿼리로 유저테이블에서 유저 조회하고 그 결과값을 동적쿼리에 이용한다거나...)
일단 동적 쿼리를 안쓰는게 젤 좋고 써도 방어코드를 꼭 넣으세요(클라로부터 넘어온 데이터는 모두 구라일 수 있어요)