워게임,CTF/lord of sql injection

[lord of sql injection] dark_eyes writeup

Haemaa 2023. 10. 13. 17:45

오늘 풀어볼 문제는 dark_eyes 이다. lord of sql injection은 가상 머신을 킬 필요도 없고 간편하게 풀 수 있지만 간단해보이는 이면에 시간이 굉장히 오래 걸린다 ㅠ

 

문제는 요렇게 생겼다. if나 case when 같은 조건문 구문이 막혀있어 이를 우회하여 문제를 풀어야 할 것 같다.

 

 

pw=1을 테스트삼아 넣어보자.

 

그 이후 1' 을 넣어보면 구문이 문법에 맞지 않아 exit()가 실행되어 아무것도 출력되지 않는다.

 

주석으로 뒤 따옴표를 없애주니 잘 출력된다.

 

이전 문제에서도 봤듯이 error based가 아니라도 에러가 발생하는상황을 통해 참/거짓을 구분할 수 있는 error based blind sql injection을 실행할 수 있을 것 같다.

 

그럼 참일 때는 정상적인 구문이 되고 거짓일 때는 에러가 나는 구문이 될까? 하면 if나 case when이 막혀있으므로 power라는 함수를 사용할 수 있다.

power (a,b) 는 a의 b 제곱이다.

 

이런 식으로 적어주면 현재 power 앞 인자가 1이므로 1의 9999999.... 제곱은 어차피 1이라서 정상적인 값이 나온다.

 

그런데 앞 인자에 2를 적어주는 순간 값이 너무 커져버려 에러가 나버린다.

 

그럼 저 앞 인자에 length(pw) 를 적어주면 어떻게 될까? 분명 에러가 날 것이다. 길이가 1일리는 없을 테니까..

 

 

처음엔 이렇게 blind sql injectiono처럼 length(pw) > 0 을 삽입했다.

 

그럼 저렇게 ( length(pw) > 0 ) + 1 을 해주면 참이 되는 구간에서 부등식이 1이 될테고 1 +1 이 되어 에러가 날 것이라고 예상했다.

그런데 그럼 ( length(pw) > 100 ) 은 거짓일 확률이 높을테니 0 이 나올 것이고 1을 더하면 1이어서 정상구문이 출력되어야 하는데 에러가 나왔다...왜 안되는 걸까?

 

그래서 방법을 변경하여 length(pw) 자체에서 값을 빼주기로 했다.

 

이렇게 9를 빼주니 정상값이 출력되었다. 그런데 이렇게 정상값이 나온다고 해서 length(pw)가 10글자라는 말이 아니다.

 

 

8도 정상값이 나오고

 

7도 정상값이 나온다.

이 말은 7로 뺐을 때 식의 값이 1이고 8로 뺐을 때 식의 값이 0이고 9로 뺐을 때 식의 값이 -1이라 제곱을 해도 정상값이 나올 수 있는 것이다.

 

보다시피 6으로 뺐을 경우엔 에러가 난다. 따라서 pw의 길이는 8글자이다.

 

 

그리고 이 규칙을 통해 알 수 있는 건 blind sql injection 값을 넣을 때 하나씩 대입할 필요가 없이 3 차이만큼 대입해도 상관없다는 것이다. 정상값이 나오는 범위에 들기만 하면 되니까.

 

pw의 첫글자가 뭘지 처음에 찍어서 51을 넣어보았다. 에러다.

 

 

그 다음에는 3증가시켜 54를 넣으면 정상값이 나온다. 걸렸다!

 

이걸 반복하면 답은 5a2f5d3c가 나온다.

 

숫자 부분 다음엔 꼭 소문자 알파벳이 나와서 범위를 특정하기가 쉬웠다. 물론 자동화도구를 쓰면 상관없지만..이건 노가다로 풀고 싶었음ㅋㅋ

 

 

다른 writeup과는 분명 다르게 풀었을 것 같다. 문제에서 의도한 건 이게 아닐 수도 있지만~나름대로 풀이 성공!