오늘은 3번을 풀이하면서, 중요한 내용을 알아가겠습니다.
우선 3번을 들어가면 Nonogram 이라는 게임을 풀라고 하는데, 간단합니다. 뭐였더라 예전에 로직이었나 그런 것 처럼 행/열 마다 적힌 수에 해당하는 숫자만큼 공간을 색칠하면 됩니다. 3이면 3칸 연속, 1 1 1 이면 한칸씩 세번 색칠 ( 몇칸씩 띄는지는 상관없음). 이를 토대로 풀어보면 노노그램은 간단히 풀 수 있으실 겁니다.
이렇게 하고 solved 를 누르면 문제가 풀렸다고 기록을 위해 아이디를 입력하라고 하는데 이게 정말 3번을 푼걸 의미하는 건 아니겠죠? 그냥 일단 제 웹해킹 아이디를 입력하고 전송해주었더니, 제 아이디와 숫자 그리고 제 아이피주소가 새로운 창에 기입됩니다. 참고로 1010100000011100101011111 이라는 숫자는 위에 풀었던 문제의 5x5 행렬에 대한 값인데, 검은 부분은 1 하얀 부분은 0입니다. 별 의미는 없습니다.
일단 입력창과 버튼창이 공존한다면, SQL injection 을 시도해보는것이 가장 중요하므로 다시 입력창으로 돌아가서 ' or 1=1 -- 를 입력해줬습니다. 그랬더니 이 값 그대로 아이디로 출력될 뿐이지 별 변화가 없더군요. 웹 페이지 상에서 해당 문자를 필터링하나 싶어서, 프록시를 실행했습니다. 프록시가 무엇인지 궁금해 하실 것 같아서 바로 이전 글에 프록시에 대한 설명과 프록시 툴 설치법과 세팅에 대해서 글을 올렸으니 참고하시면 될 것 같습니다. 여튼 저는 Burp Suite 프록시 툴을 이용해 Request 값을 캐치해 봤습니다.
아래 부분은 제가 hello라고 입력했을 경우 입니다.
answer=1010100000011100101011111&id=hello
두 파라미터가 전송되더군요. 그래서 프록시 관할에서 ID 부분을 다시 Sql injection 을 시도했습니다.
answer=1010100000011100101011111&id=hello' or 1=1--
안타깝게도 여전히 변화가 없었습니다. 그래서 이번엔 answer 값이 항상 곧이곧대로 전달되는데, 이 값에 Sql Injection을 걸어보았습니다.
answer=1010100000011100101011111' or 1=1-- &id=hello
그랬더니 문제가 풀렸습니다. 자 여기서 주석에 대해서 주의할 점을 설명하고 넘어가겠습니다.
MySQL에서의 주석은 크게는 3가지 정도 있습니다.
1. -- 주석할 내용
2. #주석할 내용
3. /*주석할 내용*/
1번과 2번은 한줄 주석처리할 때 사용하고, 3번은 여러 줄을 주석하고 싶을 경우 사용합니다. 여기서 주의할 점이 있습니다.
1번의 경우는 2,3번과 다르게 --바로 뒤에 꼭 공백문자가 와야만 정상적으로 주석처리가 된다는 것입니다. 바로 뒤에 공백문자가 오지 않으면 명령으로 해석되어 오류가 발생하게 됩니다.
--주석처리 되지 않습니다.
#주석처리 됩니다.
/*주석처리 됩니다.*/
따라서 1번의 경우는 아래처럼 바로 뒤에 공백문자를 추가해줘야만 정상적으로 주석처리가 됩니다.
-- 이럴경우 주석처리 됩니다.
참고로 2, 3번은 뒤에 공백이 와도 상관없이 주석처리가 됩니다.
즉 2,3번은 바로뒤에 뭐가 오던 상관없이 바로 주석처리가 되는데 1번의 경우에는 바로 뒤를 한칸 띄워줘야 주석처리가 정상적으로 됩니다.