워게임 99

[LOS] Level 9(vampire)

이번에는 처음보는 함수들이 조금 보입니다. 문자열을 필터링하는데 쓰는 함수 같으므로 찾아보자면, strtolower 함수는 대문자를 소문자로 변환시키는 함수이고 str_replace 함수는 3번째 인자의 값중에서 1번째 인자의 값을 2번째 인자의 값으로 바꾸는 함수입니다. 그러므로 만약 admin이라는 문자열이 id에 전달된다면 "admin" => "" 다음과 같이 문자열이 바뀔것입니다. 그리고 이번에는 Admin 과같은 식으로 대문자를 사용하더라도 strtolower 함수로 인해서 전부다 소문자로 변환될것입니다. 그러므로 생각해보자면 str_replace 함수는 admin이라는 문자열에 대해서만 "" 이라는 문자열로 치환하기 때문에 만약 "ABadminCDE" 와 같은 식의 문자열이 들어간다면 admi..

[LOS] Level 8(troll)

이번에는 id가 admin이면 문제가 풀리는 것으로 보입니다. 그런데 이번 문제에서는 admin 이라는 문자열을 필터링하는것으로 보입니다. 그렇기 때문에 이를 우회할 방법을 찾아야 하는데 필터링 하는 함수의 인자 부분을 잘보면, 문자열 뒤에 i 가 안 붙어있는것을 확인할수 있습니다. 이 말은, 필터링에서 소문자와 대문자를 다르게 본다는 것입니다. 그러므로 admin이라는 문자열 대신 Admin 을 쓰는 식으로 대문자를 쓰면 필터링을 간단하게 우회할수 있습니다. 이를 기반으로 단순하게 Admin이라는 문자열을 id에 넣으면 다음과 같이 문제가 풀리는것을 확인할수 있습니다.

[LOS] Level 7(orge)

문제의 소스코드를 쭉 둘러보면 전 단계와 필터링 처리는 같아 보이는데 그 뒤에 solve 함수가 실행되는 조건이 달라졌습니다. 서버 DB에 저장되어있는 admin의 pw와 쿼리를 통해 전달받은 pw가 같아야만 solve 함수가 실행됩니다. 한마디로 admin의 pw를 알아내야만 문제를 풀수 있습니다. 일반적인 sql 인젝션 공격으로는 알아내기 힘들기 때문에 blind sql 인젝션을 통해서 알아내야합니다. Level 4에서 썼던 blind sql 인젝션 스크립트를 활용해서 이번 단계를 통과할수 있을것으로 예상합니다. 우선 이 웹페이지에서는 OR과 AND를 필터링 하므로 OR는 ||, AND는 &&로 바꿔서 쿼리문 형식을 만들어야합니다. 그렇게 해서 작성한 쿼리문을 우선 비밀번호의 길이를 알아내는데에 사용..

[LOS] Level 6(darkelf)

이번 문제에서도 전과 비슷한 구조를 가지고 있습니다. 그런데 이번에는 OR과 AND가 필터링 처리 되고있는것을 확인할수 있습니다. 그러므로 OR과 AND를 쓰지 않고 공격을 할 방법을 찾아봐야 합니다. 한참을 찾아봤지만 별다른 해답이 보이지 않아서 고민하고 있었는데 알고보니 생각보다 간단한 해답이 있었습니다. SQL에서는 AND와 OR을 &&와 || 와 같이 사용하는것이 가능합니다. 그러므로 이를 기반으로 공격문을 작성하면 pw=1234' || id='admin' --%20 OR 대신 ||를 써서 다음과 같이 공격문을 작성해서 전송하면 다음과 같이 문제가 풀립니다.

[LOS] Level 5(wolfman)

이번 문제는 어디선가 본듯한 구조를 가지고 있습니다. 바로 저번에 풀었던 Level 3 문제와 유사한 구조를 가지고 있습니다. 그런데 다른점이라면 이번에는 공백을 필터링 하는것이 다른점입니다. https://0x3700.tistory.com/entry/SQL-%EC%9D%B8%EC%A0%9D%EC%85%98-%EA%B3%B5%EB%B0%B1-%EC%9A%B0%ED%9A%8C-URL-Encode SQL 인젝션 공백 우회 & URL Encode 공백 우회 1. Tab : %09 - no=1%09or%09id='admin' 2. Line Feed (\n): %0a - no=1%0aor%0aid='admin' 3. Carrage Return(\r) : %0d - no=1%0dor%0did='admin' 4. 주..

[CodeEngn] Advance RCE L07

문제는 다음과 같습니다. 일단 문제파일을 exeinfope로 한번 까보면 이렇게 나오는데, 우선 32비트기반 실행파일이고 .NET 기반의 C# 프로그램인것을 확인해볼수 있습니다. 하.... 저는 C#에 대해서 잘 모르기 때문에 다음 문제로 넘어갈까 하다가 한번 도전해보고자 시작하게 되었습니다. 정확한 분석을 위해서 virtualbox를 이용해서 만든 windows 7 32bit 환경에서 계속해서 분석하겠습니다. 우선 프로그램을 실행시켜보면 다음과 같이 텍스트박스 2개와 버튼 2개로 이루어진 프로그램이고 1번째 텍스트박스에 HMX0101이라는 문자열이 있는것을 확인할수 있습니다. 문제에서는 name이 CodeEngn이고 serial이 28BF522F-A5BE61D1-XXXXXXXX 와 같은 형식일때 뒤에 ..

워게임/CodeEngn 2022.05.03

[LOS] Level 4(orc)

이번 문제는 id와 pw를 판별하는 전형적인 문제입니다. 그런데 이번에는 id를 판별하는것이 아닌 pw를 tabe에 있는 pw와 GET을 통해서 전달된 pw가 일치해야만 풀리는 문제입니다. 계속해서 분석해본 결과, 분기문 구조상 단순 쿼리문을 조작하는 것만으로는 조건이 성립할수 없습니다. 그러므로 이 DB에 있는 'admin'의 pw를 알아내서 직접 입력해야만 합니다. 그런데 DB를 직접적으로 조회하는것은 금지이므로 blind sql injection을 진행해서 비밀번호를 알아내야 합니다. 저는 python의 requests라는 모듈을 사용해서 blind sql injection을 구현해볼것입니다. blind sql injection이란 간단히 말해서 DB의 정확한 구조를 모르더라도 쿼리문의 요청에 대해..

[LOS] Level 3(goblin)

이번에는 전 레벨과 다른 방식입니다. id는 guest로 정해져있고 no라는 column이 있는것을 확인할수 있습니다. 쿼리를 주입할수 있는곳은 no=다음부터 이므로 어떻게 해야 검증을 통과할수 있을지 생각해 봐야합니다. 일단 no에는 임의의값을 넣고 or id = 'admin' 이라는 쿼리를 작성해서 id가 'guest'와 'admin', 두 경우에서 모두 참이 나오도록 하면 쿼리를 통과시킬수 있을것입니다. 그렇게 해서 나온 쿼리문은 다음과 같습니다. no=0 or id = 'admin' 그런데 이 쿼리문을 전송하면 다음과 같이 quotes를 쓸수 없다는 텍스트가 나옵니다. php소스를 다시 살펴보면 preg_match 함수를 통해서 필터링처리가 이루어지고 있는것을 확인할수 있습니다. 그러므로 이 함수..

[LOS] Level 2(cobolt)

이번에 주어지는 php는 다음과 같습니다. 전 단계와 비슷한 구조의 웹사이트로 보이지만 id를 검증하는 방식이 약간 다릅니다. 이번에는 id가 무조건 admin 이여만 통과가 가능하므로 id에 admin을 넣고 "and 1=1 -- " 로 뒤의 조건을 처리한뒤, 주석을 통해서 뒤의 쿼리를 무시하면 다음과 같은 쿼리가 나오고 id=admin' and 1=1 --%20 이 쿼리를 사용하면 다음과 같이 풀리게 됩니다.

[LOS] Level 1(gremlin)

제시된 php는 다음과 같습니다. 여기서는 id와 pw를 GET을 통해서 받은뒤 검증과정을 통과해야만 풀리는 문제로 보입니다. id와 pw가 DB에 있는 정보와 일치해야만 하는데 여기서는 id만을 이용해서 검증과정을 통과할수 있습니다. id=aaa' or 1=1 --%20 다음과 같은 쿼리문을 url을 통해서 보내면 id는 임의의 값으로 전송되고, or 1=1을 통해서 id에 임의의값을 넣더라도 or 뒤에있는 구문이 참이기 때문에 이 조건문은 참이 됩니다. 그렇기 때문에 id값을 모른다 하더라도 통과가 가능합니다. 그 뒤에 pw에 대한 검증은 "--"와 같은 주석을 통해서 없는 코드 취급을 할수 있습니다. 그리고 주석은 앞뒤에 공백이 있어야만 제대로 작동하기 때문에 공백을 써야하는데 url에서는 뒤에 문..

728x90