9번 문제에 들어가니 패스워드를 입력하는 칸이 나왔다. 아무래도 패스워드를 알아내는 것이 문제인 것 같다.
1, 2, 3을 차례대로 눌러보았다.
1을 눌렀더니 1,2,3이 있던 자리에 Apple이 뜨고 url에 get 방식으로 no=1이 전송된다.
2를 눌렀더니 apple과 같이 1,2,3이 있던 자리에 banana가 뜨고 url에 apple은 no=1이 전송되었지만 banana에서는 get방식으로 no=2가 전송된 것을 볼 수 있다.
3을 눌렀더니 다른 번호들과 같이 no=3이 전송되었지만 apple, banana 같은 단어가 아닌 Secret이 출력되고 hint와 column이 주어진다.
Column이 id와 no만 있는 것을 보면 apple과 banana는 id의 값이고 secret의 id 값을 나타내는 것이 이번 문제인 것 같다.
1, 2, 3 이외의 값을 넣었더니 1,2,3도 뜨지 않고 패스워드 창만 뜬다.
0을 넣었더니 처음 메인 페이지가 뜬다.
No의 값은 1, 2, 3의 값만 존재하는 것으로 추측하면 그 이외의 값에는 패스워드 폼만 보이는 것으로 보아
‘Select id from chellenge9_tb where no=$GET[no]’ 가 소스코드에 있다는 것을 추측할 수 있다.
쿼리문의 결과 값이 페이지에 출력되는 것을 보고 값을 찾는 Blind SQL Injection 문제인 것 같다.
우선 Injection Vector를 찾기 위해 no에 ‘(싱글 쿼터)를 입력해보았다.
‘Access Denied’가 출력된다.
문자가 필터링 되어있다. 필터링된 문자열은 >, <, =, % 등등이 있다.
Id 값을 찾는 것이 맞는지 알아보기 위해 hint에서 주어진대로 길이가 11인지 확인하기 위해 =의 우회로 like를 공백에서 %의 우회를 위해 ()를 대신 사용하였다.
No의 값에 따라 페이지의 출력 값이 달라지는 것을 확인하기 위해 if문을 사용하였다.
11이 맞으면 no=1이 되어 apple이 나와야 한다.
예상과 다르게 바나나가 출력되었다. 경우의 수를 차례대로 해보았다.
참일 때 no의 값을 3으로 주고, 거짓일 때 0으로 주었더니 Secret이 출력되었다. 참의 값을 3으로 두고 거짓일 때의 값을 1,2로 설정했더니 거짓일 때의 값으로 출력되었다. 따라서, no가 1,2일 때 id 값이 존재하기 때문에 이러한 결과가 나오는 것으로 유추해보았다.
실패하였다.
성공하였다.
같은 방법으로 하니 banana도 출력이 된다.
참과 거짓을 구분할 수 있게 되었다.
?no=if(length(id)like(0x61),3,0)이면 Secret이 출력된다는 것을 유추할 수 있다.
이후로는 잘 모르겠다. 문제를 풀지 못했다.
'Webhaking > WebHaking CTF' 카테고리의 다른 글
[Webhaking.kr] old 1번 (0) | 2020.11.26 |
---|---|
[Webhaking.kr] old 22번 (0) | 2020.11.09 |
[Webhaking.kr] old 27번 (0) | 2020.11.05 |
[Webhaking.kr] old 18번 (0) | 2020.11.05 |
[Webhaking.kr] old 17번 (0) | 2020.10.02 |