해당 포스팅은 https://dreamhack.io/?obj=18 를 참고하여 공부 목적으로 작성하였습니다.
Command Injection
정의
SQL Injeciton, DLL Injection과 같은 단어에서 유추할 수 있듯이 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점이다.
즉, 만약 웹이나 서버에 명령어를 실행하는 함수가 존재한다고 가정하자. 명령어를 실행하는 함수에 공격자가 임의의 인자(공격 코드)를 전달하면 Command Injection 취약점이 발생한다.
Python을 예시로 살펴보자. Python에서는 기본적으로 os 라이브러리를 지원하고 있기 때문에 대상 IP에 Ping을 보내고 싶다면 os.system(”ping [target-ip]”)
와 같이 시스템 함수를 실행할 수 있다.
하지만, 이러한 입력을 제대로 검사하지 않으면 어떻게 될까?
⇒ Command Injection이 발생할 수 있으며 메타 문자(&&, ;, |) 등을 사용해 임의 명령어를 실행하고 쉘을 획득할 수 있게 된다.
Python을 예시로 설명하면 이해하기 쉽다. Python에서는 기본적으로 os 라이브러리를 제공하므로 rksfi 특정 IP에 핑을 보내고 싶다면 os.system(”ping [target_ip]”), 특정 파일을 읽고 싶다면 os.system(”cat [target file]”) 형태로 사용할 수 있다 .
메타문자 | 설명 | 사용 예시 |
`` | ``안에 들어있는 명령어를 실행하과 해당 결과로 치환 | echo `echo test` |
$() | $()내에 존재하는 명령어롤 실행한 결과로 치환(중복 가능) | echo $(echo test) |
&& | 한 줄에 여러 명령어 사용(앞 문장에서 에러가 발생하지 않아야 실행) | echo test && echo test2 |
|| | 한 줄에 여러 명령어 사용(앞 문장에서 에러가 발생해야 실행) | cat no || echo test2
(no는 존재하지 않는 파일) |
; | 한 줄에 여러 명령어 사용(구분자) | echo test; echo test2 |
| | 앞 명령어의 결과가 뒷 명령어의 입력으로 들어감 | echo test | /bin/sh |
Command-injection-1 Write-Up
문제
해당 문제는 Command Injection을 활용하는 문제로 플래그는 flag.py
에 존재한다고 한다. 플래그가 flag.py
에 존재하므로 cat flag.py 명령어를 Injection 하면 해결된다.

Write- Up
문제에서 주어진 app.py
를 살펴보자. 별다른 특이 사항은 없으며 입력하는 값에 “ “ (더블쿼터)를 적용한 후 쉘을 통해 명령어를 실행하는 방식으로 동작한다.
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)
입력되는 명령어에 더블쿼터가 적용되기 때문에 더블쿼터를 우회함과 동시에 cat flag.py 명령어를 Injection 해야한다.
하지만, 주어지는 웹 사이트에 값을 입력할 경우 요청한 형식과 일치하라는 말과 함께 명령어 실행이 이루어지지 않는다.

Ping 페이지의 코드를 살펴보자. Ping 페이지를 자세히 보면 정규식을 통해 입력값에 대한 패턴을 정해놓은 것을 알 수 있다. 정규식 패턴이 적용되어 있기 때문에 Burp Suite를 사용하여 Request 값을 변조하거나 크롬 개발자도구를 사용하여 코드를 수정해야 한다.

2가지의 방법 중 Burp Suite를 사용하여 문제를 해결하였다. (Burp Suite 다운로드 및 사용법은 포스팅할 예정이다.)
Proxy 설정을 하고 Ping 페이지에서 정규식과 일치하는 값(8.8.8.8)으로 Request 요청을 보낸다.

Request 요청 값을 살펴보면 8.8.8.8 값이 정상적으로 들어간 것을 확인할 수 있다.

8.8.8.8인 Request 값을 ";cat flag.py;echo"
으로 변경하면 더블 쿼터가 해제되고 cat flag.py 명령어가 정상적으로 실행되어 Flag를 획득할 수 있다.

Flag
FLAG = 'DH{pingpingppppppppping!!}'
오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗
Uploaded by N2T
'Dreamhack > Web hacking' 카테고리의 다른 글
file-download-1 Write-Up (0) | 2023.02.04 |
---|---|
비관계형 데이터 베이스 그리고 NoSQL Injection (0) | 2023.01.30 |
simple-sqli Write-Up (0) | 2023.01.23 |
SQL Injection (0) | 2023.01.21 |
csrf-2 Write-Up (0) | 2023.01.21 |