플레그 형식이 {‘uid’: ‘admin’, ‘upw’: ‘DH{32alphanumeric}’} 이렇게 된다는 것은 admin의 비밀번호 즉 upw값이 이 문제의 플레그가 된다는거에요. 그리고 소스코드를 안보고 막 대입을 하거나 그냥 소스코드를 보시면 admin, admi, dh는 필터링이 된상태라는 것을 알 수 있어요. 그래서 필터링을 우회하기 위해서 uid에 admin을 그대로 넣는것이 아닌 ad.in을 넣음으로써 필터링을 우회할 수 있죠. 여기서 ad와 in사이에 들어간 .은 정규표현식인데 ad로 시작하고 아무문자 하나가 다음에 들어가고 그 다음에 in이이라는 표현입니다. 자세한것은 정규표현식을 찾아보세요. 취약점 분석은 넘어가고 로드맵에 있는 공격코드를 보자면 uid[$regex]=ad.in&upw[$regex]=D.{*
이렇게 되있습니다. regex는 연산자인데 로드맵에 나와있는것처럼 지정된 정규식과 일치하는 문서를 찾습니다. 즉 db에 ad.in과 일치하는 데이터를 찾는거죠. 그렇다면 뒤에 upw도 마찬가지로 D.{*와 일치하는 데이터를 찾습니다. 이때 *은 뒤에 무엇이든 올 수 있다는 표현입니다. 이렇게되면 admin으로 로그인?을 할 수 있게됩니다. 실제로 이렇게 입력을 하면 admin이 출력이 되고 다른 이상한 값을 넣을경우 ubdifined가 출력이됩니다. 그러나 이렇게 공격코드를 치고난 후 출력결과를 보거나 소스코드를 보면 플래그가 출력이 되는것이 아닌 uid만 출력이 되는것을 확인 할 수 있습니다. 그럼 upw가 무엇인지는 어떻게 알 수 있을까요? 바로 하나씩 대입을 해보는것입니다. 예를들어 upw[regex]=D.{a*을 입력했는데 admin 즉 참이라는 결과가 나오면 D.{a까지는 맞는 upw고 D.{ab 를 입력했는데 undifined가 출력이된다면 a다음 b가 아니라는 것이 됩니다. 이런식으로 하나하나 써가며 공격을해도 되지만 이러기에는 너무 번거롭기에 로드앱에서는 Pyhton을 이용해 자동화한것이죠. 질문자분도 한번 손으로 몇번해봐서 익혀보시고 로드맵코드를 보지말고 혼자서 한번 스크립트를 작성해보시는것이 어떨까요?
2023.04.15. 02:09