Wargame/L.O.S
-
[L.O.S] Level 31 - zombieWargame/L.O.S 2023. 1. 4. 04:44
Level 31 - zombie를 풀어보자. 앞의 문제와 비슷하지만, 좀 더 쉽게 풀 수 있었다. 이번 문제도 pw를 입력하면서 입력한 쿼리를 불러와야 한다. 그런데 'ace' 문자가 필터링되고 있다. 즉, 앞의 문제를 풀 때 이용하였던 place 함수를 사용하지 못한다. 소스 코드를 보면 알지만, 그래도 앞의 문제와 같은 유형인지 확인하기 위해 union select를 입력하였다. 예상했던 결과가 나오는 것을 볼 수 있다. 이 문제는 어떻게 풀 수 있을까?? sql의 다양한 정보를 모아둔 DB인 information_schema에서 processlist를 이용하여 문제를 풀어보자. 이 processlist는 테이블을 조회하여 현재 수행 중인 작업을 볼 수 있는 테이블이다. 쉬운 이해를 위해 조회를 실행..
-
[L.O.S] Level 30 - ouroborosWargame/L.O.S 2023. 1. 2. 03:31
Level 30 - ouroboros를 풀어보자. 문제 풀이의 방향은 잡았지만, 그 방법을 몰라 오래 걸렸고 결국 다른 write-up을 참고한 문제이다. 소스 코드를 보면 pw의 값을 찾는 간단한 문제이다. 필터링은 rollup과 join이 되고 있는데, 크게 신경을 쓰지 않아도 될 것 같다. pw에 항상 참 값을 입력해도 출력되는 것이 없다. 아마도 테이블에 값이 없는 듯 한데, union select를 이용해 확인해보도록 하자. 아래의 사진처럼 union select 1을 입력하였을 때, Pw : 1이 출력되는 것을 볼 수 있다. 그런데 과연 이 문제를 어떻게 해결해야 하는 것일까?? 문제의 테이블에 값이 없는데, 입력한 pw와 result의 pw가 같아야 문제가 해결된다. 아마 내가 입력한 값이 ..
-
[L.O.S] Level 29 - phantomWargame/L.O.S 2023. 1. 1. 07:25
Level 29 - phantom을 풀어보자. SQL의 서브쿼리에 대한 개념이 있어야 풀 수 있는 문제이다. 문제 페이지를 보면, 다른 문제들과는 달리 입력 쿼리가 보이지 않는다. 그 대신 표가 출력이 되어 있다. 소스 코드가 꽤 긴데, joinmail을 파라미터로 입력해야 한다는 것을 알 수 있다. duplicate가 필터링 되고, insert into를 통해 테이블에 값이 들어 가는데 0과 접속 주소, joinmail이 입력된다. 우선 아무거나 입력을 해서 어떤 변화가 생기는지를 확인해보자. joinmail 파라미터에 127.0.0.1을 입력해보았다. 그랬더니 insert into의 쿼리가 출력되고, 접속 ip와 입력한 값이 표에 추가로 출력되는 것을 볼 수 있다. 여기까지 동작을 보고 어떻게 이번 ..
-
[L.O.S] Level 28 - frankensteinWargame/L.O.S 2022. 12. 31. 04:08
Level 28 - frankenstein을 풀어보자. 이해가 되지 않는 부분들이 있어 조금 찜찜한 문제였다. 코드를 보면 괄호와 union이 필터링되고 있다. 그리고 error가 발생하면 error 문자가 나타나는 것으로 보아, Error-Based SQL Injection을 수행하면 된다. union을 사용하지 못하니 error는 범위를 초과하는 수인 9e307*2를 이용해 발생시키도록 하자. 그리고 괄호를 사용하지 못하니 if 문 대신 case when을 사용하도록 하자. 그런데, 여기서 이해가 가지 않는 부분이 있다. 아래의 사진을 보면 결과가 참인데 error가 출력된 것을 볼 수 있다. (문제의 답이 0으로 시작한다는 것을 알고 있다.) 그리고 case when의 결과와 else의 결과를 바꾸..
-
[L.O.S] Level 27 - blue_dragonWargame/L.O.S 2022. 12. 30. 03:12
Level 27 - blue_dragon을 풀어보자. 코드를 잘 살펴보면 문제를 풀 수 있다. id와 pw에 값을 넣어야 하는데, 싱글쿼터(')와 역슬래시(\)가 필터링되고 있다. 저것들을 넣지 않고 해결할 수 있을까?? 아무리 봐도 저것들을 넣지 않고는 문제를 해결할 방법이 생각나지 않는다. 여기서 생각을 좀 바꿔보자. 싱글쿼터와 역슬래시가 필터링되는 것은 쿼리가 입력된 후 result 에서이다. 그렇다면 쿼리의 입력은 정상적으로 되고, 그 이후 동작하는 것을 보면 되지 않을까? 여기까지 생각을 한 후, Time-Based SQL Injection을 시도해보기로 했다. 입력을 한 이후, 참일 때 지연되도록 하고 거짓일 때 페이지가 바로 뜨도록 하였다. 그렇게 하니 공격이 제대로 수행이 되는 것을 확인할..
-
[L.O.S] Level 26 - red_dragonWargame/L.O.S 2022. 12. 28. 04:42
Level 26 - red_dragon을 풀어보자. 두 번째 dragon인데, 이전 문제보다는 쉬운 편이다. id에는 길이 제한이, no에는 숫자만 입력할 수 있다는 제한이 있다. 먼저 참 값을 입력하여 어떤 출력이 나타나는지 확인해보도록 하자. id 파라미터에 값을 입력할 때, 길이 제한을 주의하며 참 값을 입력하니 Hello admin이 출력되었다. 아마도 테이블의 가장 상단에 admin이 존재하는 것 같다. 이제 이 문제를 어떻게 해결할지 생각해보도록 하자. 필요한 정보는 php의 is_numeric 함수에 숫자뿐만 아니라, 공백 문자도 넣을 수 있다는 것이다. 이러한 사실을 이용해 Level 20에서 했던 방법으로 문제를 해결할 수 있다. id의 길이 제한 조건에 맞춰 '||no>#을 입력해준다...
-
[L.O.S] Level 25 - green_dragonWargame/L.O.S 2022. 12. 27. 05:11
Level 25 - green_dragon을 풀어보자. 오랜만에 입력한 query 문에 대한 출력을 보여주는 문제이다. 그런데, 그 출력을 두 개나 보여준다. (인심이 좋다..) 출력이 두 개, 그리고 싱글쿼터(')와 더블쿼터(")가 모두 필터링 된다는 것을 알 수 있다. id 파라미터에 admin을 넣어 그것이 db에 있다면 문제가 해결된다고 하니, 넣어보도록 하자. 당연히 문제는 풀리지 않는다. pw의 값을 모르니, 우회를 하여 다시 시도해보도록 하자. 우회를 하기 전, 항상 참 값을 입력했을 때 어떻게 출력이 되는 지를 확인해보도록 하자. 그런데 두 번째 query 문의 출력이 나타나지 않는 것을 확인할 수 있다. 이것은 문제의 테이블인 prob_green_dragon에 값이 없다는 것을 의미한다...
-
[L.O.S] Level 24 - evil_wizardWargame/L.O.S 2022. 12. 17. 19:15
Level 24 - evil_wizard를 풀어보자. 코드를 보면 앞의 Level인 hell_fire와 비슷하다. 다른 점은 union, sleep, benchmark 함수를 사용할 수 없다. 앞에서 했던 Time-Based SQL Injection은 할 수 없지만, if 문을 이용해 문제를 풀어보도록 하자. 먼저 email의 길이를 구해보자. order by가 정렬될 수 있도록 참일 때, 1을 입력할 수 있도록 한다. 그랬더니 admin, rubiya 순으로 데이터가 정렬되는 것을 볼 수 있다. 다음으로 에러가 나오도록 거짓일 때의 값을 order by의 범위를 넘어가도록 설정하였다. 그런데, 출력이 된다.. rubiya, admin 순으로 앞과는 다른 결과지만, 분명 출력이 되고 있다. 혹시나 싶어 ..