반응형

CTF 81

[webhacking.kr] 61번 문제

200점인 61번 문제를 풀어보자. 만약 id파라미터가 없다면 id=guest가 된다. id의 값이 15자 이상이거나 ( , ) , select, from, ',' , by, '.' 문자열은 필터링 된다. select {$_GET['id']} from chall61 order by id desc limit 1 쿼리문을 해석해 보면, 입력받은 id를 검색하는데 chall61테이블에서 id컬럼을 내림차순으로 정리한 것 중 id의 첫번째 줄에서 1개를 가져오라는 의미이다. 쿼리 후 결과가 admin이면 문제가 풀리게 된다. 이제 인젝션을 통해 문제를 풀어보도록 하자. 'admin' from chall61--를 넣어 뒤의 조건을 주석처리 시켜버리면 쉽게 해결할 수 있지만, from 문자열이 필터링 되고 있기 때..

[webhacking.kr] 60번 문제

300점인 60번 문제를 풀어보자. 첫 화면에서 idx 값이 39315로 주어져 있고, Access Denied가 반환된다. 소스코드를 살펴보자. if(!is_numeric($_COOKIE['PHPSESSID'])) exit("Access Denied view-source"); 쿠키 PHPSESSID가 숫자가 아니면 exit()하게 된다. $_GET['mode']의 값이 auth 이면 file_get_contents()함수를 이용해 ./readme/{$_SESSION['idx']}.txt 파일을 문자열로 읽어들인다. 39315가 ./readme/{$_SESSION['idx']}.txt에 존재한다면 문제를 해결된다. 세션값을 1로 바꾸고, ?mode=auth로 request해보자. Auth~ 가 반환된다...

[webhacking.kr] 59번 문제

200점인 59번 문제를 풀어보자. 테스트를 위해 test/test계정으로 JOIN을 해보고, POST로 전달되는 데이터에는 어떤 것이 있는지 확인하자. JOIN할 때는 id와 phone에 데이터가 담겨 request되고, LOGIN할 때는 lid와 lphone에 데이터가 담겨 request된다. LOGIN을 시도했을 때 쿼리의 결과 중 lv가 'admin'이면 문제가 풀리게 된다. 이제 JOIN부분 소스코드를 살펴보자. phone의 길이가 20자 이상이면 exit()이 실행된다. id 파라미터에서는 admin 문자열을 필터링하고, phone 파라미터에서는 admin, 0x, #, hex, char ,ascii, ord, select 문자열이 대소문자 관계 없이 필터링된다. insert 쿼리문에서 $_P..

[webhacking.kr] 58번 문제

150점인 58번 문제를 풀어보자. ls 명령어를 send했더니 index.js, temp.html 파일이 존재하는 것을 확인할 수 있다. 해당 문제는 socket.io를 이용하여 실시간 양방향 통신을 할 수 있는 웹 애플리케이션이다. var socket = io(); // socket.io 서버에 접속한다. socket.emit(); // 서버로 자신의 정보를 전송한다. socket.on(); // 서버로부터의 메시지가 수신하기 위해 on 메소드 사용 flag을 send하면 permission denied, admin only 문자열이 반환된다. 자바스크립트 소스코드에서 username 변수에 담겨 있는 값을 admin으로 바꾸고, $('#m').val()를 'flag'로 바꾸어 콘솔을 실행한 후, 아..

[webhacking.kr] 57번 문제

600점인 57번 문제를 풀어보자. https://webhacking.kr/challenge/web-34/index.php?msg=test&se=if(length(pw)%3E0,sleep(3.0),1) se파라미터에 injection을 시도해보았다. if(length(pw)>0,sleep(3.0),1) : pw의 길이가 0보다 큰 경우 3초간 sleep()하게 된다. 응답 소요시간을 비교하여 pw를 알아낼 수 있다. Time Based SQL Injection 코드를 작성해 pw의 길이와 값을 구하자. 해당 Flag 값을 Auth 페이지에 제출해보자.

[webhacking.kr] 56번 문제

250점인 56번 문제를 풀어보자. admin의 readme를 눌러보면 access denied가 반환된다. guest의 hi~를 눌러보면 hello~가 반환된다. search 부분에 여러가지 값을 제출해보면서 확인한 사항은 검색한 문자가 내부에 존재한다면 해당 no, id, subject 값들이 반환된다. flag를 검색했을 때에는 admin의 readme가 반환된다. 이 뜻은 readme안에 flag문자열이 존재한다는 것이다. 이제 코드를 작성하여 readme 내부에 있는 flag값을 찾아내도록 하자. 코드 작성 중 문자열 검색 부분에서 % 문자를 제외하고 반복문을 사용한 이유는 %문자를 이스케이프 처리하지 않아 %가 출력되기 때문이다. %는 DB쿼리문에서 like 구문을 사용할 때 '%문자%' 형식..

[webhacking.kr] 55번 문제

400점인 55번 문제를 풀어보자. 일정 시간이 지나면 게임 오버 alert창이 뜨게 된다. 3번째 컬럼에 flag값이 담겨있는 것을 확인했으니, flag가 담긴 컬럼명을 얻기위해 limit 절과 procedure analyse() 함수를 사용해보자. rank.php?score=1%20limit%202,1%20procedure%20analyse() 컬럼명 : p4ssw0rd_1123581321 Blind SQL Injection을 시도하기 전에 참/거짓일 때의 반응을 살펴보자 - 참인 경우 jso109817 문자열 출력 - 거짓인 경우 문자열 미출력 이제 flag 길이와 flag 값을 찾기 위한 파이썬 코드를 작성하고 실행해보자. Auth 페이지에 flag 값을 제출해보자.

[webhacking.kr] 54번 문제

100점인 54번 문제를 풀어보자. 소스코드에 들어가보면 자바스크립트 소스가 쓰여있다. setTimeout("answer(0), 1000) : 1000ms(1초) 후에 answer함수에 인자값 0을 넣어 실행해라. 해당 스크립트 코드를 콘솔을 이용해 돌려보니 한 글자씩 문자가 나타났다가 사라진다. aview.innerHTML을 통해 x.responseText에 저장된 값이 출력이 되는데, 이 함수를 aview.innterHTML=x.responseTexst; -> aview.innterHTML+=x.responseTexst; 로 수정하고 마지막 조건문의 if(x.responseText=="") aview.innerHTML="?"; -> if(x.responseText=="") aview.innerHTML..

[webhacking.kr] 53번 문제

350점인 53번 문제를 풀어보자. answer의 값이 $hidden_table이면 문제가 해결된다. val 변수를 이용해서 테이블명을 알아내면 된다. val 변수에는 select, by 문자열은 필터링 된다. val 변수에 여러 값을 입력해보았지만, (1, 2, 3, 4)에 대해서만 반환되는 값이 있었다. select가 필터링 되면 information_schema.tables 나 columns 에서 쿼리를 할 수 없다. 그러나 procedure analyse() 함수를 사용하면 가능하다. 테이블과 필드명을 모른다고 하더라도 test.test.id와 같은 형식으로 출력된 첫번째 필드명을 통해 테이블명을 알 수 있다. 이제 문제 풀이에 적용해보도록 하자. 쿼리문 : ?val=1%20procedure%20..

반응형