본문 바로가기
웹/드림핵

command-injection-1

by SH_L 2022. 9. 3.
반응형

[문제]

 

 

[풀이]

 

@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')

 

/flag 페이지를 구성하는 코드이다. 코드를 살펴보면 “/bin/sh”를 확인할 수 있다. 이용자가 전달한 host 파라미터 값을 cmd로 넘겨 ping을 보낸다. 리눅스 명령어를 사용하여 flag.py 안에 있는 플래그를 얻는 것이 이 문제의 핵심으로 보인다.

 

 

/ping 페이지에 접속하여 Host 입력 칸에 8.8.8.8를 입력한다.

 

 

ping을 보내면 패킷 수신 결과를 확인할 수 있다.

 

 

플래그가 flag.py에 있기 때문에 다중 명령어를 사용하기 위해 ';'와 함께 cat 명령어를 입력했지만 요청한 형식과 일치하지 않는다는 문구가 출력된다.

 

 

개발자 도구를 열어 Host를 입력하는 칸의 코드를 살펴보았다. pattern 속성으로 인해 요청한 형식과 일치시키세요.”라는 문구가 출력되므로 해당 속성을 지워준다.

 

 

pattern 속성을 지운 다음에 다시 ping을 보냈지만 오류가 발생한다. 뒤에 명령어의 형식을 보면 따옴표 문제로 인해 생긴 오류로 추측된다.

 

 

명령어를 따옴표로 감싸준 뒤에 다시 ping을 보낸다.

 

 

ping을 보내면 패킷 수신 결과와 함께 플래그를 확인할 수 있다.

반응형

' > 드림핵' 카테고리의 다른 글

file-download-1  (0) 2022.09.06
image-storage  (0) 2022.09.06
Mango  (0) 2022.09.03
simple_sqli  (0) 2022.09.03
csrf-2  (0) 2022.09.03