Wargame/LOS (Lord of SQL Injection)
-
[LOS] 7. orge 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 17. 16:39
darkelf 때와 마찬가지로 or과 and는 필터링되지만, 실제 pw를 알아내야 해결되는 문제이다. 따라서 orc 문제와 비슷하게 풀되, or과 and만 잘 우회하면 된다. 먼저 pw의 길이를 알아내자. (&&의 경우 그대로 입력하면 제대로 인식되지 않아서 &&의 URL 인코딩 값인 %26%26으로 입력해야 한다.) pw=1' || id='admin' %26%26 length(pw)=1--%20 pw의 길이는 8 bytes이다. pw의 길이를 알았으니 이제 실제 pw가 무엇인지 ascii 함수와 substr 함수를 통해 알아낸다. pw=1' || id='admin' %26%26 ascii(substr(pw,1,1))=97--%20 자동화 프로그램은 orc에서 사용했던 것과 동일한 프로그램을 사용하였다...
-
[LOS] 5. wolfman 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 16. 21:08
이전 문제들과 거의 비슷하지만 이번 문제는 공백을 필터링한다. 따라서 이 공백 문자를 우회하여 admin 권한을 획득해야 한다. 공백 문자를 우회하는 방법은 여러 가지가 있으나, 나는 \n을 사용하였다. \n의 URL 인코딩한 값인 %0a를 공백 대신 사용한다. pw=1' or id='admin → pw=1'%0aor%0aid='admin ※ 참고 Webhacking.kr에 역시 비슷한 문제가 있으니 참고하자. 아래에 공백 문자 우회에 대해서도 좀 더 자세히 설명하였다. https://g-idler.tistory.com/6?category=830164
-
[LOS] 4. orc 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 16. 20:55
goblin과 마찬가지로 id는 admin으로 고정되어 있고, pw가 일치하면 Hello admin 문구가 출력된다. SQL 인젝션을 이용하여 pw를 우회해서 admin에 로그인해 보았다. pw=' or '1'='1 위 소스코드의 아랫부분을 다시 보면, addslashes 함수가 보인다. addslashes 함수는 ', ", \ 등의 특수문자가 db 내에서 문자로 인식될 수 있도록 해당 문자를 이스케이프(escape) 시켜주는 함수이다. 예를 들면 db에 "I'm a student"라는 문자열을 넣을 경우, 작은 따옴표(') 때문에 쿼리문 실행 시 오류가 발생할 수 있다. 이러한 오류를 방지하기 위해 addslashes 함수를 사용하여 해당 문자열을 "I\'m a student"로 바꿔준다. addsla..
-
[LOS] 3. goblin 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 16. 18:44
쿼리문을 보니 id는 guest로 이미 고정되어 있고, no를 get 방식으로 입력받는다. guest로 고정된 id를 admin으로 바꾸면 문제가 해결될 것이다. 일단 인자로 no를 1부터 넣어보았는데, no = 1일 때만 Hello guest 문구가 출력되었고, 다른 숫자를 넣었을 때는 문구가 출력되지 않았다. 이를 통해 id=guest에 할당된 no가 1이라는 것을 알 수 있다. no=1이 guest이므로, admin에 할당된 no도 존재할 것이다. admin의 no는 2라고 가정한다. 따라서 no의 인자로 admin의 no를 주면 admin 계정으로 로그인이 가능할 것이다. 하지만 id가 guest로 고정되어 있고 no는 and 구문으로 묶여있기 때문에, id='guest' and no=3으로 해당..
-
[LOS] 1. gremlin 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 15. 16:35
문제로 들어가면 상단에 쿼리문이 출력되어 있고, 아래에는 해당 웹페이지의 코드가 나와있다. 소스코드를 간단히 살펴보면, preg_match 함수로 id와 pw의 특정 문자열을 필터링하고 있다. 또한 입력받은 id와 pw를 확인하여 쿼리문이 정상적으로 수행되면 문제가 해결된다. 따라서 SQL 인젝션을 이용하여 쿼리문이 항상 true를 반환할 수 있도록 id와 pw의 인자를 조작하면 된다. select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}' select id from prob_gremlin where id='1' or '1' and pw='1' or '1' 위와 같은 SQL문이 전송될 수 있도록 현재 페이지의 URL 뒤에 ?id=1..