본문 바로가기

웹/sfw

(7)
sfw8 (페이지 변조 XSS) sfw8입니다. 문제를 보면 admin을 alert하면 될 거 같긴합니다. 위의 그림처럼 단순히 admin을 script태그로 alert할려고 하면 필터링 되어서 안되는 것 같습니다. 그리고 아무 글자를 입력해서 버튼을 누르면 화면에 그대로 출력되는 것 같습니다. 그렇다면 일단 소스코드를 보겠습니다. script부분을 주목해야 할 것 같습니다. admin이 일단 필터링 되는 것처럼 보이고 onload, onerror의 핸들러, write나 char을 통해 함수를 사용하는 방법 등도 필터링 되어 있는 것 같습니다. 간단하게 필터링 하는 방법으로는 admin을 hex값으로 바꾸어서 우회하는 방법이 있습니다. 먼저 hex값으로 바꾼 코드는 아래의 코드였습니다. 이렇게 넣은 이유는 sql injection을 할..
sfw6 (XSS) sfw6은 보이는 것처럼 게시판 형태의 플레이리스트(?)가 나열되어 있는 페이지로 시작합니다. 처음에 이 문제를 보고 순간 멍 때렸던 것 같습니다. 어디서부터 손을 대야할지 모르는 문제였습니다. 기존까지 SQL 인젝션 문제만 풀다보니 생각이 되게 SQL 인젝션에 국한되어 있었던 것 같습니다. 그래서 소스코드를 보니 떡하니 아래와 같은 메시지가 있었습니다. 웹 문제도 소스코드를 보면서 분석해야 한다는 것을 간과했던 것 같습니다. 메시지를 해석해보면 옳지 않은 노래라면 사이트에 링크를 alert하라였습니다. "제목.kr"을 입력하면 되고 공백은 있으면 안 된다였습니다. 열심히 노래 제목을 검색해 보니 some things never change라는 노래에 x표시가 되어 있더군요. 그래서 그대로 입력했지만 당..
sfw5 (information schema SQL injection) sfw5 문제에 들어가면 위 사진처럼 회원가입 페이지와 로그인 페이지로 나뉩니다. 아이디와 비밀번호는 간단하게 만들어서 로그인해보겠습니다. 이 부분은 제가 삽질한 부분도 포함됩니다. 지금처럼 로그인을하면 왼쪽 상단에 아이디가 뜨고 게시글을 적으면 아래에 게시글 목록들이 뜨는 것을 알 수 있습니다. 그리고 플래그 부분을 들어가보니 관리자 계정의 아이디와 비밀번호를 획득해야 플래그를 얻는 구조 같습니다. 삽질 시작 1... 제가 이 문제에서 엄청 삽질을 많이 했습니다. 우선 처음은 취약점 위치를 잘못 파악해서 한 삽질이었습니다. information schema관련 문제를 풀 때는 일정한 순서가 있습니다. 1. 칼럼 갯수를 알아낸다. 2. 칼럼 갯수를 알냈다면 database()를 통해 현재 사용중인 db이..
sfw4 (error based SQL injection) sfw는 에러 기반 SQL injection 문제입니다. 이 문제는 union select문을 이용해 간단히 에러를 확인할 수 있었습니다. 간단한 에러 기반 SQL injection에 사용되는 쿼리인 pw=' or id='admin' and (select 1 union select length(pw)=10) %23을 입력해주니 아래 결과처럼 에러 메시지가 보였습니다. 그래서 길이 값을 바꿔가면서 삽질을 했더니 길이를 알아낼 수 있었습니다. 위의 쿼리문에서 length(pw)를 pw like 구문으로 쿼리문을 수정해주어 아래의 파이썬 코드로 문제를 해결했습니다. import requests url='http://sfwebstudy.ml/sfw4/sw4.php?' header={'Cookie':'PHPSES..
sfw3 (time based SQL injection) sfw3번입니다. 이 문제를 처음 풀 때는 sleep, benchmark 함수가 필터링으로 막혀있길래 저는 당연히 에러 기반 sql injection 문제로 알고 삽질을 했습니다. 하지만 아무리 에러 기반으로 풀어도 별다른 실마리를 발견하지 못했습니다. 그래서 이 문제를 내준 동아리 친구에게 물어보니 time based SQL injection 문제라는 이야기를 듣고 충격을 좀 받았습니다. 그래서 열심히 구글링과 삽질을 통해 sleep함수와 benchmark 함수 없이 time based sql injection 방법을 검색해보니 헤비 쿼리를 이용한 방법이 있었습니다. 이 방법은 benchmark함수와 비슷하게 굉장히 큰 값을 db에서 가져와서 시간을 지연시키는 방식입니다. 여기서 사용한 쿼리는 (sel..
sfw2 (blind SQL injection) sfw2 입니다. 일단 1번과 다르게 no의 값도 가져오며 oreder by를 통해 정렬하는거 같습니다. 그래서 일단 pw값으로 삽질해보니 아무것도 바뀌지 않아서 no의 값으로 order by 해보았습니다. 단순히 1로 정렬하면 아무것도 뜨지 않고 desc로 거꾸로 정렬해주니 다음 단계로 넘어가는것 같습니다. 여기서 이제 출제자에게 물어보니 LOS에서 풀었던것 처럼 직접 비밀번호를 구해야 한다고 합니다. 그래서 쿼리문을 만들어서 비밀번호의 길이와 비밀번호를 직접 알아냈습니다. 아래는 비밀번호의 길이와 값을 구한 쿼리문입니다. 길이 : ?no=1%20desc&pw=%27%20||%20id%20in%20(0x61646d696e)%20%26%26%20length(pw)
sfw1 (simple SQL injection) sfw 1번 문제입니다. 아무것도 없어서 일단 pw에 ' || 1=1#를 넣어보았습니다. 당연히 결과는 아래처럼 안 되었습니다. 아마 필터링 되는 문자일 경우 이렇게 뜨는 것 같습니다. 그래서 이것저것 넣어보니 or, admin,=, 싱글 쿼터, 공백 등이 안 되는 것 같습니다. 일단 blind sql injection 문제가 아니어서 아마 가져오는 id값이 admin이면 되지 않을까 생각했습니다. 일단 평범하게 pw=' or id='admin' 등은 필터링이 되기 때문에 되지 않습니다. 그래서 admin을 아스키코드 값으로 0x61646d696e로 바꾸고 등호는 like로, 등호는 %0a로 필터링 우회 해주니까 문제가 해결되었습니다.