반응형

워게임 77

[webhacking.kr] 48번 문제

350점인 48번 문제를 풀어보자. 테스트를 위해 파일을 업로드 시켜보았다. upload file을 클릭했을 때는 파일이 실행되지 않았지만 Delete를 눌렀을 때는 파일을 삭제했다. 삭제는 mode 파라미터에 del라는 변수를 담아 요청한다. 여기서 생각을 해볼 것이 파일 삭제 시 리눅스 시스템이기 때문에 rm /업로드경로/업로드파일명 형태로 명령어가 실행될 것이다. 그럼 rm 명령이 실행될 때 ';'를 이용하여 추가 명령이 실행되도록 해보자. 디렉터리의 내용을 보기 위해 ls 명령어를 추가하도록 하자. 파일이 정상적으로 업로드 되었으니, Delete버튼을 눌러 rm /업로드경로/upload.php;ls 가 실행되도록 해보자. upload.php파일은 삭제될 것이며, 그 후 디렉터리의 내용이 출력될 것..

[webhacking.kr] 47번 문제

150점인 47번 문제를 풀어보자. send버튼을 누르게 되면, 다음과 같은 로그가 보이게 된다. 메일 발신자 : no-reply@webhacking.kr 메일 수신자 : no-existed@webhacking.kr 메일에서는 '참조(CC)'기능이 있다. 해당 기능은 수신자 외에도 메일을 함께 보낼 때 쓰는 기능이다. 해당 메일을 나에게도 보내도록 해 그 안에 있는 FLAG 값을 확인해 문제를 해결하면 될 것이다. 그럼 문제를 풀기 위해 CRLF Injection을 시도해보도록 하자. 기존의 input태그를 여러 줄 입력할 수 있는 textarea태그로 변경한다. 그리고 CC에 내 이메일 계정을 담아 submit 해보자. 메일이 정상적으로 수신되었으며, FLAG 값을 Auth 페이지에 제출하자.

[webhacking.kr] 46번 문제

300점인 46번 문제를 풀어보자. lv=1 일 때 id : ltusy, cash : 1100 lv=2 일 때 id : udnrg, cash : 800 lv=3 일 때 id : fvvcg, cash : 1200 lv=4 일 때 id : bzrbo, cash : 700 &&(and) 문자는 사용가능한 것을 확인했다. lv 변수에는 공백, /, *, %, select, 0x, limit, cash 문자열이 필터링 된다. 쿼리 후의 id 값이 admin이면 문제를 해결할 수 있는데, 0x가 필터링 되고 있으므로 hex값으로는 입력이 불가능하니, char()함수를 이용하여 admin을 injection해보자. 쿼리문 : 1&&id=char(97,100,109,105,110)

[webhacking.kr] 45번 문제

550점인 45번 문제를 풀어보자. addslashes() : DB에서 ', ", /, Null Byte 와 같이 특수문자들을 이스케이프 처리해주는 함수 mb_convert_encoding(문자열,바꿀 인코딩,현재인코딩); : 인코딩 변환 id와 pw에는 admin, select, limit, pw, =, 문자열을 필터링 된다. 최종적으로 쿼리의 결과가 id=admin이면 문제가 풀리게 되지만, pw를 md5로 암호화해서 쿼리하기 때문에 Blind SQL Injection을 통해 비밀번호를 유추하기가 힘들 것 같다. 그럼, id를 통해 SQL Injection을 시도해보자. 우리는 mb_convert_encoding 함수의 취약점을 이용할 것이다. 멀티바이트를 사용하는 언어셋 환경에서는 백슬래시 앞에 %..

[webhacking.kr] 44번 문제

500점인 44번 문제를 풀어보자. POST 방식으로 id값을 전달하면 문자열의 5자리만 변수 id에 저장되게 된다. 그리고 system 함수를 통해 "echo 'hello! {$id}'"가 실행되게 된다. echo로 출력에서만 끝나는 게 아니라 명령어를 실행하게 되면 문제를 해결할 수 있다. - Command Injection? Command Injection은 시스템 명령어를 호출하는 어플리케이션의 인자 값을 조작하여 의도하지 않은 시스템 명령어를 실행시키는 공격 기법이다. 이는 웹 어플리케이션이 많이 발전하지 못했던 시절에 특정 데이터를 처리하기 위해서 시스템 명령어를 웹 어플리케이션에서 호출하여 사용하던 것으로 인해 자주 발생한다. 해당 문제에서는 ls 명령어를 사용하게끔 만들자. "echo 'h..

[webhacking.kr] 43번 문제

250점인 43번 문제를 풀어보자. 웹쉘(upload.php) 업로드를 시도해봤지만 'wrong type'문자열을 반환한다. type이 잘못된다는 것을 보니 Content-Type헤더를 살펴보도록 하자. 여기서 octet-stream은 8비트로 된 데이터라는 의미이다. Content-Type을 octet-stream이 아닌 임의의 타입으로 변경해 request해보자. text타입으로 시도해보았지만 업로드가 되지 않아, image/jpeg타입으로 조작하여 request하였다. 정상적으로 파일이 업로드 되었고, 해당 파일에 접근하게 되면 flag값이 쓰여있는 것을 확인할 수 있다. 해당 FLAG값을 Auth 페이지에 제출해보자.

[webhacking.kr] 42번 문제

200점인 42번 문제를 풀어보자. test.txt파일은 다운로드가 가능하지만, flag.docx파일은 'Access Denied' alert창이 뜨게 된다. 해당 문제는 flag.docx 파일을 다운 받아 그 안에 있는 flag값을 제출하면 되는 것 같다. 다운로드가 진행될 때는 ?down= 파라미터를 이용한다. test.txt를 다운받았을 때 down 파라미터에 담겨있던 값을 Base64 decoding을 해보게 되면 test.txt문자열이 나오게 된다. 그럼 flag.docx를 Base64 encoding 하여 down 파라미터에 담아 request하게 되면 문제를 해결할 수 있을 것이다. 문서 안에 있는 flag 값은 다음과 같다. 이제 해당 flag를 Auth 페이지에 제출하자.

[webhacking.kr] 41번 문제

250점인 41번 문제를 풀어보자. error_reporting(E_ALL) -> php 에러 메시지 출력하기 41번 문제에서는 에러 메시지를 힌트로 이용한다. flag값이 우리가 올린 파일에 쓰여진다는 것을 확인할 수 있다. 그러나 우리는 $upload_dir의 값을 모르니 때문에 파일을 업로드 한 후 디렉터리에 접근할 수가 없다. 리눅스 파일 시스템에서는 최대 255자의 파일명을 지원한다. 그럼 프록시를 이용해 filename을 최대치 넘게 입력하여 request 해보도록 하자. 에러 메시지가 반환되며 메시지 안에는 해당 디렉터리 경로 정보가 들어있다. 디렉터리 경로 : /4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/ 빈파일을 생성한 후 업로드 시켜 해당 경로로 접근해보자..

[webhacking.kr] 40번 문제

500점인 40번 문제를 풀어보자. 첫 화면에는 입력값에 guest가 들어있었다. 로그인 시도했을 때 guest계정으로 로그인이 정상적으로 이루어진 것을 볼 수 있다. id값을 admin으로 바꾼 후 로그인을 시도했지만 Failure가 반환된다. no=0으로 했을 때에는 성공/실패가 뜨지 않았다. 그러나 no=0||1=1 과 1=2 or조건을 붙였을 때는 성공/실패가 뜬다. 해당 no 파라미터에 injection이 가능한 것으로 확인된다. ?no=0||id=admin&id=guest&pw=guest -> access denied or 조건에 id가 admin인 조건을 넣었을 때는 access denied이 반환된다. 해결방법을 찾아보니 admin을 hex값으로 변환시켜 넣으면 된다. ?no=0||id=0..

[webhacking.kr] 39번 문제

100점인 39번 문제를 풀어보자. 쿼리문의 where 절을 참으로 만들면 1이 반환되어 문제를 풀 수 있게 된다. 소스코드를 자세히 보면 id부분에서 싱글쿼터를 여는 부분은 있는데 닫는 부분이 없다. id='{$_POST['id']} id 값의 '은 ''로 치환되고, \\은 공백으로 치환된다. 그리고 substr()함수에 의해 15자리까지 잘라낸 후 반환된다. 이제 문제를 풀기 위해 싱글쿼터를 닫을 수 있는 방법을 생각해보자. test+공백 10자리 + ' -> test+공백 10자리 + ''로 치환되지만 15자리에서 끊기기 때문에 test+공백 10자리 + '' 빨간 글씨 부분만 반환된다. 그리고 MySQL에서는 'test' = 'test '가 true로 반환된다. 그 이유는 char(6)일 경우 '..

반응형