본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[26.05.23] 버섯조아 9주차 활동

파라마티 변조 취약점이란 무엇인가?

: 악의적인 사용자가 파라미터를 변조하여 악의적인 행위를 하는 것

 

정상 요청 http://www.victim.co.kr/mypage.jsp?id=hacker

공격 요청 http://www.victim.co.kr/mypage.jps?id=admin

 

 공격원리분석

 

공격동작예시

: admin을 입력하면 그냥 admin이라는 id를 가진 사용자의 정보가 공격자에게 반환한다

(id=guest 적힌 부분을 id=admin으로 바꾼다는 뜻)

 

<실습>

: 뒤의 파라미터를 변경했는데 존재하지 않는 사용자입니다가 뜨는 것을 통해

 세션이 아닌 파라미터로 공격하는 것을 알 수 있다.

 

case1: 아이디 값을 입력 받는 경우

: 아이디를 유추해야 되기 대문에 case2에 비해 피해가 크지 않다

?id= admin

 

case2:seq 값을 입력받는 경우

*파라미터 변조 취약점 공격을 통한 개인 정보 노출 피해가 굉장히 크다

*KT 개인정보 노출 사

?idx=1~10000000000000

:사용자 노출을 될때까지 계속 들어

?seq=

 

대응 방안

1. 사용자 입력 값에 대한 검증

2. 세션을 통한 처리

 

 

세션을 통한 처리 소스코드 예시

string id = request.getSession().getAttribute("id");
...
pstmt = con.preparaStatement("select * from member where id=?");
pstmt.setString(1, id);
rs = pstmt.executeQuery();
...

 

입력값 검증 소스코드 예시

string idx= request.getParameter("idx");
string id = request.getSession().getAttribute("id");
...
pstmt = con.prepareStatement("select * from bbs where idx=?");
pstmt = setInt(1,idx);
rs = pstmt.executeQuery();

if(rs,next()){
 if(!rs.getString("id") equals(id){
    out.printIn("<Script>alert('정상적인 접근이 아닙니다'); history.back(-1);</script>);
    return;
    
    }
   }
   ...

 

 

URL 접근 제한 미흡 취약점이란?

:  인증 혹은 인가가 가능한 페이지에 대한 접근제한이 없거나 존재하지만 취약점이 발견돼서

 인가되지 않은 사용자도 들어갈 수 있는 경우를 말을 한다

 

인증 vs 인가

 

인증: 로그인 구분

 

인가: 일반회원/관리자 구분 (관리자 페이지에 대한 접근)

 

 

예시: 회사 안으로 들어가려면 인증! 

 그렇지만 일반 사원이 사장실에 들어갈 수 있는가? 

 => NO! 사장만 들어갈 수 있다(이런것이 인가)

 

URL 접근 제한 미흡 취약점 공격원리

공격자가 admin 페이지를 유추해서 들어가면 된다

다른 해킹에 비해 간단하다

why? 공격자가  application에 접근만 하면 되기 때문이다

 

http:// www. victim. co. kr/ page 

=> 공격자는 page를 유추하면 된다

 

1. 수동적 유추(주로 수동적 유추를 한다)

2. 자동화 

: 사전

 

*주의해야 할 점

: 네이밍 패턴

=> 패턴을 파악한 후 접속해서 되면 취약한거고, 아니면 안전한 사이트라고 보면 된다

ex) board List.do

          => Write

          => Create

          => Insert

 

*취약한 기능

1. 게시글 작성

2. pingcheck

3. xmlparser

 

<대응방안>

접근 제어(인증) 소스코드 예시(jsp)

...
string id = request.getSession().getAttribute("id");

if(id == null || id == ""){
  out.printIn("<script>alert('정상적인 접근이 아닙니다.');history.back(-1);</script>";
  exit();
 }
 
 ...

 

id가 비어있다면 비회원이라고 판단

 

 

접근 제어(인증) 소스코드 예시(PHP)

...

if(empty($_SESSION["id"])){
 echo "<script>alert('정상적인 접근이 아닙니다');history.back(-1);</script>";
 exit();
}

...

 

접근 제어(인가) 소스코드 예시

...

String user_level = request.getSession().getAttribute("level")

if(user_level < 3){
 out.printIn("<script> alert('정상적인 접근이 아닙니다');history.back(-1);</script>");
 return;
 
 }
 
 ...

 

접근 제어(인가) 소스코드 예시(PHP)

...

if($_SESSION["level"] <3){
 echo "<script>alert('정상적인 접근이 아닙니다.'); history.back(-1);</script>";
 exit();
 
 }
 
 ...

 

<실습>

 

write 페이지 인증 문제를 해결하기 위해서

인증기능 코드를 추가해준다.


	#인증기능
if(empty($_SESSION["id"])){
    echo "<script>alert('Access Denied');location.href = 'index.php?page=login';</script>";
    exit();
}
	if($mode == "write") {
		$title = $_POST["title"];
		$id = $_SESSION["id"];
		$writer = $_SESSION["name"];
		$password = $_POST["password"];
		$content = $_POST["content"];
		$secret = $_POST["secret"];
		$uploadFile = "";

		if(empty($title) || empty($password) || empty($content)) {
			echo "<script>alert('빈칸이 존재합니다.');history.back(-1);</script>";
			exit();
		}

 

추가해주면..

 

 

이렇게 access denied가 뜨면서 login 페이지로 이동하는 것을 볼 수 있다.

 

 

 


워게임 실습

 

File-download

문제 설명

File Download 취약점이 존재하는 웹 서비스입니다.
flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다.

 

이 문제를 푸는 것은 그렇게 어렵지 않았다.

 

1. 서버에 접속하여 아무 메모나 올린다

2. 메모를 올리면

 read?name={name} 형식으로 파라미터에 저장되는 것을 볼 수 있다

3. 그 형식을 이용하여 아래 사진처럼 flag.py를 입력하면 바로 flag가 뜨는 문제였다.

 

web-misconf1

문제 설명

기본 설정을 사용한 서비스입니다.
로그인한 후 Organization에 플래그를 설정해 놓았습니다.

 

1. 일단 서버를 킨다

2. 로그인은 admin/admin으로 하면 된다(주어진 문제파일에 나와있다)

3. 문제 설명에 organizaiton에 플래그를 설정해놓았다는 것을 참조 => organization으로 이동

4. 쭉 내리면 org_name에 flag가 있다