본 분석자료는 더 이상 유효하지 않습니다.
2020년 7월경에 다양한 분석자료들이 발행되어 교육청이 인지함으로써
보안키보드 솔루션이 적용된 자가진단 시스템으로 변경하였습니다.
2022년 5월 주석 추가
보안키보드에 관한 자료는, 다음 레포지토리를 참고하시기 바랍니다.
RionsKey (TouchEn Transkey Wrapper)
각각의 페이지들을 분석하여 분류해보았습니다.
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... : 자가진단 설문 문항입니다.
만약 의심증상이 없도록 처리하게 하고 싶다면,
rspns01, rspns02, rspns07, rspns08, rspns09의 파라미터 값을
각각 순서대로 1, 1, 0, 0, 0을 넣어주시면 되겠습니다.
schulNm은 사실 그냥 학교 이름을 띄어쓰기 없이 넣어도, 처리가 가능하긴 합니다.
동명이인 처리는 qstnCrtfcNoEncpt로 가능해 보입니다.
그리고, 이름이나 학교를 넣지 않아도 qstnCrtfcNoEncpt 값만 넣으면 처리가 되긴 합니다만,
하지만 반환되는 페이지는,
()<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방식으로 그냥 전부 URL에 넣고 처리시키도록 구현해도 충분 할 수 있을 것 같았지만,
공개키로 한번 암호화를 시킨다는 것이 인상적이였습니다.