티스토리 뷰
name을 입력할 수 있는 공간과 Make 버튼이 있다.
숫자를 입력해보면 아래와 같이 다섯칸으로 되어있다.
Make 버튼을 누르면 index/go.html 페이지로 이동되고 페이지 내용에 hello 12345 가 출력되어 있는 것을 볼 수 있다.
즉, 첫 페이지에서 입력한 내용 중 5글자만 index/go.html 페이지에 출력이 된다는 것을 알 수 있다.
Code Injection 취약점을 이용한 문제로 추측을 하고 문제의 구조를 파악해보면 다음과 같다.
1. name 으로 입력한 값이 $_POST['name']으로 전달
2. $name = substr($_POST['name'],0,5); 5글자만 전달
3. system("echo 'hello $name' > index/go.html"); system() 함수를 이용하여 전달받은 값을 가지고 index/go.html 페이지 생성
4. index/go.html 페이지로 이동
그리고, ls 를 입력할 경우 빈페이지만 보여준다.
이러한 특징을 토대로 문제를 풀어보면 입력을 할 수 있는 부분은 $name에 5 글자로 제한이 되어있다.
그렇기 때문에 '&l's 로 입력을 하면 아래와 같이 된다.
echo 'hello '&l's' > index/go.html
색을 구분하여 명령어가 실행되는 구조를 보면 아래와 같다.
echo 'hello '&l's' > index/go.html
echo 'hello ' 부분이 &에 의해서 백그라운드로 실행이 되고 ls 명령어 실행한 결과가 index/go.html 페이지로 리다이렉션이 된다.
'& 는 ls 명령어를 실행시키기 위해서 echo 부분을 닫아주고 백그라운드로 실행을 한 부분이고, l's 는 ls 만 입력할 경우 정상적으로 실행이 되지 않기 때문에 우회하기 위해서 ls 사이에 '를 넣어서 우회를 해주는 것과 동시에 '의 짝을 맞춰줄 수 있다.
따라서 실행을 하게 되면 index/go.html 페이지에 ls 명령어를 실행한 결과가 출력이 되고 내용을 보면 패스워드로 의심이 가는 파일을 볼 수 있다.
challenge44_PaSs_w0Rd___.php 파일을 실행해보면 문제를 풀 수 있다.
+ 추가
Bash Shell에서 `(backquote/backtick), '(singlequote), "(doublequote)
`(backquote/backtick)
backquote 안에 있는 명령어의 표준출력(stdout)를 표준입력(stdin)으로 바꾸는 기능이 있다.
예를 들어 uname 이라는 파일을 만들어서 ls를 하게 되면 출력은 uname이 된다.
이때, `ls`를 하게 되면 출력인 uname이 입력으로 바뀌기 때문에 uname 명령어를 실행한 결과가 출력된다.
'(singlequote)
singluequote 안에 있는 내용을 문자열 그대로 인식한다.
"(doublequote)
doublequote 안에 있는 내용 중 특수문자($, `(backquote), \(escape character)가 있을 경우 해석하여 인식한다.
예를 들어 t=temp 를 쓰고 난 다음 echo '$t' 와 echo "$t" 를 실행해보면 출력은 $t, temp 가 된다.
공백이 포함되어 있는 문자열도 하나로 인식하게 해줄 때도 사용한다.
! (History Expansion)
'Wargame > Webhacking.kr' 카테고리의 다른 글
Challenge 49 (0) | 2015.09.03 |
---|---|
Challenge 48 (0) | 2015.08.31 |
Challenge 47 (0) | 2015.08.31 |
Challenge 46 (0) | 2015.08.29 |
Challenge 45 (0) | 2015.08.28 |
Challenge 43 (0) | 2015.08.28 |
Challenge 42 (0) | 2015.08.28 |
Challenge 41 (0) | 2015.08.15 |
Challenge 40 (0) | 2015.08.14 |
Challenge 39 (0) | 2015.08.14 |