본문 바로가기

IT/웹 해킹(Web Hacking)

webhacking.kr [문제 18번]








세번째 라인의 마지막 주자인 18번 문제를 풀어보겠다.





해당 문제의 배점은 100point이다.




해당 문제에 접속해보자





문제에 접속하자 마자



해당 문제의 해결책이 SQL INJECTION이라는 힌트가 주어져 있고,


인젝션할 쿼리를 포함하는 페이지의 소스가 주어진다.




주저없이 해당 인덱스 페이지의 소스코드를 살펴보자.





해당 소스코드에서 눈에 띄는 점 두 부분이 있다.





첫번째, 특정한 문자열을 필터링 하는 부분이다.



조건문을 확인해보면,


eregi(인자1, 인자2) 함수를 이용하여


특정한 문자열들을 필터링 하고 있다.



보고 확인 가능하지만 대략적으로 공백문자, '/', '&', 'union', 'select', 'from', '0x' 등의 문자열들을 필터링 하고 있다.


다음과 같은 문자열을 이용하여


sql injection을 시도하려 한다면,


exit() 함수가 실행되어, 종료하게 된다.





두번째, 실제로 인젝션할 수행할 쿼리를 담고있는 부분이다.





mysql_fetch_array("쿼리문")을 이용하여,


해당 쿼리문의 결과 데이터를 


변수 $q에 배열 형식으로 담고 있다.


그후 결과 데이터를 이용하여,


만약 배열의 첫번째 데이터가 "admin"


의미한다면, 문제가 풀리는 것으로 확인된다.




임의로 데이터를 0~2까지 입력해보겠다.











해당 결과에 대하여 조금 더 생각해보자.


일반적으로 숫자 1값의 True(참)을 뜻하며, 이외의 값들은 모두 거짓을 뜻하는 것을 알 수 있다.



select id from challenge18_table (where ((id='guest') and (no=1)))



해당 결과를 토대로


조건1과 조건 2의


(조건1:True)  and (조건2:True) 가 성립되어,


해당 조건 전체가 참이 된다는 것을 알 수 있다.



그러한 결과를 기반으로 


쿼리문으로 추출해낸 데이터는 결국  guest를 의미하게 되는 것이다.




앞에 해당 조건들을 거짓으로 만들어야 한다.





다음과 같은 쿼리를 입력하게 되면


어떨까?


select id from challenge18_table (where ((id='guest') and (no=-1)) or (no=1))



결과적으로 좌측 부분의 조건이 거짓이 되고 우측 부분의 조건은 사실이 되어


전체적인 쿼리는 참이 될것이다.


그리고 no=1에 데이터 대하여 추출하므로


결과적으로 no=1인 데이터의 id값을 뽑아낼 것이다.








이를 토대로 한가지 사실을 더 알아낼 수 있는 데,



데이터의 컬럼  no값이 1이라면 guest를 의미하는 것이다.




일반적으로 no값이 (primary_key)이고 자동적으로 데이터 하나가 추가될 때 마다 증가한다면



no 값이 순차적으로 증가하여 분명 특정 no값에 'admin' 데이터를 담고 있을 것이다.



이제부터 no값을 하나씩 증가시켜 쿼리를 날려보자.








no값이 바로 하나 증가한 no=2가 admin을 담고 있었다.




풀이 완료.



공백은 Line feed (%0a)로 우회하였습니다.













'IT > 웹 해킹(Web Hacking)' 카테고리의 다른 글

webhacking.kr [문제 21번]  (6) 2018.03.25
webhacking.kr [문제 20번]  (0) 2018.03.17
webhacking.kr [문제 17번]  (0) 2018.03.13
webhacking.kr [문제 16번]  (0) 2018.03.12
webhacking.kr [문제 15번]  (0) 2018.03.10