본문 바로가기

(78)
los 22번 los 22번입니다. 필터링 조건을 보면 cas when 문과 if문 그리고 time based SQL injection에서 사용할 수 있는 sleep, benchmark 함수도 되어 있습니다. 이 문제도 union select를 이용한 error baed SQL injection을 이용해야 할 것 같습니다. 여기서 주목할 점은 에러가 발생할 경우 에러가 발생했다는 표시가 뜨지 않는다는 것입니다. 먼저 ?pw=' or id='admin' and (select 1 union select (length(pw)=n))%23 에서 n값을 바꿔가면 글자 길이를 확인했습니다. 삽질 결과 길이는 8이였습니다. 여기서 가져올 수 있는 조건문이면 에러가 발생하지 않기 때문에 에러가 발생하지 않고 정상적으로 실행된 pw의..
los 21번 Los 21번입니다. 기본적인 error based SQL injection 문제입니다. 이 문제는 쿼리문에 따라 결과를 화면에 출력해주지 않고 에러메시지를 띄워줍니다. 그래서 쿼리문의 에러 여부를 이용해 해결하는 error based SQL injection 공격 방법을 이용해야 합니다. 아래의 프로그램을 이용해서 비밀번호의 길이와 비밀번호를 알아냈습니다. import requests cookies= {'PHPSESSID':'qfvd7i1j71o2j8mkccvhap8bsi'} url = 'https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?' password = '' length = 0 #pw 길이 구하기 (1글자가 4..
los 20번 20번 문제는 다른 조건은 크게 없고 쿼리문에서 주석처리가 되어있다는 점입니다. 그렇기 때문에 개행문자'%0a'를 이용해서 한 줄 개행 해준 뒤 문제를 해결했습니다. 이 부분은 삽질한 부분인데 기존에 하던대로 id를 admin으로 바꿔주려고 했지만 제대로 되지 않았습니다. 아마 db에서 순서가 기존이랑 달라서 그런 것 같았습니다. 그래서 아래처럼 조건을 추가해주니 문제가 해결되었습니다. 답: ?pw=%0a and pw='1' or id='admin
los 19번 19번은 비밀번호를 알아내야 풀리는 문제입니다. 신경 써야 할 조건은 like를 쓰지 못한다는 것과 필터링 된 문자열 정도가 있다라고만 생각하셔도 좋을 것 같습니다. 일단 ?pw=' or id = 'admin' and length(pw) =n %23 위의 구문으로 brute forcing을 진행하여 길이를 알아 냈는데 12였습니다. 여기서부터 계속 막혀서 삽질을 했고 지인에게 힌트를 얻었는데 한글 아스키드라는 힌트를 받았습니다. 그리고 인터넷에 찾아보니까 한글은 크기가 다르면 ascii함수는 2바이트 이상을 반환하지 않기 때문에 ord함수를 사용해야한다는 것을 찾았습니다. 일단 length명령어를 통해 한 글자의 바이트를 알아냈습니다. 한글자는 4바이트 길이이고 총 길이가 12이기 때문에 3글자라는 것 ..
los 18번 18번은 preg_match로 필터링 되는 문자열 중에서 주목해야할 점은 '#','-'이 막혀있어서 기존에 알던 방식으로 쿼리문의 뒷부분을 주석 처리할 수가 없습니다. 그래서 주석 필터링에 대한 자료를 찾아보니 addslahes나 magic_quotes_gpc가 꺼져 있어야 사용할 수 있는 ';%00'을 사용할 수 있습니다. addslahes와 magic_quotes_gpc는 쿼리문에서 오류를 발생시킬 수 있는 문자 앞에 \를 추가해주는 함수입니다. 그리고 괄호가 있기 때문에 이 부분도 우회를 해주어야 했는데 이 부분은 ')를 이용하여 괄호를 닫을 수 있습니다. 그리고 아랫줄에 길이 제한을 하는 조건이 있습니다. 정리하면 우회 해야 할 것 1. 괄호 : ') 이용해서 닫음 2. 주석처리문자인 '#','-..
los 17번 이 문제는 addslashes 함수와 strrev함수가 적용되어 있는 문제입니다. 먼저 strrev함수를 간단하게 설명하면 문자열을 거꾸로 뒤집어준느 함수입니다. 만약 인자가 'abc'라면 'cba'를 반환해 줍니다. 그렇기 때문에 구문을 작성할 때 거꾸로 작성해주어야 합니다. 따라서 #문자는 사용하면 뒷부분이 쿼리문으로 인식하지 않기 때문에 사용이 불가능합니다. 그리고 addslashes함수는 쿼리문에서 오류를 발생할 만한 문자 앞에 특수문자를 추가하여 막아주는 보호기법입니다. 그래서 널값을 추가하면 자동으로 \가 생기는 것을 알 수 있습니다. 이를 이용해서 16번과 동일하게 문제를 해결 하였습니다. 다만 페이로드를 작성할 때는 거꾸로 작성하고 --을 사용한 점만 차이점이 있습니다. 답:?id=%00&..
los 16번 16번은 싱글쿼터가 필터링 되어 있기 때문에 이 부분만 우회하여 비밀번호에 1이 들어가게 되면 풀릴 것으로 예상하고 우회 방법을 열심히 찾아보았습니다. 간단한 방법으로 더블 쿼터를 사용하는 방법이 있지만 저는 이 부분이 통하지 않아서 '\'를 이용하는 우회 방법으로 문제를 해결했습니다. 답부터 보면 답: ?id=\&pw=%20or%201%23입니다. 이 구문은 일단 16번 같은 쿼리문에서 제한적으로 사용이 가능하다고 합니다. 그리고 저 구문에서 \부분 때문에 쿼리문에 보이는 \뒤의 싱글쿼터가 문자열을 마무리 짓지 못하고 '\'and pw=' 부분이 문자열로 인식이 되고 뒷부분이 쿼리문으로 작동한다고 합니다. 그래서 아이디에는 \, 비밀번호에는 or 1#을 넣어주게 되면 문제가 해결되는 것입니다.
los 15번 문제는 굉장히 단순합니다. 싱글 쿼터가 필터링 되어 있습니다. 그리고 쿼리문을 보면 like를 사용합니다. 이번 문제는 like의 특성을 이용하여 문제를 해결 할 수 있었습니다. 간단하게 정리하면 1. pw like 'a%' : 비밀번호가 a로 시작하는 칼럼의 값을 가져옴 2. pw like '%a': 비밀번호가 a로 끝나는 칼럼의 값을 가져옴 3. pw like '%a%' : 비밀번호가 a인 칼럼의 값을 가져옴 이렇게 정리할 수 있습니다. 저는 이 특성을 이용해서 직접 brute forcing을 진행했습니다. 0부터 해보던 중 9로 시작하는 값을 가져오니 guest가 떳습니다. 그래서 계속 해보아도 아무 변화가 없길래 일단 9뒤에 한 자리씩 붙여서 해보기로 결정했습니다. 아주 운이 좋게 0에서 걸렸습니..