[Spring] Mybatis 로 SQL Injection Test
스프링부트-마이바티스 SQL INJECTION TEST 결과 공유
테스트
2019-11-28 02:23:52.185 DEBUG 3317 --- [p-nio-80-exec-3] c.c.c.b.m.d.t.TestUsrAdmAMapper.insert : ==> Preparing: INSERT INTO test_usr_adm_a ( adm_id, adm_nm, adm_hp ) VALUES ( ?, 'TEST?', '0000' )
2019-11-28 02:23:52.191 DEBUG 3317 --- [p-nio-80-exec-3] c.c.c.b.m.d.t.TestUsrAdmAMapper.insert : ==> Parameters: aaaa(String)
2019-11-28 02:23:52.200 DEBUG 3317 --- [p-nio-80-exec-3] c.c.c.b.m.d.t.TestUsrAdmAMapper.insert : <== Updates: 1
2019-11-28 02:23:52.200 DEBUG 3317 --- [p-nio-80-exec-3] c.c.c.b.m.d.tes.TestUsrAdmAMapper.read : ==> Preparing: SELECT adm_id, adm_nm, adm_hp FROM test_usr_adm_a WHERE adm_nm = ? AND adm_id=?
2019-11-28 02:23:52.200 DEBUG 3317 --- [p-nio-80-exec-3] c.c.c.b.m.d.tes.TestUsrAdmAMapper.read : ==> Parameters: "" OR 1=1 --(String), aaaa(String)
2019-11-28 02:23:52.206 DEBUG 3317 --- [p-nio-80-exec-3] c.c.c.b.m.d.tes.TestUsrAdmAMapper.read : <== Total: 0
결론
SQL Injection을 위하여 "" OR 1=1 --
를 넣어 모든 사용자 정보를 가져오려고 하였으나 PreparedStatement로 작동하는 mybatis의 #{}
을 통한 데이터 바인딩 사용으로 인해 "" OR 1=1 --
가 문자열 처리가 되어 쿼리 무력화가 되지 않았다.
관련된 내용을 찾던 중 SK인포섹의 글을 발견하였다.
SQL인젝션 - Prepared Statement를 쓰면 SQL 인젝션 공격이 되지 않는 이유는?
해당 링크의 결론은 다음과 같다.
Prepared Statement에서 바인딩 변수를 사용하였을 때, 쿼리의 문법 처리 과정이 미리 선 수행되기 대문에 바인딩 데이터는 SQL 문법적인 의미를 가질 수 없습니다. 따라서 Prepared Statement를 사용하면SQL 인젝션 공격에 안전하게 구현할 수 있습니다.
다만, Mybatis에서는 ${}
을 통해서도 데이터 바인딩이 가능하나 prepared statment로 동작하지 않아 sql injection에 취약할 수 있다.
또한 xss 에 대하여 확인하려고 <script> </script>
데이터를 넣었으나 해당 데이터 <와 같은 변환은 진행되지 않으므로 별도의 필터 적용이 필요할 것으로 보인다.
현재 제작되어 있는 것으로는 네이버에서 제공하는 lucy 라는 오픈소스가 있다. Lucy XSS Filter
references :
SQL인젝션 - Prepared Statement를 쓰면 SQL 인젝션 공격이 되지 않는 이유는?
Leave a comment