728x90

 

드디어 Lord of SQLinjection을 다 끝내게 되었다. sql injection에 대해 많은것을 공부하고 실습할수있는 좋은 경험이였다.

728x90

이 문제는 소스 코드의 길이가 엄청 길다. 그래도 차근차근 읽어보자. 함수 reset_flag가 flag를 매번 리셋시키는것을 볼수있다. 그리고 여러가지 것들을 필터링하고 있다. 또 flag값은 100보다 크지않다. 일단 그냥 blind sql injection을 쓰면 reset_flag때문에 틀릴때 마다 초기화된다. 그래서 리셋이 되지 않기 위해서 에러 쿼리를 사용하자. 그런데 그렇게 되면 참과 거짓을 판단할수없다. 그럴때 쓰는게 바로 time based blind sql injection이다. sleep을 이용해서 참일때는 어느정도 돌고 거짓이면 실행이 안되게 코딩을 해주자.

 

 

이렇게 pw가 나오게 된다.

 

 

 

728x90

 

이 문제도 그냥 풀렸다......

728x90

 

아무것도 안했는데 풀렸다. 문제에 취약점이 발견된것같다.

728x90

아까 풀었던 21번 문제와 거의 똑같다. 그냥 필터링이 좀더 들어간것 같다. 그리고 오류 메세지를 출력하지 않는다. 그러나 화면에 진짜 아무런 값도 출력하지 않기때문에 이걸 이용해서 코딩을 해보자.

 

 

pw가 나왔다. ?pw=5a2f5d3c를 이제 쳐보자.

 

문제가 풀렸다. 이건 21번 문제를 풀었으면 쉽게 풀수있을것이다.

728x90

 

소스 코드를 보면 error가 발생했을때 쿼리문을 출력시키는것을 볼수있다. 그리고 싱글쿼터를 필터링하지도 않는다. 이러면 우리는 error based sql injection을 시도해볼수있다. 확실히 쓸수있는지 알아보기위해 에러를 내보자.

 

 

역시 에러문을 그대로 출력해준다. 이렇게되면 이 문제는 거의 error based sql injection이라고 볼수있다. 오류가 나는지 안나는지 여부를 확인하는 코드를 짜서 문제를 풀어보자.

 

 

pw가 나왔다. 이때까지와는 뭔가 달라보인다. 일단 ?pw=!!!!를 쳐보자.

 

 

풀렸다. 답이 좀 그렇긴 해도 오랜만에 보는 error based sql injection이라서 신선했다.

 

 

 

728x90

 

소스 코드를 보면 id='guest'뒤에 #로 주석처리가 되어있다. #는 한줄주석이라서 그냥 개행문자를 써주고 뒤에 admin으로 pw를 맞춰주면 될것같다. 쿼리를 짜보면 ?pw=%0a and 0 or id='admin'%23이 나온다. 이제 넣어보자.

 

역시 풀리게 된다. 이건 #으로 인한 주석처리를 어떻게 피할것인지 묻는 기본적인 문제였다. 

728x90

 

오랜만에 blind sql injection문제이다. regex와 like를 필터링 하고 있다. 일단 그건 그렇다 치고 pw의 길이부터 구해보자.

 

 

 

?pw='||length(pw)<20%23을 넣었는데 거짓이라고 뜬다.

 

 

?pw='||length(substr(pw,1,1))=4%23를 넣어보면 참이 뜬다. 한글자당 4바이트인걸 보면 유니코드같다. 유니코드이므로 ascii말고 ord를 이용해서 풀어야겠다. 코딩을 해봤다.

 

 

이렇게 나왔다. 이제 이 10진수를 16진수로 바꾸고 유니코드로 보자.

 

 

이렇게 나왔다. 이제 저 값을 넣어보자. ?pw=¸ùÅ°ÆÐÄ¡¤»라고 치면 될것같다.

 

풀리게 되었다. 이건 유니코드인지 알아차리는게 중요할것같다.

 

 

 

 

 

 

 

728x90

 

소스 코드를 보면 pw의 길이가 6보다 크면 안되고 #와 --등 모든 주석을 필터링하고 있다. 그런데 보면 ;%00은 필터링 하지 않는것으로 보인다. 이제 쿼리를 짜보면 ?pw=')=0;%00으로 써주면 될것같다. %23이 필터링 되니 ;%00으로 바꿔서 써준것이다. 한번 넣어보자.

 

 

역시 풀렸다. ;%00을 아는지 묻는 문제인것같다.

728x90

 

이번 문제는 바로 앞 16번 문제의 ereg를 preg_match로 바꿔준 문제이다. 이렇게 되면 \를 이용하면 된다.  \를 이용하여 '를 문자열 취급해주는것이다. 이 문제에서는 ?id=\를 쳐보자.

 

 

이렇게 나오게 된다. 여기서 '\' and pw='가 한개의 문자열로 취급이 된다. 그래서 그걸 이용해서 쿼리를 짜보면 ?id=\&pw= or 1=1%23라고 볼수있다.

 

 

그러면 이렇게 풀리게 된다.

 

+ Recent posts