
안녕하십니까
코딩사과의 짭 코딩 파인애플입니다
이번 시간에는 COMMAND INJECTION에 관해 알아보겠습니다.
Command Injection (명령어를 주입하다) 은 해커가 웹사이트의 입력창에 운영체제(OS) 명령어를 주입하여 웹사이트 뒤에 있는 서버를 조작하고 무단으로 제어하는 대표적인 웹 해킹 기법을 말합니다
Command Injection은 명령어를 실행할 때 사용자가 임의의 인자를 전달할 수 있을 경우 발생됩니다
예를 들어 뭐 이딴 코드가 있다고 칩시다
#간단한 ping하는 코드
from flask import Flask, request
import os
app = Flask(__name__)
@app.route('/ping')
def ping():
target_ip = request.args.get('ip')
command = f"ping -c 1 {target_ip}"
response = os.popen(command).read()
return f"<pre>{response}</pre>"
if __name__ == '__main__':
app.run(port=5000)
만일 정상적인 사용자가 사용한다면 간단히 ip주소를 입력하겠지만은
해커는 메타문자를 이용해 임의의 코드를 넣어 해킹을 합니다
8.8.8.8; cat /etc/passwd
이 경우 메타문자를 이용하여 바로 뒤의 코드까지 실행해 패스워드를 읽습니다
메타문자(Metacharacter)란, OS의 cmd나 셸에서 단순한 글자가 아니라, 특별한 기능이나 의미를 갖도록 미리 약속된 특수문자를 말합니다
특히 cmd injection에서는 해커가 이 메타문자를 주입하여, 개발자가 의도한 원래 명령어의 흐름을 끊고 자신이 원하는 추가 명령어를 실행시키면서 발생합니다.
; (세미콜론 - 주로 Linux) : 앞의 명령어의 성공 여부와 상관없이 뒤의 명령어를 무조건 실행합니다
ping 8.8.8.8 ; whoami
& (앰퍼샌드 - Windows/Linux 공통) : 앞의 명령어를 백그라운드에서 실행하거나, Windows에서는 단순히 두 명령어를 이어 붙여 실행합니다
ping 8.8.8.8 & dir ( ping과 dir을 연달아 실행)
&& (더블 앰퍼샌드) : 앞의 명령어가 성공해야만 뒤의 명령어를 실행합니다.
|| (더블 파이프) : 앞의 명령어가 실패해야만 뒤의 명령어를 실행합니다.
| (파이프) : 앞 명령어의 실행 '결과(출력)'를 뒤 명령어의 '입력'으로 전달합니다.
cat secrets.txt | grep "password" : 명령어의 결과를 화면이 아닌 파일로 저장합니다. (>는 덮어쓰기, >>는 이어쓰기)
echo "Hacked" > index.html
\n (줄바꿈) : 엔터 키를 친 것과 같은 효과를 줍니다. 눈에 보이지 않는 공백 같지만 시스템은 다음 줄의 명령어로 인식합니다.
` (백틱) : 괄호 안의 명령어를 가장 먼저 실행하고, 그 결과값을 바깥 명령어의 인자로 주입합니다.
이제 기초 여기까지고 좀 더 심화있게 가봅시다
...막상 드립 좀 치려니까 드립 칠 곳이 없었습니다 죄송합니다.
반성하는 의미로 여기에 짤 모음집을 싸지르겠습니다.
