Lord of SQL injection 21

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

wolfman 문제 풀이

코드 분석 pw를 입력받고 오직 공백 문자만을 필터링하는 모습 공격 기법 mysql에서 공백 문자 없이 쿼리를 실행하면 syntax error (구문 에러)가 나는 경우가 생긴다 /*예시 쿼리*/ select * from EMPLOYEE where name='Clark'or1=1 /*or1=1 에서 syntax error 발생*/ 이를 우회하기 위해서는 여러 방법들이 있지만 필자는 주석을 사용하였다 mysql 주석에는 #, -- 말고도 /* */를 통해 여러줄의 주석을 작성할 수 있는 방법이 존재한다. 이를 쿼리 중간에 열고 닫게 되면 공백 문자를 사용하지 않아도 정상적으로 실행이 된다. ?pw='/**/or/**/id='admin'/**/and/**/1=1/**/--/**/' 물론 이 방법 이외에도 괄..

orc 문제 풀이

코드 분석 별도의 필터링은 존재하지 않는다. 하지만, result의 pw와 $_GET['pw']의 문자열을 직접 비교하여 맞는 지 확인하는 코드가 존재한다. 이 말은 즉슨 조건문을 참으로 만드는 것이 끝이 아니라 실제 admin의 password를 알아내어야 한다. 공격 기법 이를 알아내기 위해서는 이전 글에서 다루었던 SUBSTR() 함수를 사용하여 admin의 pw와 한 글자씩 매칭하여 맞다면 조건문이 참이 되도록 쿼리를 작성하여야 한다. 이런 식으로 쿼리에 대한 결과가 참인지 거짓인지에 따라 다른 응답을 주는 점을 이용하여 정보를 얻어내는 공격을 Blind SQL Injection이라고 부른다. 우선 admin의 pw 길이를 알아내기 위해 LENGTH() 함수를 사용하여 ?pw=' or LENGTH..

goblin 문제 풀이

코드 분석 ' (single quote), " (double quote), ` (back tick) 을 필터링하는 모습을 볼 수 있다. 또한 id가 guest로 정해져있는데 이 쿼리를 실행하였을 때 id가 admin이어야 한다. 공격 기법 우선 $_GET[no]를 통해 전달받은 값을 문자열로 감싸지 않기 때문에 escape에 대한 걱정은 하지 않아도 된다. 그렇다면 남은 것은 id를 admin으로 조회하도록 하는 것인데, 쿼터가 모두 필터링 되기 때문에 직접적인 문자열 비교는 되지 않을 것이다. 이를 우회하기 위해서는 여러 함수들이 있겠지만 필자는 SUBSTR() 함수와 CHAR() 함수를 사용하여 문제를 풀었다. 우선 mysql의 SUBSTR() 함수는 문자열의 임의의 위치를 추출해주는 함수인데, SU..

cobolt 문제 풀이

코드 분석 지난 문제와 마찬가지로 별다른 필터링은 존재하지 않으나 pw로 입력받은 값을 md5함수에 넣어서 쿼리를 실행한다. 또한 result['id']가 존재하는지만 검사하지 않고 id가 admin인지 검사하고, id가 admin이 아니면 'You are not admin :('이라는 문자열을 출력하는 것으로 보아 prob_cobolt 테이블에는 여러 id가 존재하는 것으로 보인다. 공격 기법 우선 지난 문제와 똑같은 값을 id에 주입해보면 ?id=' or 1=1 -- ' where문의 결과가 참이 되었지만 admin이 아닌 rubiya라는 id가 가장 먼저 조회되어 문제가 풀리지 않는다 이것을 해결하기 위해선 mysql의 LIMIT 을 사용할 수 있다. LIMIT 은 mysql의 select에서 조회..