대표적인 웹 애플리케이션의 보안 취약점. 한국인터넷진흥원에서 보안 약점 가이드를 볼 수 있게 해두었다. SQL Injection은 OWASP top10의 상위권에 있는 것을 볼 수 있다. 여기에서 봐야 할 건. 2017년도에 1위에 있던 injection 이 Cross-Site Scripting(XSS)와 합쳐져서 3위로 올라갔다. 둘 다 악의적인 외부 입력값에 의해서 보안 약점이 나타나는 특징이 있어서 묶은 것 같다. 입력 데이터를 검증는 부분을 테스트 하는 건 꼭 필요할 것 같다.
보안하기 위해 보통 외부의 입력이 쿼리문의 구조를 변경하지 못하도록 객체를 따로 설정해준다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final Pattern SpecialCharacters = Pattern.compile("['/'//-#()@;=*/+]");
UserInput = SpecialCharacters.matcher(UserInput).replaceAll("");
final String regex = "(union|select|from|where)";
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(UserInput);
if(matcher.find()) {
out.println("<script>alert('Block');</script>");
}
String query= "selecct * from ? where name = ?";
해당 인자값이 보이지 않도록 이렇게 코드를 짜는 것이 좋다. 인자를 따로 처리해서 쿼리문의 구조가 변경되는 것을 방지할 수 있다. 또한 XSS를 막기 위해서 외부의 입력값을 받고 검증을 수행하는 부분을 짜주는 것이 필요하다.
# 외부 입력값에 대해 검증
if ( outsideInput != null) {
outsideInput = outsideInput.replaceALL("<", "<");
outsideInput = outsideInput.replaceAll(">", ">");
outsideInput = ...
}
else {
return;
}
다음은 보안이 취약한 구조로 되어 있는 코드이다. 공격 시나리오는 OWASP를 참고했다. 보안 약점이 발생하는 코드의 예시인데 이 부분에서 바로 쿼리 실행하도록 돌리도록 만드는 경우에는 sql구문 조금만 조절하면 전부 볼 수 있음.
String query = "select * from" + tableName + "where name=" + name;
String query = "SELECT \* FROM accounts WHERE custID='" + request.getParameter("id") + "'";
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
공격시나리오 예시
http://example.com/app/accountView?id=' or '1'='1
참의 값이기 때문에 모든 레코드 값을 볼 수 있다. 여기에서 조금 더 수정하면 데이터 수정하거나 삭제 할 수 있다. 주석처리 방식이나 이런 저런 방식을 사용해서...
이런 방식을 막기 위해 매개변수, 헤더, URL, 쿠기, JSON, SOAP, XML 데이터 입력과 관련한 테스트가 권장 된다. 애플리케이션 보안 테스트 도구를 활용해서 주입 결함을 식별할 수 있다고 하는데 찾아보면 방법은 있을 것 같다.
'Programming' 카테고리의 다른 글
(오류) warning: mysql_num_rows(): supplied argument is not a valid mysql result resource (0) | 2022.04.23 |
---|---|
[java] 이클립스에서 워크스페이스 설정해도 프로젝트가 보이지 않을 때, Eclipse, Workspace, Package explorer (0) | 2022.04.23 |
(C 언어) 재귀 함수 (0) | 2022.03.25 |
(C언어) function (0) | 2022.03.24 |
(C언어) 포인터 (0) | 2022.03.24 |