본문 바로가기

해킹 공부/웹해킹

SQL injection, MD5 raw

 

51번 문제

 

간단한 문제였다. sql injection의 기본과 해시 구하는 문제? 사실 검색을 해서 해시 값을 직접 구하지 않고 해결해서 비교적 쉬웠지만, 정석대로 이전에 내가 sha1함수를 활용해 rainbow table을 만들고 sql injection을 위한 query문을 직접 만드는 방식이었다면 굉장히 오래걸렸을 것이다.

 

51번 문제는 위와 같이 누가봐도 sql injection 인 것 같은 문제 화면이다.

view_source를 눌러 php 코드를 확인해보자.

 

 

view_source

 

select id from chall 51 where id='{$input_id}' and pw='{$input_pw}' 부분을 집중적으로 보면, '{$input_pw}' 부분에 임의의 값' or '1(0아닌 값) 을 삽입하는 sql injection을 시행하면 된다는 것을 알 수 있다. {$input_id}는 addslashes 함수 때문에 우회가 힘들어 보인다.

 

그래서 {$input_pw}가 어떻게 생성되나 코드 윗부분을 보았더니, 'pw'에 md5를 해준 값이었는데, 보통 md5 함수에 다른 파라미터가 있는것은 처음 봐서 한번 찾아보았다.

www.w3schools.com/php/func_string_md5.asp

 

PHP md5() Function

PHP md5() Function ❮ PHP String Reference Example Calculate the MD5 hash of the string "Hello": <?php $str = "Hello"; echo md5($str); ?> Try it Yourself » Definition and Usage The md5() function calculates the MD5 hash of a string. The md5() function us

www.w3schools.com

md5함수의 두번째 파라미터는 'raw'를 의미하는 거였는데, 보통 md5를 하면 hex format인데, 이것을 binary format으로 구하려면 뒤에 true를 붙여주는 것 같았다. 

 

즉, 이렇게 'pw'에 md5를 binary format으로 해주었을 때 값이 임의의 값' or '1 이어야 하는 것이다. (sql injection + hash 값 구하는게 혼합된 문제)

 

 

 

그래서 md5는 해시함수이다 보니, 직접 sha1 함수처럼 모두 출력해 rainbow table을 만드는 것 밖에 방법이 없는 것 같았는데, 혹시라도 해서 md5와 sql injection을 찾아보았더니, 누군가가 CTF에서 직접 해놓은 게 있었다...

cvk.posthaven.com/sql-injection-with-raw-md5-hashes

 

SQL injection with raw MD5 hashes (Leet More CTF 2010 injection 300)

The University of Florida Student Infosec Team competed in the Leet More CTF 2010 yesterday. It was a 24-hour challenge-based event sort of like DEFCON quals. Ian and I made the team some...

cvk.posthaven.com

 (이분들도 계산을 최소화했는데도 2-3일 걸릴만한 코드를 짰고, 우연히 몇시간에 걸쳐 답을 찾은 것 같았다...)

 

 

 

그래서 해당 값을 가져와봤다.

값이129581926211651571912466741651878684928 라고 되어있는데, 직접 파이썬으로 돌려보니 맞았다. 

보통 해시 함수를 적용해주고 hexdigest()를 해주는데, raw가 true라면 binary format이므로 digest()를 해주면 된다.

value에 or '8 부분이 포함되어 있는지가 중요한데, value_binary 출력을 통해서 포함되어 있음을 확인할 수 있었고, 해시함수인 md5는 문자열만 보고 or 부분만 따로 뽑아낼 수 없기 때문에, 결국 value를 pw에 그대로 입력해 문제를 풀 수 있었다.

 

import hashlib
import binascii

value= "129581926211651571912466741651878684928"
value=value.encode('utf-8')

value_md5=hashlib.md5(value)
value_hex= value_md5.hexdigest()
value_binary= value_md5.digest()

print(value_hex) #md 5 
print(value_binary) #md 5 true


or_hex= binascii.hexlify(b"'or'8")

print(or_hex) #or md5 true