password를 찾는 문제이다.
늘 그렇듯 Search에 기본적인 injection 공격을 해보았다.
Query : 'union select 1--
query의 결과 값으로 ID 숫자와 Email을 얻을 수 있었고
3에서 admin계정을 찾을 수 있었고 이보다 큰 숫자에선 값이 나오지 않았다.
이후에 숫자부분에 이것저것 넣어봤는데 잘 안돼서 문제인 Routed SQL injection에 대해서 검색해보게 되었고
Routed SQL injection은 injection한 첫번째 쿼리의 결과 값이 두번째 쿼리의 input으로 그대로 전달되어 두번째 쿼리에서도 injection 공격이 발생하는 것이다. ( Indirect SQL injection과 비슷하지만 조금 다른 것 같다.
이 문제에 적용 시켜보면 이때 까지 ~~~'union select 3의 결과인 3이
두번째 쿼리의 입력값이 되며, 이 3에 해당하는 ID와 Email이 출력되었다고 생각할 수 있다.
그래서 이 3 부분을 조작하면 두번째 쿼리에서도 injection 공격을 할 수 있다.
그래서 'union select 'union select~~~ 이런 식으로 값을 넣어서 공격할 수 있고, 두번째 쿼리의 컬럼 수는 order by나 그냥 1, 2 이런식으로 해보니 2개 컬럼을 가지더라 ( ,가 필터링 되어서 hex값을 이용하였다.
이를 이용해서 우선 table부터 구하면
Query : 'union select 'union select 1, table_name from information_schema.tables where table_type='base table'# # (두번째 '부터 hex값
users라는 테이블이 존재함을 알 수 있고 이 테이블 명을 통해서 column명을 구해보면
Query: 'union select 'union select 1, column_name from information_schema.columns where table_name='users'# #
id라는 하나의 컬럼명 밖에 안나오게 된다.
그래서 한꺼번에 출력하게 하도록 하는 것을 찾아보니 group_concat()이라는 것을 찾을 수 있었다.
group_cocat은 서로 다른결과들을 한줄에 걸쳐서 출력해준다.
Query: 'union select 'union select 1, group_concat(column_name) from information_schema.columns where table_name='users'# #
id, login, password, email이란 컬럼명을 얻을 수 있었고
이를 통해 우리가 원하는 password 값을 추출 하기 위해서 쿼리를 보내면
Query : 'union select 'union select 1, password from users where id=3# #
우리가 원하는 flag를 얻을 수 있게 된다.
-----------------------------------------------------------------------------------------------------------------------------------
처음에 첫번째 결과의 쿼리값이 두번째로 전달 된다는 것을 잘못 인식해서 ID가 첫번째 쿼리의 결과이고
ID값이 두번째 쿼리의 input으로 들어간다 생각해서 오해가 있어 문제를 이해하는데 오래 걸렸다.
LOS에서는 거의 항상 information이라는 단어가 필터링 되어있어서 이번 문제와 같이 내재된 테이블(?)을 이용해서 푸는 문제는 처음이었던 것 같은데 익혀놔야겠다.