교육청 코로나 자가진단 시스템 분석

2020. 7. 18. 01:46프로그래밍 관련 일상 또는 소식

반응형

안녕하세요. 코딩맨(Antegral) 입니다.

오늘은 교육청 코로나 자가진단 시스템을 분석해보았습니다.

 

관련 프로젝트를 만드시기 전 확인해주세요.
시스템 분석과 관련한 글을 이용해 관련 프로젝트를 만드시는 분을 자주 뵈어 적습니다.
이 시스템 분석글을 통해 프로젝트를 만드셔서 생기는 문제는 만드신 분 본인이 책임을 지셔야 합니다.
아마, 자동 자가진단 관련해서 만드시는 분이 보실 거라고 생각됩니다만, 언제든지 이 시스템의 구조는 변경될 수 있고,
예상치 못한 결과를 초래할 수도 있다는 점 항상 알고 계셨으면 합니다.

짧은 토막글 읽어주셔서 감사합니다 :)

각각의 페이지들을 분석하여 분류해보았습니다.

Postman을 사용하는 것이 가장 분석에 빠를 것 같아 써보았습니다.

 

각각 페이지는 다르며, 페이지마다 반환하는 값은 천차만별입니다.

 

먼저, 이 페이지는 schulNm라는 파라미터가 존재합니다.

schulNm은 학교 이름을 의미하며, 띄어쓰기가 존재해서는 안됩니다. (ex. OOOO고등학교)

 

만약 제대로 파라미터를 넣었다면, schulCode라는 파라미터가 반환될 겁니다.

schulCode는 J000000000 형식으로 반환되며, 이는 학교의 고유번호를 의미합니다.

 

참고로, 모든 요청은 rtnRsltCode로 결괏값이 반환됩니다. SUCCESS는 요청이 성공하였고 정상적으로 값을 반환했다는 의미이며, 오류코드는 각각 페이지마다 다르게 반환됩니다. 또한, 이 학교 고유번호를 받아오는 페이지는 만약 찾는 학교가 없다면, rtnRsltCode가 비어있는 채로 반환하게 됩니다.

 

이 페이지는 총 3개의 파라미터를 요구합니다.

 

파라미터들을 설명하자면,

schulCode는 아까 보신 페이지로 요청을 넣으면 나오는 그 값이며,

pName은 학생 이름입니다.

frnoRidno는 주민번호 앞자리, 즉 6자리의 생년월일을 넣는 부분입니다.

 

모든 파라미터의 값은 정확하여야 하며,

이 중 하나가 충족되지 않을 시, rtnRsltCode의 값은 QSTN_USR_ERROR를 반환하게 됩니다.

 

만약 제대로 된 값을 넣어 rtnRsltCode가 SUCCESS를 반환했다면,

qstnCrtfcNoEncpt라는 반환 파라미터에 학생정보가 암호화되어 반환되게 됩니다.

 

 

지금 비활성화되어있는 부분을 보시면 aditCrtfcNo가 비활성화되어있는데,

aditCrtfcNo는 학교 내 동명이인을 구분하기 위한 장치로,

이를 판단하기 위해서는, 같은 학교 내 동명이인의 이름을 넣게 되면,

rtnRsltCode의 값이 ADIT_CRTFC_NO를 반환하게 되면서, 이를 통해 동명이인이 확인되었으며,

추가로 aditCrtfcNo 파라미터를 통해 이를 구별해줘야 한다는 의미입니다.

 

aditCrtfcNo 파라미터의 값은 주민번호 뒷자리의 끝 2자리를 입력해야 합니다.

동명이인이 아니지만, aditCrtfcNo를 넣게 되어도 값 반환에는 지장이 없습니다.

 

이 페이지는 암호화된 문자열을 넣어 학생정보를 가져올 수 있는 페이지입니다.

방금 전에 얻었던 qstnCrtfcNoEncpt의 값을 필요로 하며, 마찬가지로 파라미터의 이름도 qstnCrtfcNoEncpt입니다.

만약 성공하였다면, 반환한 JSON에서 schulNm과 stdntName이 추가로 반환된 것을 확인할 수 있습니다.

 

qstnCrtfcNoEncpt의 값이 유효하지 않거나, 찾을 수 없다면, rtnRsltCode에 QSTN_USR_ERROR를 반환할 것입니다.

 

이 페이지가 분석의 꽃입니다. 바로 정보를 업로드하는 페이지입니다.

 

위에서 보았던 파라미터를 보셨다면 이제 잘 보이시겠지만, 한 번 더 설명해드리자면,

 

schulNm : 학생이 다니는 학교 이름을 의미합니다.

stdntName : 학생의 이름을 의미합니다.

qstnCrtfcNoEncpt : 암호화된 학생정보 문자열을 의미합니다.

 

rspns01... : 자가진단 설문 문항입니다.

 

이 글은 2020/07/18에 작성된 글입니다. 따라서, 의심증상이 없음을 의미하는 파라미터의 이름은 언제든지 달라질 수 있으며,
이를 유의하지 않아 생기는 결과는 사용자의 책임에 있다는 점을 양지해주시기 바랍니다.

 

만약 의심증상이 없도록 처리하게 하고 싶다면,

rspns01, rspns02, rspns07, rspns08, rspns09의 파라미터 값을

각각 순서대로 1, 1, 0, 0, 0을 넣어주시면 되겠습니다.

 

schulNm은 사실 그냥 학교 이름을 띄어쓰기 없이 넣어도, 처리가 가능하긴 합니다.

동명이인 처리는 qstnCrtfcNoEncpt로 가능해 보입니다.

 

그리고, 이름이나 학교를 넣지 않아도 qstnCrtfcNoEncpt 값만 넣으면 처리가 되긴 합니다만,

하지만 반환되는 페이지는,

&nbsp;()<br>
금일(2020년 7월 18일) 자가진단 참여를 완료하였습니다.

이런 식으로, 학생 이름과 학교 이름이 뜨지 않습니다.

이미 qstnCrtfcNoEncpt의 값에 학생정보가 이미 들어있을 뿐만 아니라,

완전히 정상처리 여부를 확신할 수는 없지만 오류가 있다면 오류 페이지로 넘어가기에,

딱히 처리상의 문제는 발생하지 않은 것으로 추측됩니다.

 

(추가내용) 추가로 분석해보니 이상없음으로 처리할때에 몇가지 점을 간과하고 있어서, 더 적습니다.

윗사진의 링크는 https://eduro.goe.go.kr/stv_cvd_co02_000.do입니다.

하지만, 이상없음으로 처리하기 위해서는 먼저 rspns를 포함한 값들을 먼저

https://eduro.goe.go.kr/stv_cvd_co01_000.do로 먼저 POST 해줘야합니다.

 

맞습니다. 아까 qstnCrtfcNoEncpt을 넣어서 학생정보를 얻을 수 있었죠?

하지만 그 부분은 자가진단 처리를 하기 위해 만든 것으로 추정됩니다.

 

따라서, https://eduro.goe.go.kr/stv_cvd_co02_000.do에 넣는 파라미터들을

똑같이 https://eduro.goe.go.kr/stv_cvd_co01_000.do에도 넣고 한번 POST 해줘야 한다는 것입니다.

 

이부분을 미처 설명해드리지 못하고 불완전한 정보를 제공하여 사과드립니다.

 


자가진단 시스템을 분석해보며...

사실 이렇게만 보면 보안에 취약한 것 같지만, 암호화된 식별용 문자열을 사용하는 등,

여러 가지로 보안 관련해서 전혀 갖춰지지 않은 건 아녔습니다.

사실 GET방식으로 그냥 전부 주소에 때려 넣고 처리시키도록

구현했을 수도 있을 것 같았지만, 이런 방식을 사용한 거 보면, 좀 많이 생각해서 만든 것 같습니다.

물론 저보단 실력이 월등하게 좋으신 분들이 많으신 게 사실이지만요.

 


이번엔 글이 좀 길어졌습니다.

항상 읽어주셔서 감사드리고,

광고 한 번씩만 살포시 한번 클릭만 해주셔도 정말 기분이 날아갈 것 같습니다.

모든 광고를 통해 얻은 수익은 서버 운영에 사용됩니다.

반응형