8주차 CTF
SQL Injection Point 1
제공된 사이트에 접속하여 flag 및 모든 데이터를 찾아보겠습니다
![]() |
![]() |
user 구문에 약간의 SQL 문법을 주입했더니 아래와 같은 반응이 확인되었습니다
placeholder 부분에 있던 문자열 "Nothing Here..."이 없어지는 모습을 확인할 수 있었습니다 이렇게
참/거짓을 증명하는 단서를 찾았으니 이 단서를 이용하여 데이터를 추출해보도록 합시다
blind SQL injection을 사용하여 데이터를 추출해보았습니다
데이터 추출
- DB 이름: sqli_6
- 테이블 이름
- board
- flag_table
- member
- 칼럼 확인
- board:
- username, title, views, date, time, content, id, likes, likes_count, file
- flag_table:
- idx, flag
- member:
- user_id, user_pass, name, user_level, info
- board:
data의 값을 적으려니 칸이 부족할 것 같아 따로 압축하여 올리겠습니다
SQL Injection Point 2
해당 값을 조작할 방법이 없으므로 다음으로 넘어가도록 하겠습니다 게시판으로 넘어가
같은 글 3개를 게시해 주고 검색에다가 해당 sql값이 like절 인지 확인 해보도록 하겠습니다
"se 1"을 입력했을 시 se1, se10이 동시에 나온 것을 보아 해당 sql 코드는 무조건 like절을 포함하고 있다고 생각했으며 board_result 값에 se+1%'+and+ '%1'='1을 넣어 서버가 반응을 하는지 확인 해보도록 하겠습니다
.....
네 변화가 없는 것으로 보아 board_result에 sql injection 공격에 대비가 되어 있다는 것을 확인할 수 있겠네요 다음으로는 option_val값을 건드려 보도록하겠습니다
title 뒤에 값이 바로 board_result값을 덮는 방식이라 option_val 앞부분에 sqlinjection을 사용해 보도록 하겠습니다
['1'='1'+and+title] 해당 값을 넣어 참의 여부를 확인 해보겠습니다
![]() |
![]() |
아주 잘 출력이 되는 것을 확인할 수 있습니다 반대로
['1'='2'+and+title] 해당 값을 집어넣어 거짓의 여부도 확인했으니 이제 이 사이트는 sqlinjection이 통한다는 것이 검증이 되었습니다 해당 코드로 데이터를 하나하나다 추출해 보겠습니다
(ascii(substr((select database()),1,1))>0) and '1'='1' 를 넣어 해당 사이트의 DB이름을 추출한 결과 sqli_7인 것으로 밝혀졌으며 해당 사이트의 table, column, data의 종류를 나열해 보도록 하겠습니다
데이터 추출
- DB 이름: sqli_7
- 테이블 이름
- board
- flag_table
- member
- 칼럼 확인
- board:
- username, title, views, date, time, content, id, likes, likes_count, file
- flag_table:
- idx, flag
- member:
- user_id, user_pass, name, user_level, info
- board:
SQL Injection Point 3
마이페이지에 따로 건드릴 부분이 없는 것으로 보이며 게시판으로 가서 좀 더 자세히 알아보도록 하겠습니다
해당 게시판 또한 이전 페이지처럼 like절을 사용하는 것으로 파악됩니다 근데 orderBY절을 사용하는 것으로 보이네요 정렬 기준을 동적으로 처리하기 위해 사용자 입력을 쿼리에 직접 포함하는 경우가 많기 때문에 한번 건드려 보도록 하겠습니다
sort부분에 title이라는 부분을 지워주고 (select 1 union select 2 where 1=2) 넣어줘서 일부로 출력에러를 나타나게 해 보았습니다
![]() |
![]() |
참일시 출력이 되지 않고 거짓이면 출력이 되는 코드이며 이 근거를 바탕으로 어떻게 하면 응용할 수 있는지 적용시켜 보도록 하겠습니다
기존 저희가 작성한 코드 (select 1 union select 2 where 1=2)에서 뒤 참/거짓을 증명하는 식 1=2를 지워주고 blind sqlinjection공격 값을 넣어주면 됩니다
(ascii (substr((select database()),1,1))>0) 값을 이렇게 넣어주면 참/거짓을 증명하는 코드를 바로 만들어 낼 수 있습니다 (selcet 1 union 2 where (ascii (substr((select database()),1,1))>0)) 해당 코드가 잘 작동되는지 확인해보도록 하겠습니다
해당코드가 거짓일 때는 이렇게 column의 값이 나타는 것을 확인할 수 있으며
해당코드가 참일 때는 column의 값이 사라지는 것을 확인할 수 있습니다
이로써 참/거짓을 구분 짓는 방법을 찾았으니 해당 사이트의 데이터를 하나하나 추출해 보도록 하겠습니다
데이터 추출
- DB 이름: sqli_8
- 테이블 이름
- board
- flag_table
- member
- 칼럼 확인
- board:
- username, title, views, date, time, content, id, likes, likes_count, file
- flag_table:
- idx, flag
- member:
- user_id, user_pass, name, user_level, info
- board: