[MySQL] SQL Injections in LIMIT
·
SQL Injection
mysql limit 함수에서 sql injection 공격 하기 셀 수 없을 정도로 많은 문서들이 SQL Injection(이하 SQLI) 공격 기법을 다루고 있다. 이 글은 굉장이 특이한 상황에서의 SQLI 기법을 다루고 있다. 특정 응용프로그램에서 SQLI를 테스트 할 때 간단한 인터넷 검색만으로 풀 수 없는 경우가 있었다. 바로 MySQL 5.x 버전에서 LIMIT 함수가 SQLI 공격 기법에 취약한 경우였다. 예제 쿼리 “SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT injection_point” 위 쿼리에서 중요한 점은 해당 쿼리에 “ORDER BY”가 사용되었다는 것이다. MySQL 에서는 “UNION” 전에 “ORDER BY”를 사용할 수..
los - dark eyes
·
Lord_of_SQL-Injections_I
이전 iron golem 문제와 비교해봤을 때 크게 달라진 점은 에러 처리 부분과 필터링 부분이다. 이전에는 에러가 나면 에러를 보여주고 종료했으나 이번에는 에러가 나면 그냥 빈 페이지로 돌아간다. 그리고 필터링에 'if', 'when'이 추가되어 조건문은 사용하지 못한다. 공격문은 그냥 조건문 없이 blind sql injection 하듯이 작성하면 되지만, 문제는 쿼리 성공/실패 판단 부분이다. 즉, 쿼리가 실패하면 빈 페이지로 리턴 되고, 성공하면 위 사진에서 해당 쿼리가 보여지게 될 것 이기 때문에 쿼리 성공시 항상 위 페이지에서 보여지는 아무 문자열이나 기준으로 잡아서 판단하면 된다. > 리턴 페이지에서 해당 문자열이 보이면 성공, 안 보이면 실패
los - iron golem
·
Lord_of_SQL-Injections_I
필터링은 신경 쓰지 않아도 되지만 문제는 에러 처리 부분이다. 만약 쿼리 에서 에러가 발생하면 에러를 보여주면서 쿼리가 종료되게 코딩되었다. 즉, error based blind sql injection 기법을 이용해야 한다. 쿼리 내에서 에러를 발생시킬려면 조건문을 사용해야 한다. > if (쿼리문,참일때 값,거짓일 때 값) 위 조건문에서 이용할 형식들은 다음과 같다. - 쿼리문 : substr 함수를 이용하여 pw를 한 글자씩 자르고 비교 - 참일 때 : 한 글자씩 자르고 비교한 값이 맞으면 변수에 저장 - 거짓일 때 : 한글자씩 자르고 비교한 값이 다르면 에러 발생 - 에러 발생을 위한 쿼리문 : ( select 1 union select 2) - 참 거짓 비교 방식은 간단다. 에러가 나면 페이지에..