웹해킹 21

iron_golem 문제 풀이

코드 분석 쿼리를 실행하였을 때 에러가 발생하면 exit(mysqli_error($db)); 를 통해 에러를 출력해준다. 또한 pw의 값을 정확히 알아내어야 문제를 풀 수 있게끔 되어있다. 공격 기법 mysql에서는 if문을 사용하여서 조건이 참이 되었을 때, 다음 쿼리를 실행하는 구문이 존재한다. 해당 특징을 통해 비밀번호의 길이에 대한 조건문이 참이 되었을 때, 에러가 발생하는 쿼리를 실행하도록 주입하여보자. ' or if(length(pw) '#') 조건이 참이되어 "Subquery returns more than 1 row"라는 에러가 발생하였다. 1부터 증가시키며 pw의 길이가 32라는 것을 알아내었고, 해당..

xavis 문제 풀이

코드 분석 pw에 'regex', 'like' 라는 문자열이 있는지 검사한다. 공격 기법 ASCII() 함수를 사용해서 Blind SQL Injection을 시도하였지만 값이 제대로 나오지 않았다. 그래서 ASCII() 대신 HEX() 함수를 사용하여 pw의 Length를 측정해보았다. ' or length(hex(pw)) = 24 #' HEX() 함수를 통해 한 자리씩 알아내보면 0000c6b00000c6550000ad73 이러한 값이 나오고, 유니코드의 형식처럼 생겨서 한글 유니코드를 사이트에 검색해보면, Hangul Syllables — Unicode Character Table Hangul Syllables — Unicode Character Table Hangul Syllables 가ac00 각..

nightmare 문제 풀이

코드 분석 pw의 길이는 최대 6까지만 입력받을 수 있고, #과 -를 필터링하고 있어 다른 주석 방법을 찾아야 한다. 공격 기법 mysql에서 주석을 표현하는데 있어서는 #과 -- 이외에도 ;%00 을 이용할 수 있다. 또한 (거짓=거짓) = 참 이라는 원리를 이용하여 pw=('')=0 을 해주면 조건문의 결과는 참이 된다. ')=0;%00 (%00은 한 글자로 인식) 이렇게 딱 길이가 6인 payload를 주입해주면 문제가 풀린다.

zombie_assasin 문제 풀이

코드 분석 id와 pw를 받아서 모두 addslashes() 함수에 전달하고, 그 반환값으로 strrev() 함수에 전달하여 그 결과값을 저장한다. addslashes() 함수는 ' (싱글 쿼터), " (더블 쿼터), \ (백슬래시), NULL 문자가 있다면 바로 앞에 \ (백슬래시)를 붙여주어 sql injection 방지를 도와주는 함수 중 하나이다. 또한 strrev() 함수는 문자열로 받은 인자를 뒤집어서 반환하는 함수이다. 공격 기법 우선 id 입력값으로 escape를 시도하기 위해 ' (싱글 쿼터)를 입력해보면 ' -> addslashes() = \' -> strrev() = '\ 가 되어 이런 쿼리가 완성되어 escape가 되지 않는다. 여기서 위의 addslashes() 함수의 설명을 다시..

succubus 문제 풀이

코드 분석 id와 pw 두 문자열 모두 따옴표가 있는지 체크한다. 공격 기법 따옴표가 필터링되어 있어 escape가 불가능해 보이지만, '\' (역슬래시)를 이용하면 뒤에 오는 따옴표를 문자로 처리할 수 있다. 자세한 설명 만약, id에 \ 를 주입하게 되면 무슨 일이 생기는지 알아보자 \로 인해 바로 뒤에 있는 싱글 쿼터가 id와 비교하는 문자열을 닫아주지 않고, 실제 문자 '로 받아들여 뒤에 있는 and pw = ' 까지 id와 비교하는 문자열로 치환된다. 이제 pw에 or 1 # 을 주입한다면 아래와 같은 쿼리가 완성되어 참을 반환할 것이다.

assasin 문제 풀이

코드 분석 pw를 입력받아 like 구문 안에 주입된다. 또한 쿼리의 결과값 중 id가 'admin'이어야 solve가 된다. 공격 기법 싱글 쿼터가 필터링되어 escape를 할 수는 없고 like 구문 안에서 해결해야 한다. mysql의 like에서는 우리가 흔히 알고 있는 '%' 문자 말고도 '_' 문자를 사용할 수 있다. 이는 정규표현식에서 '.'와 같은 역할을 하는데, 이는 임의의 문자를 뜻한다. 따라서 '_'를 추가해가며 비밀번호의 길이를 알아낼 수 있을 것이고, 한 글자씩 직접 지정하여 admin의 pw를 알아낼 수 있을 것이다.

giant 문제 풀이

코드 분석 shit으로 입력을 받아 'from'과 'prob_giant' 문자열 사이를 띄워 쿼리가 실행이 되기만 하면 solve() 함수를 실행시킨다. 하지만 strlen()으로 길이 검사를 하였을 때 1을 넘으면 안 되고, 공백, \n, \r, \t가 필터링된다. 공격 기법 https://butt3r-cat.tistory.com/entry/LOS-Lord-of-SQL-Injection-5%EB%B2%88-wolfman-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4 해당 링크를 참고해보면, 공백을 대체할 수 있는 문자들을 볼 수 있다. 이 중에서 \n (line feed), \r (carriage return), \t (tab)를 제외하면 %0b (vertical tab), %0c ..

bugbear 문제 풀이

코드 분석 따옴표, substr, ascii, =, or, and, 공백, like, 0x 해당 문자열들을 필터링한다. pw에 넘겨진 값과 result의 pw와 직접 비교하여 맞으면 solve() 함수를 실행하기 때문에 pw의 값을 알아내야 한다. 공격 기법 이전 포스팅에서 사용하였던 ORD() 함수는 'or' 문자열이 포함되어 있기 때문에 사용하지 못한다. 따라서 HEX() 함수를 사용해서 hex 값을 알아내고, 이를 CONV(hex값, 16, 10)으로 10진수로 변환하였다. 그리고 조건이 참이 되었지만 guest도 같이 조회되었기 때문에 id != "guest"를 시도하였다. 하지만 '='가 필터링되기 때문에 mysql에서 제공하는 '' 연산자를 사용하여 !=와 같은 효과를 만들어내었다.

darkknight 문제 풀이

코드 분석 pw는 따옴표를 입력받지 못하게 하여 escape를 방지하였지만 no에서는 injection이 가능하다. 하지만 golem 문제와 같이 'substr' 문자열을 필터링하고, 'ascii' 문자열까지 필터링한다. 공격 기법 mysql에서는 ASCII() 함수와 비슷한 ORD() 함수를 제공한다. 두 함수의 차이점으로는 ASCII() 함수는 문자열의 가장 왼쪽 문자의 아스키 코드 값을 반환하고, ORD() 함수는 아스키 코드 값을 반환한다. 사실상 SUBSTR()과 같은 함수를 사용하여 한 글자씩 두 함수에 넣는다면 같은 값을 반환할 것이다. SUBSTR() 함수를 우회하는 방법은 이전 포스팅에 소개되었으니 바로 blind sql injection 코드를 작성해주면 pw : 0b70ea1f 이런 ..