입력창에 텍스트를 입력한뒤 Send를 보내서 글을 메모할 수도 있고,
파일과 함께 글을 메모할 수도 있다.
파일을 남기면 위처럼 upload file 부분을 눌러서 내가 올린 파일을 확인할 수 있다.
그리고 Delete를 누르면 글이 사라진다.
내가 올린 파일의 경로는
webhacking.kr:10006/upload/파일명
으로 올려져 있다.
Delete를 사용해서 두 글을 지워봤다.
mode=del&time=시간값
을 인자로 데이터가 보내지고, 결과로 메모가 삭제된다.
webhacking.kr:10006/upload/파일명
를 통해 내가 올렸던 파일의 경로로 이동해보니 파일이 존재하지 않는다고 오류메세지가 나온다.
메모와 함께 삭제된 것이다. 그리고 운영체제가 Ubuntu인것이 오류메세지 상에서 확인된다.
/upload/ 경로에 업로드되어있는 파일을 Ubuntu 상에서 지우려면 어떤 방법을 사용했을까?
아마 rm 명령어일 것이다. 아래와 같은 방식일 것이다.
rm -rf 파일명
따라서 나는 이걸 이런 식으로 바꿔볼 것이다.
rm -rf 파일명;ls
연속으로 명령어를 실행하게끔 세미콜론을 넣음으로써, 뒤에 있는 ls를 통해 현재 디렉토리에 어떤 파일들이 있는지 확인해볼 것이다.
;ls의 파일명을 가진 파일을 업로드한 뒤에 삭제시켜봤다.
(안될경우엔 ';ls 나 ";ls를 해보면 될 듯 하다)
이 플래그값을 Auth 메뉴에 가서 넣어주면 끝.
이번 문제의 기법을 Command Injection이라고 한다.
커맨드 인젝션의 공격대상은 OS 쉘이다. 웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 실행하도록 하는 공격이다.
Command Injection
Command Injection 은 웹 애플리케이션에서 시스템 명령을 사용할 때, 세미콜론 혹은 &, && 를 사용하여 하나의 Command를 Injection 하여 두 개의 명령어가 실행되게 하는 공격이다. OWASP Top10 중 1위에 속해 있는 Injection 공격으로 서버자체의 콘솔 명령어를 실행시킬 수 있기 때문에 공격이 성공한다면 매우 큰 피해가 발생할 수 있다.
해당 문제는 php상에서 실행되는 문제이므로 아마 아래와 같은 코드 형태로 작성되어 ;ls로 인해 크랙될 것이다.
system('rm -rf' . $file_name);
// 또는
system('rm -rf {$file_name}');
둘은 문자열 안에 변수값을 넣는(합치는) 방법이다. 이렇게하면 문자열에 변수값을 넣을 수 있게 된다.
php 문자열과 변수 합치기 : opentutorials.org/course/3018/237
'[보안] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 50번 (0) | 2020.11.15 |
---|---|
[Webhacking.kr] 49번 (0) | 2020.11.15 |
[Webhacking.kr] 47번 - 아시는분? (0) | 2020.11.14 |
[Webhacking.kr] 46번 (0) | 2020.11.14 |
[Webhacking.kr] 45번 & 나중에 알게 되면 다시보기 (0) | 2020.11.13 |