전체 글 36

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 이런 ..

golem 문제 풀이

코드 분석 or, and, substr(, = 문자열들을 필터링한다. 또한 blind로 문자를 하나씩 알아내야 하는 것으로 보인다. 공격 기법 or과 and는 이전 darkelf 문제에서도 설명되었듯이 ||와 &&로 우회할 수 있다. 그렇다면 substr() 함수는 어떻게 우회해야 하는가? mid(), substr(), substring() 이 3가지 함수들은 mysql에서 문자열의 일부분을 가지고 오는 함수들이다. 다른 함수처럼 보이지만, 모두 동일한 역할을 수행하고 사용법마저 동일하다. 이중에서 'substr(' 문자열이 포함되어 있지 않은 mid() 함수를 사용하여 코드를 작성할 수 있다. import requests url = 'https://los.rubiya.kr/chall/golem_4b52..

troll 문제 풀이

코드 분석 where문에서 id 값만을 이용하여 조회하는데 'admin'이라는 문자열을 필터링하고 있다. 하지만 정규표현식에 /i 옵션?을 추가하지 않아 대소문자를 따로 구분한다 공격 기법 mysql에서는 where문에서 대소문자 구분없이 데이터를 찾기 때문에 'Admin', 'AdMiN' 이런 형식의 문자열을 넣게되면 preg_match() 함수를 우회함과 동시에 where 문에서는 참인 결과를 얻을 수 있을 것이다. ?pw=Admin

orge 문제 풀이

코드 분석 필터링 과정에서는 darkelf 문제와 다를 것이 없지만, addslashes() 함수를 사용하여 실제 result의 pw와 내가 입력한 실제 값과 비교하여 solve() 여부를 결정하기 때문에 pw를 직접 추출해 내야 할 것이다. darkelf의 조건문에 and 연산자로 pw의 index값을 찾는 조건을 추가하여 payload를 전송하였다 import requests url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php' password = '' for i in range(1, 8+1): for ct in range(32, 127): payload = f"?pw='||id='admin'%26%26ascii(s..