cgy12306

SQL Injection 본문

Wargame/DVWA

SQL Injection

cgy12306 2019. 8. 8. 23:35
User ID를 입력하는 칸이 보인다.


View Source를 눌러서 소스를 보자.

입력받은 UserID를 이용해서 first_name과 last_name을 저장하고, first_name과 last_name, ID를 출력한다.

View Help를 눌러서 Objective를 확인 하자.


패스워드를 구하라이다.

1을 넣었을 때 결과 값이다.
다시 소스에서 SELECT 문을 보면 입력받은 값이 $id에 들어가는 걸 볼 수 있다.
그러면 '(홑따옴표)를 한번더 입력해주고 or 연산자를 이용해서 무조건 참인 쿼리문을 만들어 주면 모든 테이블을 출력할 것 같다.
' or '1'='1를 입력해보자. 


쿼리문을 적어보면
SELECT first_name, last_name FROM users WHERE user_id='' or '1'='1';이 될 것이다.
'1'='1'은 참이고 user_id=''는 거짓이다. 하지만 or 연산자는 둘 중 하나라도 참이면 결과 값은 참이기 때문에 쿼리문이 실행 된다.

어떤 계정들이 있는지 알았으면 이제 패스워드를 알아내야 한다.

1' union select 1, column_name from information_schema.columns where table_name='users'#를 입력해주면 아래와 같은 화면이 뜬다.



union select는 앞에 있는 쿼리문에 뒤에 있는 쿼리문의 값을 넣어준다.

information_schema는 메타 데이터로써 데이터 사전이다. 시스템 카탈로그라고도 한다. 이 안에 columns이라는 곳에 각 테이블 필드에 대한 데이터가 담겨 있다. 이 정보로 우리는 계정 정보를 갖고있는 테이블의 컬럼명들을 알아냈다.

users 테이블에 패스워드를 갖고있는 컬럼 명은 password이다. 또 id를 갖고있는 컬럼 명은 user_id이다. 이걸 이용해서 데이터를 추출해보자.

1' union select id, password from users#


user_id와 비밀번호가 뜬다.





'Wargame > DVWA' 카테고리의 다른 글

XSS(Reflected)  (0) 2019.08.08
XSS(Stored)  (0) 2019.08.08
SQL Injection(Blind)  (0) 2019.08.08
Command Injection  (0) 2019.08.08
Brute Force  (0) 2019.08.08
Comments