취약점

Web Application 의 download 관련 모듈의 파라미터에 path traversal 문자열을 삽입하여 웹 루트 디렉토리의 상위 경로에 위치하는 OS파일 시스템까지 접근할 수 있으며, 이를 이용해서 시스템의 각종 중요 파일 및 웹 프로그램의 소스 코드를 다운로드할 수 있음. 예를 들어, 파일 요청 URL에 ../를 넣어 특정 디렉토리의 파일을 다운로드할 수 있다.

 

따라서, 입력값 필터링을 해주자!!

 

실습

웹서버 : 리눅스/ 172.30.1.53:8080

http://172.30.1.53:8080/downloadAction?file=../../../../../etc/passwd

◾ 다음과 같이 파일명을 변조하여 요청하자, 다운이 된것을 확인 할 수 있다.

 

◾ 열어보니 웹서버의 /etc/passwd 파일을 다운한 것을 확인할 수 있다.

서버의 중요 파일이 파일명 수정만으로 다운로드 되었다!!

 

 

보안조치

보안조치로서 3가지 방법이 있다.

 1)파일 다운로드 모듈 구현시 파일 경로를 처리하는 파라미터 변수에서 디렉토리 상위 경로를 의미하는 path traversal 문자열을 필터링하여 사용할 수 없도록 함(Path Traversal 문자열 : [..], [../], [..\])

 

 2)실제 파일 경로는 DB에 저장하도록 하고 사용자에게 노출되는 URL의 파라미터에는 인덱스 번호를 통해 다운로드 할 파일을 표시함으로서 사용자에게 조작을 시도할 수 있는 경로 정보가 노출되지 않도록 구현함

 

 3)다운로드를 허용할 디렉토리를 지정하여 해당 디렉토리를 벗어나는 위치의 다운로드 요청에 대해서는 경고메시지와 함께 다운로드를 금지하도록 함

 

여기서 1번 방법을 적용하도록하겠다!

상위 경로를 의미하는 path traversal 문자열을 필터링해주자

 

◾ 다운로드를 수행하는 자바 파일에 다음과 같이 추가해주는데

이것은 입력값을 검사하여 상위 경로 문자가 포함되어있다면 해당 요청을 거부한다.

...

String blockchar[] = {"..", "../", "..\\"};
		 
		 
		boolean checkResult = true;
		
		for(int i=0; i<blockchar.length;i++) {
			if( fileName.indexOf(blockchar[i]) != -1 ) checkResult = false;
		}
		
		if(checkResult == false) {
			response.setContentType("text/html; charset=UTF-8"); 
			PrintWriter script = response.getWriter();
			script.println("<script>alert('올바르지 않은 요청입니다.');");
			script.println("history.back()"); //location.href='http://127.0.0.1:8080'
			script.println("</script>");
			script.close();

			return ;
		}
...

 

결과

필터링에 의해 요청이 거부된 것을 볼수있다!

' > 보안 설정' 카테고리의 다른 글

[JSP] 9. 디렉토리 인덱싱  (0) 2020.12.27
[JSP] 7.URL 파라미터 조작  (0) 2020.09.09
[JSP] 2.SQL 인젝션  (0) 2020.09.08
[JSP] 1-1.Stored XSS 취약점  (0) 2020.09.08
[JSP] 보안 개발 가이드 개요  (0) 2020.09.05

취약점

웹 사이트는 DBMS와 연동하므로 웹 어플리케이션에서 사용자의 입력값을 통하여 데이터 트랜잭션이 발생함.

만일 사용자 입력값에 대한 유효성 검증이 누락될 경우,

악의적인 사용자는 정상적인 입력값 대신 SQL 쿼리문이 포함된 조작된 입력값을 전송하여 서버측 쿼리문의 구조를 변경할 수 있으며, 이를 통해서 사용자 인증을 우회하거나 데이터베이스의 정보를 유출시키고 서버의 시스템 명령어를 실행시킬 수도 있음.

 

 

실습

 

비밀번호를 다음과 같이 입력해준다

관리자로 로그인 성공!

 

 

공격원리

다음은 일반적으로 로그인을 처리하는 자바파일에 주요 SQL문장이다

"SELECT * FROM USER WHERE userID='아이디' AND userPassword='비밀번호' ";

아이디를 지목하고 해당하는 저장된 비밀번호와 입력값이 일치하는지를 검사한다

AND로 묶여있기때문에 만일 ID만 맞고 비밀번호를 틀리면 SQL은 False를 반환한다. 

 

 

SQL인젝션 공격의 핵심은 SQL문이 무조건 참이 되게하는 것이며 따라서 입력값을 다음과 같이 바꾸어주면 그만이다

"SELECT * FROM USER WHERE userID='admin' AND userPassword='' or 1# '";

' or 1#을 추가해주므로써 AND에 뒷 구문을 참으로 만들어주었다.

#은 주석처리를 의미(마지막 '를 지워주기 위함) 

 

 

 

 

보안조치

보안조치 방법으로 다음 2가지가 있으며 여기서는 2번째 방법을 적용한다.

(1) 소스코드 레벨에서 필터링 코드를 통한 SQL Injection 방어

: ' 또는 #과 같은 SQL관련 문자를 필터링하여 악의적 입력값을 차단한다.

 

(2) 소스코드 레벨에서 Prepared Statement 구문을 통한 SQL Injection 방어

: Prepared Statement 구문은 SQL 쿼리를 선처리하여 컴파일 한 후, 이후 입력되는 변수값을 항상 문자열 변수로 다루기 때문에 사용자가 어떤 악의적인 SQL 구문을 변수에 삽입해도 SQL 문에 영향을 미치지 않아 SQL Injection이 발생하지 않는다. 

즉, 숫자나 or 또는 #과 같은 문자들이 갖는 의미가 사라지기 때문에 구문 조작을 미연에 방지한다.

 

public int login(String userID, String userPassword) {
    	String SQL = "SELECT userPassword FROM USER WHERE userID = ?";
        try {
            pstmt = conn.prepareStatement(SQL);
            pstmt.setString(1, userID);
            rs = pstmt.executeQuery();
            if(rs.next()){
                if(rs.getString(1).equals(userPassword))
                    return 1;  
                else
                    return 0; 
            }
            return -1; 
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -2; 
    }

 

◾ 조치 결과

 

 

참조

' > 보안 설정' 카테고리의 다른 글

[JSP] 9. 디렉토리 인덱싱  (0) 2020.12.27
[JSP] 7.URL 파라미터 조작  (0) 2020.09.09
[JSP] 4.파일 다운로드  (0) 2020.09.08
[JSP] 1-1.Stored XSS 취약점  (0) 2020.09.08
[JSP] 보안 개발 가이드 개요  (0) 2020.09.05

취약점

게시판과 같이 사용자가 입력한 정보가 서버 측 DB에 저장되어 있다가 타 사용자가 해당 정보를 열람할 때

DB에 저장되어 있는 정보를 가져와 화면에 출력하는 방식의 웹 애플리케이션에서 발생하는 취약점으로서,

XSS의 가장 핵심적인 취약점이라고 할 수 있다.

불특정 다수를 대상으로 열람자의 웹브라우저에서 공격 스크립트를 실행할 수 있기 때문에 심각한 위협이 발생한다.

 

공격자가 XSS를 목적으로 악성 스크립트를 삽입하여 둘 수 있는 위치는 비단 게시판의 글 본문뿐만 아니라 제목, 작성자 이름, 날짜, 첨부파일 이름 등이 모두 가능하며, 또한 게시판 외에도 사용자 프로필의 닉네임, 주소, 전화번호, 등 사용자가 입력이 가능한 모든 데이터에 스크립트가 삽입될 수 있다.

 

공격 과정

 

 

실습

환경 : VMware CentOS 8

172.30.1.56 웹서버

172.30.1.53 해커

 

 

◾ test계정으로 악성 스크립트를 작성하여 게시판에 등록합니다!

 

◾ 해커의 웹서버로 세션 값을 전달하는 스크립트 등록!

 

 

 

◾ 관리자가 글을 열람했고 스크립트는 수행되었습니다!

 

 

◾ 관리자의 세션이 잘 들어왔습니다, 로그인해볼까요?

 

 

◾ 개발자 모드(F12)로 들어와서 쿠키값을 수정하고 새로고침을 해줍니다

 

 

◾ admin으로 로그인이 되었죠?

ID와PW를 모르더라도 세션을 통해 관리자로 로그인에 성공하였습니다!

 

보안조치

1. 특수문자(< >)를 HTML문자로 치환

2. 필요한 경우 허용 특수문자만 허용하도록 화이트리스트로 운영한다

 

특수문자(< >)를 HTML문자로 치환

public int write(String bbsTitle, String userID, String bbsContent) {
    
    	//특수 문자를 html문자로 치환
    	bbsTitle = bbsTitle.replace("<","&lt;").replace(">","&gt;");	
    	bbsContent = bbsContent.replace("<","&lt;").replace(">","&gt;");
    	
     
        String SQL = "INSERT INTO BBS VALUES (?,?,?,?,?,?)";
        try {
            PreparedStatement pstmt = conn.prepareStatement(SQL);
            ...
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1; 
        
    }

 

마무리

XSS공격이나 CSRF 공격은 스크립트 문을 악용하는 특징을 가지기 때문에, 스크립트에서 < >만 막아줘도 스크립트 공격을 막을 수 있다~

 

 

 

' > 보안 설정' 카테고리의 다른 글

[JSP] 9. 디렉토리 인덱싱  (0) 2020.12.27
[JSP] 7.URL 파라미터 조작  (0) 2020.09.09
[JSP] 4.파일 다운로드  (0) 2020.09.08
[JSP] 2.SQL 인젝션  (0) 2020.09.08
[JSP] 보안 개발 가이드 개요  (0) 2020.09.05

+ Recent posts