두 번째로 풀 문제는 cobolt
분석
이전 그렘린 문제와 비슷하게 구성되어있으나, if 부분에 admin을 검사하는 것이 추가되었습니다.
그러면 id가 admin이어야 한다는 정보를 주고 있네요.
id가 admin이고 pw는 md5로 해싱됩니다.
방식이 여러가지 있겠지만, 처음에 이건 될까 ? 싶어서 생각해본 방식 중 하나는
이렇게 넣어주는 것이었습니다. (참고로 #는 ascii로 0x23 => %23임)
그러면 id가 admin이고 쿼리가 참이 되리라 생각했지만 위에 보시다시피 admin이 아니라고 나옵니다.
이유를 생각해보면 and 연산과 or 연산 때문 일 것 같습니다.
그래서 DB를 만들어서 해봤습니다.
시나리오 테스트
member라는 테이블에 칼럼을 다음과 같이 구성해두었습니다.
여기서 위와 같이 쿼리를 입력하면 admin이 아닌 다른 멤버들이 모두 나옵니다.
그 이유로 추측하는건
where 문에서 or 연산 전후로 구분되기 때문에,
user_id가 admin이고 user_pw가 md5('') 이거나 참이면
user_id를 반환한다.
이러면 admin이고 md5('')이 존재하지 않아도 user_id를 모두 반환할 수 있으므로 다 반환한다고 생각됩니다.
실제로 md5 공백의 값도 존재하고요.
음.. 예상은 그렇게 되니까
이제 풀어봅시다.
풀이
그렇다면 id가 admin인것만 선택되도록 쿼리를 작성하면 됩니다. 가령 pw부분이 and가 아니라 or이 되게 한다면
id 부분을 조작해서 or 로 pw 부분을 만들고 나머지를 주석처리 해도
admin이거나 pw가 공백인 칼럼을 고르기 때문에 (확률적으로)admin이 반환됩니다.
근데 굳이??
싶으니
그냥 id 부분에서 주석처리해서 id가 admin인 것만 반환하도록 만들어도 됩니다.(공부하기 위해서 뻘짓한 것)
이렇게만 바꿔주어도 아래 pw를 검사하지 않고 바로 id가 admin인 칼럼만 찾으므로 풀 수 있습니다.