프롤로그
웹 해킹 강의 현재 75퍼까지 진행되었다.
얼마 남지 않았는데 최대한 빨리 끝내고 웹해킹쪽은 워게임 문제풀이 많이 해봐야겠다.
서론
어떤 기능에 대해서 새로 코드를 짜는 것 보단 이미 있는 내장 명령어를 쓰는 경우가 많다.(ls, who...)
다양한 웹 어플리케이션 제작용 언어는 시스템에 내장되어 있는 프로그램들을 호출 할 수 있는 함수를 지원한다. 이 시스템 함수를 사용하면 이미 설치된 소프트웨어들을 쉽게 이용할 수 있다는 장점이 있으나, 함수의 인자를 셸의 명령어로 전달한다는 점에서 치명적인 취약점이 이어지기도 한다.
-> 이를 Command Injection(명령어를 실행해 주는 함수를 잘못사용하여 발생) 이라고 한다.
Command Injection
인젝션(Injection) : 악의적인 데이터를 프로그램에 입력하여 리를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행하게 하는 기법이다.
Command Injection은 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다.
os.system("ping [user-input]") / os.system("cat [user-input]") 의 형태로 시스템 함수를 사용할 수 있는데, 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다.
why ? 리눅스 셸 프로그램이 지원하는 다양한 메타 문자로 인하여. && , ;, | 등을 사용해 여러개의 명령어를 연속으로 실행시킬 수 있다.
메타문자
(1) ' ' : 명령어 치환
$ echo `echo theori`
> theori
'' 안에 들어있는 명령어를 실행한 결과로 치환된다.
(2) $() : 명령어 치환(중복 사용 가능)
$ echo $(echo theori)
> theori
$() 안에 들어있는 명령어를 실행한 결과로 치환된다. 위와 다르게 중복 사용이 가능하다.
(3) && : 명령어 연속 실행
$ echo hello && echo theori
hello
theori
and 논리연산과 같이 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어 실행 가능
(4) || : 명령어 연속실행
$ cat / || echo theori
cat: /: Is a directory
theori
앞 명령어에서 에러가 발생해야 뒷 명령어 실행가능
(5) ; : 명령어 구분자
$ echo hello ; echo theori
hello
theori
그냥 다 실행됨
(6) 파이브
$ echo id | /bin/sh
uid=1001(theori) gid=1001(theori) groups=1001(theori)
앞 명령어의 결과가 뒷 명령어의 입력으로 들어감
실습
@app.route('/ping')
def ping():
ip = request.args.get('ip')
return os.system(f'ping -c 3 {ip}')
이렇게 되어있을 때, ip 주소 받는 부분에다가 아예 ip주소 ; id 이런식으로 명령어 구분자를 넣으면 커맨드 인젝션이 발생한다.
에필로그
아
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/웹해킹] ServerSide: File Vulnerability (0) | 2024.01.15 |
---|---|
[드림핵/워게임] command-injection-1 (웹 해킹) (0) | 2024.01.15 |
[드림핵/워게임] Mango (웹 해킹) (0) | 2024.01.12 |
[드림핵/웹해킹] ServerSide: NoSQL Injection (3) | 2024.01.11 |
[드림핵/웹해킹] Background: Non-Relational DBMS (1) | 2024.01.11 |