별다른게 없다. sql 구문도 딱히 안보이고 소스만보고는 도통 뭐하라는건지 모르겠다.
생각해보니 처음에 힌트에서 데이터베이스 테이블 구조를 알려줬었다.
admin이 등록되는 id 부분이 primary key가 아니라 별 문제없이 중복 등록이 되어야 된다고 생각했다.
근데 안된다. 데이터베이스에서 막는게 아니라면 숨겨진 php소스 어딘가에서 테이블에 값을 넣기 전에 입력된 값과 테이블에 존재하는 admin 사용자를 비교해 중복등록를 해서 막는 것 같다.
그러면 입력된 값이 쿼리에 등록되려면 admin이라는 값과 비교할때는 다른 값으로 들어와 동일한지 체크 하는 과정을 넘어가고 쿼리에 등록될 때는 admin사용자인 것처럼 등록되록 하면 될 것 같다.
말이 쉽지 처음엔 이걸 어떤식으로 해야 될지 감이 안왔다. 일단 구글링.
찾아보니 데이터베이스에 데이터를 삽입할때 지정한 크기 이상의 값이 들어가면 초과된 부분은 잘라내고 trim함수가 적용되어 오른쪽 공백이 싹 다 날라가게 설정이 되어있단다.
이를 활용해 입력시 admin 1이런 방식으로 지정된 크기인 32바이트까지는 공백을 주고 그 이후에 다른 값을 줘봤다. 이런식으로 등록하면 php코드 상에서 비교할 때에는 다른 값이라 체크가 통과되지만 이 값이 sql 쿼리로 넘어갈때 뒤에 초과된 부분과 공백부분이 잘려 php에서 체크하는 필터링을 우회해 중복 등록이 되는 것 같다.
전체적은 흐름은 문제에서 제공해주는 소스에는 보이지 않는 부분이라 대충 이럴거라 유추해본 거라 정확하지 않을 수 있다. 이 문제에서 원하는 핵심 포인트는 데이터베이스의 저런 특성을 알게 하는 것 인 것 같다.
php 상에서 입력값에 길이 제한을 주었기 때문에 burp suit 켰다.