Wargame(Web)/Lord of SQLInjection

    (Lord of SQLInjection) POLTERGEIST 문제

    (Lord of SQLInjection) POLTERGEIST 문제입니다. 먼저 제공되는 소스코드를 살펴보면 필터링은 db, poltergeist.db를 필터링하고 있습니다. 값은 pw를 받고 있고 결과값을 Hello 뒤에 붙혀 출력해주고 있습니다 pw를 찾으면 문제가 해결되는 문제라고 하는데 주석에 친절하게 pw는 FLAG{ }구조이며, member 테이블에 없다고 합니다. 즉 union을 활용하고 MySQL에서 사용하는 information_schema를 SQLite에서는 어떻게 사용하는지를 묻는 문제로 보입니다. SQLite에서는 information_schema가 없고 대신 sqlite_master이 존재합니다. 위 내용을 토대로 전달할 값을 구성해보면 아래와 같이 구성할 수 있습니다. ?pw=-..

    (Lord of SQLInjection) banshee 문제

    (Lord of SQLInjection) banshee 문제입니다. 잘못알고 있는게 있다면 알려주시는 댓글은 언제나 환영입니다. 이번 문제는 pw를 정확히 찾는 블라인드 SQL문제입니다. 이전 문제와 동일하게 SQLite를 사용하고 있습니다. 필터링으로는 sqlite, member, _ 를 막고 있습니다. SQLite도 MySQL과 동일하게 length() 함수와 substr()함수의 사용이 가능합니다. 이를 이용해 패스워드의 길이를 찾는 값을 구성해보면 ?pw=-1' or id='admin' and length(pw)=?-- - 위와 같이 구성할수 있습니다. 중간에 id='admin'을 추가한 이유는 우리가 찾으려는 pw는 admin의 pw인데 시도해보니 다른 id도 존재해서인지 True값이 두개가 출..

    (Lord of SQLInjection) manticore 문제

    (Lord of SQLInjection) manticore 문제입니다. 잘못알고 있는게 있다면 알려주시는 댓글은 언제나 환영입니다. 이번 문제도 SQLite를 사용하는 문제입니다. MySQL문제에서 많이 봤던 함수 addslashes가 사용되고 있습니다. 문제해결을 위해서는 id가 admin이 되어야 한다고 합니다. 먼저 SQLite에서 addslashes가 작동되면 어떻게 되는지 알아야합니다. addslashes함수는 싱글쿼터등에 앞에 \ 를 추가해 문자열로 바꿔버리는 함수입니다. SQLite에서도 동일하게 동작되는지 확인하기 위해 온라인에디터를 이용해 확인해봤습니다. select '\''; MySQL에서는 \가 싱글쿼터( ' )를 사용하기 위해 사용한것으로 인식해 정삭적으로 쿼리가 실행됬었으나 SQL..

    (Lord of SQLInjection) chupacabra 문제

    (Lord of SQLInjection) chupacabra 문제입니다. 잘못알고 있는 내용을 알려주시는 댓글은 언제나 환영입니다. 먼저 코드를 보면 엄청 간결합니다. 뿐만 아니라 이번에는 DB의 언어가 바뀌었습니다. 지금까지는 mySQL을 사용했는데 이번에는 sqlite를 사용한다고 합니다. 이번문제는 필터링도 없고 어떠한 것도 없으며 id가 admin이면 해결된다고합니다. 해서 mysql과 구문이 비슷할거라는 생각에 ?id=admin'%23 주석처리를 #을 사용했습니다만 아무것도 출력이 되지 않습니다. 곰곰히 생각해보니 sqlite에 사용되는 구문이 다를 수 있다고 생각해 SQLite 관련 레퍼런스를 찾아보니 SQLite는 주석처리가 2가지라고 합니다. (새로운 언어가 나오면 무조건 공부를 하고 도전..

    (Lord of SQLInjection) cyclops 문제

    (Lord of SQLInjection) cyclops 문제입니다. 잘못알고 있는게 있다면 알려주시는 댓글은 언제나 환영입니다. 제공되는 코드를 보면 id가 first이며 pw는 second이어야 한다고 합니다. 추가로 친절하게 주석에는 union select를 사용하라고 알려줍니다. 일단 이전 문제들과 동일하게 CRS방화벽이 걸려있다고 생각하고 문제에 접근하였습니다. 이전에 사용한 CRS를 우회하는 코드를 변형해서 사용하기로 했습니다. -1'

    (Lord of SQLInjection) godzilla 문제

    (Lord of SQLInjection) godzilla 문제입니다. 제공되는 코드를 살펴보면 자주 봐왔던 pw를 찾는 문제입니다. if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("godzilla"); DB에 저장된 pw와 쿼리에 전달한 pw가 일치하면 해결되는 문제입니다. 이전 cthulhu문제부터 CRS 방화벽이 걸려있었고 death문제는 CRS라는 언급이 없었지만 걸려있었기에 이번 문제도 CRS가 걸려있다는 전제로 문제를 풀었습니다. 이전 문제를 풀때 사용했던 값을 가져와 쿼리에 전달해보면 admin을 출력하는 것에는 성공했습니다. 하지만 우리가 찾아야 하는 것은 id가 admin인 값의 pw입니다. 이전 LOS문제를 풀때 사용했던 sub..

    (Lord of SQLInjection) death 문제

    (Lord of SQLInjection) death 문제입니다. 먼저 제공되는 소스코드의 필터링 부터 보면 prob _ . \ admin 등 이전 cthulhu문제와 비슷해보입니다. 하지만 pw부분에서 md5로 입력한 pw가 변경되고 있어 pw의 정확한 값을 찾기는 어려워 보입니다. 해서 pw부분을 무력화 시켜 id를 admin으로 출력하는 방식을 선택했습니다. ?id='||id=0x61646d696e%23 작성한 위 값을 쿼리에 전송해보면 Forbidden이 출력됩니다. 이거는 이전 cthulhu문제와 동일하게 CRS가 걸려있다는 의미입니다. 해서 이전 문제를 해결할때 사용한 코드를 가져와서 값을 전달해보면 id값을 True로 바꾸기만 했을뿐 admin이 출력되지 않았고 guest가 출력되었습니다. 이..

    (Lord of SQLInjection) cthulhu 문제

    (Lord of SQLInjection) cthulhu 문제입니다. 코드를 먼저 살펴보면 필터링으로 prob _ . \ admin 을 필터링 하고 있습니다. 거기에 특별하게 보이는 코드가 보이지 않습니다. 위에 rubiya서버는 ModSecurity Core Rule Set v3.1.0의 level 1을 사용중이라는 이부분이 문제를 해결하기 위해 중요한 부분으로 보여 정확하게 이게 무엇인지 찾아보니 웹 애플리케이션 방화벽중 하나로 SQL인젝션과 LFI RFI등등 OWASP Top 10을 포함한 공격을 보호하는 방화벽이라고 합니다. 이를 우회하기 위해 CRS v3.1.0 Bypass를 키워드로 검색해보니 우회하는 방법이 정리된 자료를 찾을 수 있었습니다. { }나 @같은 기호를 이용해 우회하는 방법을 찾았..