문제 화면입니다.
힌트가 될만한 소스 코드는 따로 존재하지 않으며
문제에 적혀있듯이 blind sql injection을 활용해야 합니다.
일단 id와 pw에 guest를 넣어보면
로그인에 성공한 모습을 볼 수 있습니다.
또한 url을 통해 값을 전달하고 있음을 알 수 있습니다.
이제 첫 번째로 pw의 길이를 조사하겠습니다.
url로 몇 가지 넣어보니까 조건이 true일 때는 wrong passward가 나오고
false일 때는 login fail이 나왔습니다.
이를 토대로 파이썬으로 코드를 짜서 pw를 알아내겠습니다.
먼저 id에는 임의의 값(a)를 넣어줍니다.
pw에는 '로 pw 값(문자열)을 닫아주고 뒤에 임의의 쿼리를 넣습니다.
쿼리는 아래와 같습니다.
' or id='admin' and length(pw) <= {pwLen}#
혹시 필터링이 있을지도 몰라서 적절히 변경한 값을 사용했습니다.
길이를 구해준 뒤
각 문자의 비트 수를 통해 멀티바이트 여부를 파악합니다.
쿼리는 아래와 같습니다.
' or id='admin' and length(bin(ord(substr(pw,{i},1)))) <= {bitLen}#
실행해보면 pw는 36문자이고 아스키로 이루어져 있음을 알 수 있습니다.
이제 pw의 각 문자를 찾아주면 됩니다.
이진 탐색을 활용하며 쿼리는 아래와 같습니다.
' or id='admin' and ord(substr(pw,{i},1)) = {k}#
위 쿼리가 참이면 그 값이 pw의 값이고
' or id='admin' and ord(substr(pw,{i},1)) < {k}#
위 쿼리가 참이면 b를 k+1로 조정해 범위를 좁힙니다.
거짓이면 a를 k-1로 조정해 범위를 좁힙니다.
실행 결과 pw를 알아냈습니다.
이제 문제 페이지에서
id : admin
pw : there_is_no_rest_for_the_white_angel
을 입력해주면
문제가 풀립니다.
'write-up(web) > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge old-46 write-up (0) | 2022.08.09 |
---|---|
[Webhacking.kr] Challenge old-49 write-up (0) | 2022.08.09 |
[Webhacking.kr] Challenge old-19 write-up (0) | 2022.07.28 |
[Webhacking.kr] Challenge old-32 write-up (0) | 2022.07.28 |
[Webhacking.kr] Challenge old-27 write-up (0) | 2022.07.27 |