6주차 과제 [server-side]
웹 어플리케이션에서는 파일을 공유하기 위해 파일을 업로드하고 다운로드할 수 있는 기능이 존재한다.
이 파일을 업로드할 때와 다운로드할 때 각각 취약점이 발생하게 된다.
업로드 취약점 - 서버의 파일 시스템에 사용자가 원하는 경로 또는 파일명 등으로 업로드가 가능하여 악영향을 끼칠 수 있는 취약점
from flask import Flask, request
app = Flask(__name__)
@app.route('/fileUpload', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save("./uploads/" + f.filename)
return 'Upload Success'
else:
return """
<form action="/fileUpload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit"/>
</form>
"""
if __name__ == '__main__':
app.run()
위와 같은 파일 업로드 기능을 구현한 코드가 있을 때
정상적으로 서버 기능상 구현한대로 uploads 디렉토리에 test.txt가 업로드 되었다.
그러나 위 사진처럼 파일 이름에 이전 디렉토리를 의미하는 ../을 붙임으로써 아래부분을 보면 업로드한 hack.py가 uploads 디렉토리가 아닌 다른 곳에 위치했음을 알 수 있다.
CGI(Common Gateway Interface)
사용자의 요청을 받은 서버가 동적인 페이지를 구성하기 위해 엔진에 요청을 보내고 엔진이 처리한 결과를 서버에 반환하는 기능
ex) 사용자가 요청하는 리소스의 확장자가 .php라면 mod_php를 통해 사용자의 요청을 php엔진이 처리하도록 함
이를 이용해 서버가 엔진에 요청하는 확장자를 업로드하여 서버의 웹 어플리케이션에 원하는 코드를 실행할 수 있다.
웹 서버가 서비스 하는 경로에 파일을 업로드할 수 있어야함!!
<?php
if(!empty($_FILES['file'])){
$filename = generateRandomString(); // custom function
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$path = "./uploads/" . $filename . "." . $ext;
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
return true; // upload success
} else {
return false; // upload fail
}
}
?>
위의 php 코드는 웹사이트의 업로드 부분.
위와 같이 .php 확장자(.pht, .phtml 등도 모두 php 엔진으로 처리)를 갖는 이름의 파일을 만들어주고
그 내용을 xss 취약점을 발생시키는 익스플로잇 코드 또는 php 엔진이 처리하는 문법을 추가하여 업로드할 수 있다
WebShell - 웹 어플리케이션이 실행하는 코드를 악의적인 공격자가 조작할 수 있다면, 웹 어플리케이션 언어에 내장된 OS 명령어를 사용할 수 있으며, 해당 서버의 쉘을 웹을 통해 사용하는 악성코드 뚜둥,,
다운로드 취약점 - 서버의 기상 구현 상 의도하지 않은 파일을 다운로드할 수 있는 취약점
사용자가 입력한 파일이름을 검증하지 않은 채 그대로 다운로드 시켜줌으로써, 공격자는 Path Traversal을 이용해 uploads 경로보다 더 상위 경로에 존재하는 시스템 파일, 설정 파일과 같은 중요한 정보들을 다운로드 할 수 있다.
위와 같은 파일의 상하체계가 나누어져 있을 때, 사용자가 접근할 수 있는 디렉토리는 uploads 디렉토리다.
만약 공격자가 /app/etc/passwd를 다운받고자 할 때
이전 디렉토리를 의미하는 ..을 이용하여 접근할 수 있었다.
이를 막기위해서는 파일의 이름을 입력받는 부분에서 ..과 /와 \\를 필터링해야 할 것이다.
이때 단순히 ../을 필터링 하는
filename = filename.replace("../", "")
와 같은 코드를 이용한다면, ../을 막을 수는 있지만 공격자는 ..././과 같은 형식으로 요청해 ../가 삭제되어 ../를 만드는 형식으로 우회할 수 있다.
또한 윈도우 기반의 웹 서버라면 ..\\도 ../과 같이 상위 경로에 접근 가능하다.
@app.route("/download")
def download():
file_id = request.args.get("file_id", "") # file_id는 쉽게 유추하지 못하는 랜덤한 값이어야 합니다.
file_path = find_path_from_database(file_id) # find_path_from_database 함수는 데이터베이스에서 file_id와 매핑된 파일 경로를 반환하는 개발자가 작성한 함수입니다.
if file_path is None:
return "올바르지 않은 파일 아이디입니다."
return open(file_path, "rb").read()
데이터베이스에 다운로드 될 파일의 경로와 그에 해당하는 랜덤키를 생성해 1대 1로 매칭해서 저장해두고 해당 랜덤 값이 인자로 주어졌을 때 데이터베이스에 존재하는 파일인지를 먼저 식별하고 다운로드 하는 것이 안전하다. 후하
Command Injection
OS Command란 linux에서 사용하는 ls, pwd, ping, zip 혹은 windows에서 사용하는 dir, pwd, ping 등의 OS에서 사용하는 Command이다. 웹 어플리케이션에는 이런 OS Command를 사용하기 위해 PHP(system), Node JS(child_process), Python(os.system)과 같이 OS Command를 실행하는 함수가 구현되어 있습니당.
OS Command를 사용하는 이유는 이미 기능을 구현한 OS 실행 파일이 존재할 때, 따로 구현하지 않고 OS Command를 이용하면 편하기 때문!
위의 상황에서 메타문자를 입력하여 주어진 ping 명령어 외에도 다른 OS Command를 실행시킬 수 있다.
첫번째는 &&를 사용해서 앞 명령어를 실행하고 다음 명령어(id)를 실행하도록 하였다
두번째는 ;를 사용해서 한 줄에 여러개의 명령어를 입력한 것이다.
이런 Command Injection을 막기 위해서는 사용자의 입력 데이터가 Command 인자 외에 다른 값으로 해석되는 것을 막아야한다
OS Command에 사용자의 입력 데이터를 넣어 사용해야할 경우 필터링을 통해 방지 가능! => 화이트/블랙 리스트 방식의 필터링
정규식을 통한 화이트리스트 방식의 필터링
예를 들어 위와 같이 ping 명령어에 사용자의 입력값을 사용할 때 사용자의 입력값이 제대로 된 ip 주소 형식인지 정규식으로 검증한 후 명령을 수행하도록 한다.
OS Command에서 Meta 문자로 사용되는 값을 필터링 하고 따옴표로 감싸기
사용자의 입력값인 ip주소를 따옴표(')로 감싸서 이를 Meta 문자로 사용되는 것을 막는다!
execve args 인자로 사용
shell meta 문자로 해석되지 않게 입력값을 넣는다.
기능에 해당하는 라이브러리 사용
사용하고자 하는 기능을 취약점이 존재하는 OS 커맨드 대신 구현한 라이브러리로 대체 사용할 수 있다!
1. root-me.org의 Command Injection 워게임
취약점을 찾아 익스플로잇하고 index.php 파일에 있는 플래그 값을 알아내면 되는 문제다.
127.0.0.1을 입력하고 제출한 결과 ping 127.0.0.1의 결과라고 추정되는 값이 출력되었다.
&&를 이용해 ping 명령어가 수행되고 나서 ls 명령어를 수행하도록 하고 제출하니 가장 아래에 ls의 결과물인 index.php가 출력되었음을 볼 수 있다.
그럼 index.php의 내용을 출력하는
cat index.php
를 입력해보자!
? 당황스럽다. 아마도 그 내용을 출력하면서 안에 있는 form 태그까지 그대로 생성된 것으로 보인다.
이때 개발자 도구에서 elements를 보면
아래에 후핳후핳 flag 값이 있다 후핳
이를 복사해서 플래그 입력칸에 입력하면
후핳
2. root-me.org의 File upload - Double extensions
PHP 코드를 입력해 해당 사이트의 취약점을 공격하면 되는 문제다. 플래그값은 웹사이트의 근원..? (가장 상위 디렉토리를 의미하는거 같다)에 있는 .passwd 라는 파일에 있다고 한다.
흐음 뭐하는 사이트지
나머지 탭은 뭐 이미지들만 있고 뭐하는 탭인지 모르겠다. upload 탭에서는 사진을 업로드 할 수 있는거같다.
어 이거 아까 드림핵 실습에서 했던거 같다.
아까 기억이 맞다면 .php 확장자의 파일에 익스플로잇 코드를 넣어서 alert(document.domain)을 실행시켰던걸로 기억한다.
그때처럼 입력해서 되나 한 번 보자
이처럼 입력하고 확장자를 바꿔보자
후 도전
파일이 들어간 경로도 보여준다. 업로드한 파일은 의도대로 되지 않았다.
아무일도,,,(이렇게 하면 안된다는걸 깨달았다)
그럼 ..을 사용하여 아까 문제에서 .passwd가 위치해있다는 galerie로 이동해 cat 해볼까요오?
어 근데 아까 위에서 안해본게 있다. 웹사이트에서는 업로드 가능한 확장자가 정해져 있었는데 그 외에 파일은 정말 안될까요...?
일단 파일 제목은 ../../../nyang.php 로 해보겠다.
이렇게 작성하고,,,, 이름을 위에껄로 바꾸려고 했는데 적절하지 않은 이름이라고,,,,
그냥 밖의 파인더에서 바꾸려고 하니 .으로 시작하는 파일은 뭐 예약되어 있다고 안된다고 한다. 내 컴퓨터인데,,누가 예약을 해놨대,,,,,,,,,
그래서!
앞에 / 하나 더 붙여줬다
후 가보자
간다요!?!?!?!?!?
하씨
안되네,,,
간 다
어..?
원하는대로 안됐네....?
그냥 php.png로 달려본다
올리고 열어보니
어? 그동안에 올렸던 .png와는 다른 반응이다
a.php를 다음과 같이 구성해봤다.
<?php system("ls") ?>
이를 .png 확장자로 바꾸고 업로드를 하니
아까 올렸던 파일들이 보인다
ls 명령어가 잘 먹힌 모습이다!!
이렇게 구성한다면...?
exec 함수를 사용했다 후하후하 해보자
하 드디어씨 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
3. root-me.org의 File upload - MIME type
후우 아까랑 비슷한 문제인거 같다..
분위기는 전혀 안비슷했다.
이번 문제는 .passwd가 어디 저장되어 있는지 문제에서 알려주지 않았다
이를 찾아내야 아까처럼 cat을 하든 뭘 하든 ㅇㅋ?
이렇게 입력하여 업로드를 하니
아까처럼 php 엔진으로 돌려주지를 않는다 나쁜놈
이 문제의 부제목이였던 type mime을 검색해봤다
https://juyoung-1008.tistory.com/4
이 문제에서는 Burpsuite를 사용했다.
<?php
system("cd ..; ls -al");
?>
위와 같이 작성한 v.php를 업로드 시키고 그 중간에서 Burpsuite로 Content-Type를 조작해 이 파일이 이미지 파일이라고 속이는 방식이다!
Burpsuite에서 서버로 전송되는 데이터를 중간에 낚아챈 모습이다. 저기 밑에 내가 입력한 코드도 보이고 그 위에 Content-Type도 있다. 이걸 후 바꾸고 진행해보자
포워드를 누르니 파일이 업로드되었다.
v.php를 누르니
흠 이곳에는 .passwd 파일이 없다
이 방법대로 하나하나 상위 디렉토리로 올라가보자
이번에도 저기 Content-Type을 text/php에서 image/png로 바꿔주고 풜워드 해보자
여기도,,,없다
이 시키 찾았다. 후후 그럼 상위 디렉토리로 3번 이동하고 거기서 cat .passwd를 추가해보자ㅏ아아아아앙
간 다
원래 역사적인 순간은 모든 장면을 간직해야한다
후하후ㅏ후하후하ㅜ하후ㅏㅎ
댓글
이 글 공유하기
다른 글
-
웹해킹 스터디 1주차
웹해킹 스터디 1주차
2020.10.10 -
웨페킹 팔주차 [Bandit OverTheWire All clear]
웨페킹 팔주차 [Bandit OverTheWire All clear]
2020.06.03 -
\x00웹\x00해\x00킹\x00스\x00터\x00디\x007\x00주\x00차\x00과\x00제
\x00웹\x00해\x00킹\x00스\x00터\x00디\x007\x00주\x00차\x00과\x00제
2020.05.29 -
웨에에엡 해애애애애 키이이잉 유우욱 주차아아 과아아제에에[CSRF,XSS]
웨에에엡 해애애애애 키이이잉 유우욱 주차아아 과아아제에에[CSRF,XSS]
2020.05.19