[DVWA] - SQL Injection Low 단계
SQL Injection Where 구문 우회
SQL Injection문제이다.
소스코드를 한번 보겠다.
id값을 get방식으로 받고 쿼리 부분에서 user_id가 id인 users테이블에서 first_name과 last_name을 가져오는 것을 알 수있다.
User ID부분에 '(싱글쿼터)를 넣으면 그림 3과 같은 에러가 뜬다.
SQL 문법에서 에러가 났다고 한다. 왜냐하면 쿼리 부분을 보면 user_id = ''' 이라고 들어가기 때문에 싱글쿼터의 쌍이 맞지않아 형식에러가 발생한다.
User ID에 1을 넣어본다.
User ID에 1을 넣으면 ID가 1인 사용자인 admin 사용자가 출력한다.
이제 아래와 같은 값을 넣어 보겠다.
' or '1' = '1
sql 쿼리문을 조작하여 user_id = '' or '1' = '1'로 들어가서 항상 참이 되므로 모든 사용자의 정보를 출력한다.
SQL Injection ORDER BY 및 UNION 공격
UNION은 합집합이므로 UNION을 사용하기 위해서는 원래 SQL 쿼리문이 조회하는 SELECT 문의 칼럼 개수와 UNION 뒤에 SELECT 문에서 요청하는 칼럼 개수가 같아야 한다. 그렇기 때문에 UNION 공격을 성공하기 위해서는 원래의 SQL 쿼리문이 몇개의 칼럼을 가지는지 알아야 한다.
칼럼개수는 ORDER BY로 알 수 있다. ORDER BY는 지정된 칼럼을 기준으로 정렬할 때 사용하는데 칼럼 위치의 인덱스를 이용하여 정렬도 가능하다.
ORDER BY 1을 하면 첫번째 칼럼으로 정렬하게 되는 것이다.
1' order by 1#을 입력하여 첫번째 칼럼으로 정렬하였을 때 아무 문제가 없이 결과를 보여주고 있다.
order by 뒤의 숫자를 증가시키다 보면 3일때 오류가 발생한다.
세 번째 칼럼으로 정렬할 때 오류가 발생하므로 칼럼의 개수가 2개임을 예측할 수 있다.
칼럼의 개수를 맞추어 union을 사용해 보겠다.
칼럼 개수를 2개로 맞춰 union을 사용하니 에러없이 잘 실행된다.
사용자 id가 1인 사용자 정보뒤에 union으로 추가한 결과가 표시된다.
맨 앞의 1를 제거하여 union의 결과를 표시하도록 하였다.
select문 뒤에 1,2와 같은 상수를 넣으니 입력한 상수가 그대로 반환되었다.
mysql 데이터베이스는 information_schema라는 데이터베이스에서 데이터베이스의 메타정보(이름, 칼럼, 정보 등)를 모아두고 있다.
information_schema의 schemata 테이블로부터 schema_name을 가져오는 sql 쿼리문을 이용하면, 데이터베이스 이름을 알아낼 수 있다.
schemata는 데이터베이스의 정보를 제공하는데 schema_name칼럼에서 데이터베이스의 이름을 알 수 있다.
information_schema, bwapp, drupageddon, dvwa, mysql이라는 데이터베이스의 이름이 있다는 것을 알 수 있
다.
다음으로 데이터베이스의 테이블 목록을 알아내기 위해 information_schema.tables에서 정보를 알 수 있다.
table_schema를 dvwa로 설정하여 dvwa 데이터베이스의 테이블 목록을 살펴보겠다.
https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html
' union SELECT table_name,2 from information_schema.tables where table_schema='dvwa'#
guestbook과 users라는 테이블이 출력되었다.
users 테이블의 칼럼 목록을 알아보겠다.
' union SELECT column_name,2 from information_schema.columns where table_schema='dvwa' and table_name='users'#
출력된 칼럼에서 user와 password 칼럼이 있다. 이 칼럼의 내용을 한번 확인해 보겠다.
' union select user,password from users#
그림 13과 같이 사용자의 이름과 패스워드의 해시값이 출력되었다.
admin의 해시값은 5f4dcc3b5aa765d61d8327deb882cf99이다.
인터넷이 admin의 해시값을 입력해 보겠다.
admin의 해시값은 md5형식이고 복원을 하니 password를 출력하고있다.
admin의 비밀번호는 password임을 알 수 있다.
참고자료
해당 블로그에서 약간의 도움을 받았다.
https://lucete1230-cyberpolice.tistory.com/81
INFORMATION_SCHEMA 알아보기
이번 포스팅은 'MySQL'즉 'DataBase(DB)'에 대한 정의와 메타 데이타, 그리고 MySQL에서 메타데이터를 담고 있는 information_schema에 대해 알아보도록 하겠습니다. 데이터베이스(MySQL)란? 위키백과에서는
lucete1230-cyberpolice.tistory.com