728x90

말그대로 SQL 를 실행하기 위한 select ,insert ,delete , update 등 쿼리가 나갈때 해커님께서 영혼없는 개발자들이 작성한 코드들의 틈새를 노려 정보를 빼돌리거나 등 자신의 목적에 도달하게 하는 방식이다.
나무위키의 정의를 인용하면...


주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다. 공격의 쉬운 난이도에 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다. 이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다. 보안회사 Imperva가 2012년에 발표한 보고서에 따르면 월평균 4회가량의 SQL 인젝션 공격이 일어난다고 한다. OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되었던 만큼 보안에 각별한 주의가 필요하다.


아주 기본적? 인 수법을 알아보자

SELECT * FROM USERS WHERE ID = ''or 1=1--' and PW = '암호가뭐게?계?'

해커가
'or 1=1-- 입력
where id = ' ' 로 쿼리가 변경 될것이고
1=1 는 항상 true (참)이고 or 때문에 둘중 하나가 true이면 무조건 ture
-- 는 우리가 잘 아는 sql 주석 처리 표기 법이니
비밀번호 and PW = ' 암호가뭐게?계?' 까지는 그냥 무시된다.

즉 비번없이도 우리집에 들어와서 내 정보를 다 가져라! 라고 하는 식.

mybatis 에서 where 1=1 를 쓰지 말고 ${paramater} 대신 #{paramater}를 쓰는 이유도 이런 나쁜짓 하는 놈들을 무효화? 시키기 위해서이다.
내가 작성했던 지난 글들을 읽어보면 도움될지도 모른다.
https://rainsister.tistory.com/69

Mybatis 항상 헷갈렸던 ${} vs #{} 를 너의 머리속에 심어줄게!

선배한테 물어보면 10명중 8명은 아래와 같이 설명해 줄꺼다! 선배1 : #{} 은 보안에 좋고 ${} 보안엔 안좋고...그래서 보안에 좋은 #{} 를 써고 ${}은 쓰지말라고 선배2 : innjection 어쩌고 저쩌고... 뭐

rainsister.tistory.com

https://rainsister.tistory.com/68

mybtis 에서 where 1=1 ? 그냥 쓰지마!

소스 점검 하다가 아래와 같은 코드를 봤다. //... 생략 FROM TOMS_CO_M CM ) T1 WHERE 1 = 1 AND CORP_CD = #{param.srchCorpCd} AND CO_CRT_DTM BETWEEN TO_DATE(#{param.srchCoCrtDtmFr}, 'yyyyMMdd') AND TO_DATE('99991231', 'yyyyMMdd') 참 성의

rainsister.tistory.com

+ Recent posts