Wargame/LOS (Lord of SQL Injection)
-
[LOS] 16. succubus 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 22. 15:08
id와 pw를 입력받을 때, 둘 다 싱글 쿼터(')를 필터링한다. 이전에 싱글 쿼터(')는 더블 쿼터(")로 우회할 수 있다고 했는데, 사실 이 방법은 쌍으로 사용할 때나 먹히는 방법이다. 즉, 싱글 쿼터(')가 하나 열려있는 상태에서는 더블쿼터(")로 막을 수 없다. ('admin" 이렇게 사용할 수 없다는 뜻) 이 문제에서는 id와 pw를 동시에 입력받으므로, 이를 이용해 싱글 쿼터(')를 우회해보자. 싱글 쿼터(') 앞에 백슬래시(\)를 입력하면 싱글 쿼터(')는 문자로 인식된다. 따라서, id='' and pw='' 에서 \를 입력하면, id의 닫는 싱글 쿼터(')가 문자로 인식되어 해당 싱글 쿼터(')가 제 기능을 하지 못하게 된다. 결국 pw의 여는 싱글 쿼터(')가 id의 닫는 싱글 쿼터('..
-
[LOS] 15. assassin 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 19. 03:11
이번 문제는 필터링되는 문자가 싱글 쿼터(')밖에 없다. 이 싱글 쿼터(')를 우회해서 id가 admin이 되도록 조작할까 싶었지만, 아쉽게도 이 문제에서는 싱글 쿼터(')를 우회할 수 있는 방법이 없었다. 그런데 쿼리문에서 pw를 비교할 때 등호가 아닌 LIKE가 사용된 것이 걸린다. LIKE는 pw의 일부만 같아도 true를 반환하기 때문에, admin의 pw를 한 글자만 알아내도 LIKE에 의해 전체 쿼리문이 참이 되어 admin을 select할 수 있게 된다. LIKE 구문에서 사용하는 특수 문자 중에는 %가 있다. %는 0개 이상의 문자를 의미한다. 따라서 만약 pw LIKE "a%" 라는 쿼리문을 실행했을 때, pw의 맨 첫 번째 문자가 a면 true, 아니면 false를 반환한다. %를 이용..
-
[LOS] 14. giant 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 19. 01:54
shit이라는 인자를 GET 방식으로 입력받는데, 길이가 1보다 크면 No Hack 문구가 출력된다. 게다가 공백과 공백을 우회할 때 자주 사용되는 문자들까지 필터링된다. 일단 shit 인자에 한 자리 숫자를 인자로 주고 쿼리문을 확인해보자. 쿼리문을 보니 from과 prob_giant 테이블 사이에 공백이 없어서 쿼리문이 정상적으로 동작하지 않는 것을 알 수 있다. 따라서 이 문제는 공백, \n, \t, \r 문자를 우회하여 공백을 넣으면 쿼리문이 정상적으로 동작하여 1234가 select될 것이다. 공백을 우회할 수 있는 방법은 여러 가지가 있다. 1. Line Feed (\n) - 커서(캐럿)를 다음 줄(현재 위치에서 바로 아래줄)로 이동시키는 개행 문자 - URL Encoding: %0a - 예시..
-
[LOS] 13. bugbear 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 19. 01:13
no와 pw 2개의 인자를 GET 방식으로 입력받는다. pw에서는 싱글 쿼터(')를 필터링하고, no에서는 싱글쿼터('), substr 함수, ascii 함수, 등호(=), or, and, like, 0x, 공백까지 모두 필터링한다. 따라서 이 모든 필터링을 피해서 pw를 찾아내야 한다. 우회 방법은 아래와 같다. 공백 → \n (URL Encoding: %0a) 등호(=), LIKE → instr 함수, IN 연산자, 부등호() 싱글 쿼터(') → 더블 쿼터(") ascii 함수 → ord 함수, hex 함수 substr 함수 → mid 함수 OR → || AND → && (URL Encoding: %26%26) instr 함수에 대한 설명은 아래를 참조하자. ...더보기 instr 함수 - 형식: i..
-
[LOS] 12. darkknight 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 18. 21:19
이번에는 pw와 no 2개의 인자를 GET 방식으로 입력받는다. pw는 싱글 쿼터(')를 필터링하고, no는 싱글 쿼터('), substr 함수, ascii 함수, 등호(=)를 필터링한다. 싱글 쿼터(')의 사용이 막힐 경우, 더블 쿼터(")로 대체하여 사용할 수 있다. 또한 등호(=)는 like로 대체하여 사용한다. 이를 이용하여 pw의 길이를 알아내자. pw=1&no=1 or id like "admin" and length(pw) like 8 이제 실제 pw가 무엇인지 알아내자. ascii 함수는 ord 함수로 대체해서 사용할 수 있다. substr 함수는 mid 함수로 대체하자. (바로 이전 문제인 golem과 달리 darkknight는 substr만 필터링하기 때문에 substring도 필터링 대..
-
[LOS] 11. golem 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 18. 17:13
이번 문제에서는 or과 and를 필터링할 뿐만 아니라, 등호(=)와 substr 함수까지 필터링한다. 그런데 하단의 코드를 보면 알 수 있듯이, pw를 알아내야 문제가 풀리므로 substr 함수가 아닌 다른 함수를 사용하여 pw를 알아내야 한다. or은 ||로, and는 &&(%26%26)으로 우회 가능하다. 또한 등호(=)는 LIKE로 우회가 가능하므로, 아래와 같이 인자를 주면 Hello admin 문구가 출력된다. pw=1' || id like 'admin 이를 이용해서 pw의 길이를 알아내보자. pw='1' || id like 'admin' %26%26 length(pw) like 8--%20 pw의 길이가 8이라는 것을 알았으니 이제 실제 pw를 찾아보자. substr 함수는 substring ..
-
[LOS] 9. vampire 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 17. 16:55
id를 입력하면, strtolower 함수에 의해 입력한 문자열이 모두 소문자로 변환된다. 또한 id에 admin을 입력할 경우 str_replace 함수에 의해 공백으로 필터링된다. 이 두 함수를 모두 우회하여 admin으로 로그인해야 문제가 해결될 것이다. troll 문제 때처럼 ADMIN을 입력해도 strtolower 함수 때문에 다시 admin으로 변환되기 때문에 결국 str_replace 함수 필터링에 걸리게 된다. 따라서 결론적으로는 str_replace 함수를 우회해야 한다. str_replace 함수는 문자열 중간에 같은 문자열을 끼워넣으면 우회가 가능하다. 즉, 아래와 같이 입력하면, str_replace 함수에 의해 끼워넣어진 admin이 공백으로 필터링되고, 양옆의 admin만 남아서..