문제 접근 시 md5('value', true); 라는 메시지를 던져주고 있다.
문제를 풀어보자.
문제 접근 시 password 입력창이 확인 가능하다.
아래의 링크를 클릭해 소스를 보자.
소스코드를 보면, POST 메소드로 전달되는 ps 파라미터에 담기는 데이터가 쿼리에 md5($ps, true) 형태로 들어가게 된다. 이렇게 쿼리가 실행되어 데이터가 존재하면 문제는 풀리게 된다.
쿼리의 결과는 무조건 참이되어야 한다는거다.
md5($ps,true)의 암호화가 취약하다는 결론이 내려진다.
구글링을 해보자.
구글링 결과 md5 raw hash를 이용한 sql injection 자료를 찾았다.
md5 ()의 경우
case1) md5("문자열") 로 암호화 함수가 사용되면 32자리의 16진수 값을 반환하고,
case2 ) md5("문자열", true) 로 암호화 함수가 사용되면 16자리의 바이너리 형식으로 변환된다고 한다.
두번째 인자가 설정되지 않을 경우, default 값은 false(case1)가 된다.
문제에선 case2의 형태이므로, ' or '1 과 같이 항상 참이되는 SQLi 공격 구문이 되는 바이너리 코드로 변환될 수 있는 인자값을 찾아보자. 직접 찾아보기엔 시행착오가 크니 구글검색을 통해 찾아보았다.
"129581926211651571912466741651878684928"
해당 값을 문제의 패스워드에 넣어보자.
패스워드란에 해당 값 입력 시 FLAG 값 획득이 가능하다.
**POINT : md5 raw hash를 이용한 SQLi에 대해서 알고 있는가?