해당 논문은 한양대학교 컴퓨터공학과 국내석사 학위를 취득하신 오정욱님께서 작성하신 논문으로 2014년 추계학술발표대회 논문집 제 21권 제2호에 게시 되었다. 해당 논문을 크게 나눈다면 SQL/NoSQL 취약점에 대한 정의, 정적/동적 분석을 통한 취약점 탐지 방법 및 자동 침투 시험 도구의 설계 이 3가지로 나뉘어 진다. 이중 중점으로 확인해볼 내용은 자동화 침투 시험 도구의 설계 부분이다.
자동 침투 시험 도구의 설계
자동 침투 시험 도구는 취약점에 대해 직접 침투하여 공격해 봄으로써 공격 후 응답을 분석하고 이를 통해 해당 포인트가 취약한지 아닌지를 판단힌다.
해당 논문에서 제시한 자동 침투 시험 도구의 설계는 크게 아래와 같다.
공격 지점 수집기
침투 수행기
결과 분석기
해당 논문은 자동 침투 시험 도구에 대한 이론적 내용을 설명한 논문으로써 실제로 구현하여 동작하는 예시는 보이지 않았다. 추가적으로 더 필요한 내용은 직접 생각하여 적어볼 생각이다.
1. 공격 지점 수집기
해당 논문에서는 침투 시험을 하기전 공격 지점을 수집해야 하는데, 공격 지점 수집기란 말그대로 공격을 위한 포인트를 식별하고 모으는 역할을 한다. 도메인 주소를 공격 지점 수집기에 제공하면 크롤링을 통해 사용자 입력 부분이나 파생된 URL을 수집한다. 이때 수집하는 URL 중 도메인이 같지 않거나 이미지, 동영상 등의 URL은 제외한다.
2. 침투 수행기
해당 논문에서 침투 수행기는 수집한 공격 지점을 공격 패턴 목록을 활용하여 공격을 직접 수행하는 도구다. 공격 패턴목록은 SQL Injection과 NoSQL Injection의 공격 Payload에서 공격 패턴을 추출하여 이를 패턴화 하여 공격 패턴 목록을 구성한다. 실제로 침투를 수행하고 수행한 결과를 결과 분석기에 전달한다.
3. 결과 분석기
해당 논문에서 결과 분석기는 침투 수행기에서 침투 시험을 수행한 후 해당하는 응답 결과를 분석하고 취약점을 판단하는 역할을 한다. 응답 결과를 분석할때 응답한 상태 코드를 통해 취약점 침투 시험 성공여부를 1차로 판단하고 응답 결과를 공격 패턴에 상응하는 예상 응답 패턴과 대조하여 맞을시에 취약점으로 판단하도록 한다고 되어있다.
위 논문을 요약하며 느꼈던 점과 논문에서 제시한 자동 침투 시험 도구의 설계 부분을 고도화하여 적어보도록 하겠다.
1. 공격 지점 수집기
논문에서 제시한 공격 포인트 수집을 위해서 필요한 것이 어떤 것이 있을까 적어보고자 한다. 논문에서 제시한 3가지 기능중 구현하기 가장 힘든 포인트라고 생각된다.
요즘 웹 사이트는 정적으로 구동되기 보단 동적으로 구동되는 사이트가 더욱 많다. 그러므로 크롤러는 정적으로 크롤링할 뿐만 아니라 웹 페이지를 크롤링하여 동적으로 실행해 봄으로써 공격 지점을 크롤링 하도록 구성되어야 한다.
물론 정적 크롤링 해온 Response 데이터를 통해서 공격 지점을 추출 할 수 있도록 할 수 있지만 그렇게 구현한다면 Javascript가 실재로 동작해야만 노출되는 공격지점까지 크롤링하기 어렵기 때문이다.
동적으로 실행해보는 방법으로는 파이썬에서 대표적으로 Selenium과 같은 라이브러리가 존재한다. 해당 라이브러리를 통해 실재로 해당 공격지점에 접속하고 Javascript가 실행되도록 함으로써 동적으로 구성되는 공격지점까지 크롤링 할 수 있도록 할 수 있다.
또한 공격 지점들이 존재하는 주요포인트로는 여러가지가 있는데 그중 대표적으로 몇가지만 이야기 하자면 html 태그에서만 보자면 Form 태그, A태그 등등 존재한다. 또한 Javascript 관점에서 보자면 Form submit을 동작시키는 함수와 비동기 관련 스트립트(XMLHttpRequest, ajax, fetch, axios)등이 존재한다. 공격 지점 수집기는 크롤링 해온 데이터에서 자체적인 파서를 통해 위에서 언급한 포인트를 모두 식별해내고 분석하여 공격 지점과 필요한 파라미터들을 추출해내야 한다.
또한 이미지 URL이나 동영상 URL등을 제외하고 추출하기 위해서는 이를 분류하는 기능을 구현해야한다.
기본적으로 URL의 끝부분 확장자가 .png, .jpeg, .jpg, .mp4, .pdf등 일 경우 공격지점이 아니라 판단하여 필터링을 해야한다. 아래는 필터링을 해야하는 예시 목록중 일부이다.
아래와 같은 링크처럼 알려진 서드파티를 통해 불러온 데이터는 사진 파일 및 pdf으로 추측하여 자체적으로 필터링을 하는 로직도 구현해야한다.
https://example.com/exampleplugin/media/2819274 - PNG를 불러오는 예시 플러그인
https://example.com/ttpdfplugin/awid-gewix=2aioe-23da - pdf를 불러오는 예시 플러그인
https://www.youtube.com/790e27d9-2f26-433e-bea9-225d97c5cf2b - youtube에서 사용되는 영상 소스 URL
2. 침투 수행기
침투 수행기 부분은 SQLi/NoSQLi 관련 페이로드를 인터넷에서 최대한 많이 긁어와 사용하는 방법과 긁어온 Payload의 핵심 패턴만 추출하여 축약하여 사용하는 방법이 있다. 처음부터 핵심 패턴을 추출하여 축약된 핵심 Payload를 만들어 사용하기에는 시간적으로 많이 걸릴 뿐더러 잘못 축약하면 공격 성공도가 떨어질 가능성이 있기 때문에 우선은 SQLi/NoSQLi 관련 페이로드를 인터넷에서 최대한 많이 긁어와 사용하는 방법으로 진행하는게 좋다.
인터넷에서 Payload를 긁어올때 어떠한 데이터를 긁어오면 좋을지 생각해 보았고 아래와 같은 방법들이 존재한다.
github에 공개되어 있는 SQLi/NoSQLi 공격 Payload 크롤링
SQLMap등 현재 제작되어 있는 자동화 점검 툴의 Payload를 추출
X, SNS및 구글에 공개 되어있는 CheatSheet 크롤링
추후 자동화 프로그램 고도화를 진행할시 지금까지 긁어왔던 Payload를 축약하여 핵심 Payload를 만들어 사용하는 방향으로 고도화를 하면 좋을것 같다.
3. 결과 분석기
결과 분석기 같은 경우는 공격 지점 수집기와 같이 매우 구현하기 난해한 부분중 하나다. 왜냐하면 SQLi/NoSQLi가 성공했다는 패턴이 너무 다양하기 때문이다. 모든 경우의 수에 해당하는 패턴을 모두 결과 분석기에 기입하기에는 어렵다.
가령 SQLi가 성공했을때 어느 특정 데이터만 바뀌는 직접 공격한 공격자조차 알아채기 힘든 포인트 같은 경우는 점검하는 사람이 직접 확인하는게 제일 확실하기 때문이다. 대안으로는 AI 학습을 통한 공격 성공 유무 판단인데, 해당 AI를 학습시킬만한 충분히 크고 다양한 상황의 예제 데이터를 쌓기 어렵기 때문에 AI 학습을 통한 방법은 생각하지 않도록 하겠다.
그래서 결국 정확도를 제일 높일 수 있는 방안으로는 결과 분석기와 같은 것은 점검하는 사람이 수동으로 확인해보는 것으로 공격이 성공했는지 실패했는지 판별할 수 있도록 GUI로 기능을 구현하는것이 제일 좋은 방안이라고 생각된다.
이때 추가적으로 구현해두면 좋을것 같은 기능으로 결과 분석기에 공격 성공 유무 판단을 저장하는 기능을 만들어두고 추후 AI를 학습시킬만큼 해당 SQLi/NoSQLi 취약점 자동 침투 시험 도구를 오랫동안 사용한다면 학습에 필요한 데이터를 쌓을 날이 올 수도 있지 않을까 생각된다.
후기
자동화 툴을 구현하기 위해 많은 것을 고려해야하므로 점차 필요한 기능들이 추가되었고 점점 구현하기 어려워 지는 것을 느꼈다. 역시나 쉽지않다.