write-up(web)/LOS

    [Lord of SQLInjection] ouroboros write-up

    [Lord of SQLInjection] ouroboros write-up

    문제 화면입니다. 참인 조건을 넣어줬을 때 아무 일도 일어나지 않습니다. 아마 테이블의 pw컬럼은 비어 있는 것 같습니다. 도저히 모르겠어서 라이트업을 보니 Quine이라는 친구를 사용한다고 합니다. Quine(콰인)은 메타 프로그램의 일종으로 입력 없이 자기 자신의 소스 코드를 출력하는 프로그램이라고 합니다. 아래는 레퍼런스에서 가져온 페이로드입니다. [prefix]와 [profix]에는 원하는 값을 넣어도 된다고 합니다. # 싱글쿼트가 필요한 경우 select replace(replace('[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]',char(34),char(39)),char(36),'[prefix] s..

    [Lord of SQLInjection] phantom write-up

    [Lord of SQLInjection] phantom write-up

    문제 화면입니다. ip가 127.0.0.1인 행의 email 값을 알아내야 하는 문제입니다. 일단 기본적으로 insert into 구문에서 values 뒤에 나오는 값은 여러 개가 올 수 있습니다. ,로 구분해서 2개를 넣으면 2개가 동시에 삽입됩니다. 이를 이용해서 email을 구하려고 구문을 짜고 대입하니 나오지 않습니다. 이유를 검색해보니 insert into에 나온 테이블의 이름과 같아서 충돌이 나는 것 같습니다. 그래서 테이블에 별칭을 부여해서 쿼리를 넣어주니 email 값이 성공적으로 등장했습니다. 이 값을 제출하면 문제가 풀립니다~

    [Lord of SQLInjection] frankenstein write-up

    [Lord of SQLInjection] frankenstein write-up

    문제 화면입니다. admin의 pw를 알아내는 문제입니다. error를 표시해주니 error based sql injection을 사용해 줍니다. 괄호가 필터링 되어 있으므로 조건을 표시해주는 case when else end 구문을 사용해줍니다. 파이썬으로 익스 코드를 짜줍니다. 한 문자씩 부루트포싱해서 값을 찾아준 뒤 찾은 값들은 pw에 저장해주면서 누적시켜줍니다. %가 나오면 pw의 끝이므로 while 문을 종료시켜 줍니다. 실행 결과 admin의 pw를 알아냈습니다. 이 값을 입력하면 문제가 풀립니다!

    [Lord of SQLInjection] blue_dragon write-up

    [Lord of SQLInjection] blue_dragon write-up

    문제 화면입니다. 첫 번째 필터링에선 /prob _ . 을 필터링 합니다. 두 번째 필터링에선 ' \를 필터링 합니다. 여기서 중요한 건 필터링이 2개로 나뉘어져 있고 두 번째 필터링을 거치기 전 결과를 확인할 수 있기 때문에 싱글 쿼터를 사용할 수 있다는 점입니다. 이 때 time based injection을 사용할 수 있습니다. sleep 함수와 if 문을 활용해 pw를 알아낼 수 있습니다. 익스 코드는 위와 같이 작성할 수 있습니다. if 문의 조건이 참이면 sleep 함수가 실행됩니다. 파이썬에서 time 모듈의 elapsed.total_seconds() 메서드를 활용하면 해당 코드의 실행 시간을 알 수 있습니다. 아래 실행 결과를 보면 pwLen이 8일 때 값이 2가 넘어가는 것을 볼 수 있습..

    [Lord of SQLInjection] red_dragon write-up

    [Lord of SQLInjection] red_dragon write-up

    문제의 소스 코드입니다. 정말 삽질을 많이 한 문제.. 결국 라이트업을 봤는데 제가 생각한 거랑 방향이 완전 다르더군요 우선 처음에는 id 파라미터를 통해 no의 값을 찾아보려고 별 방법을 다 써봤지만 실패하고 그 다음엔 is_numeric 함수의 취약점을 통해 무언가를 해보려했는데 16진수를 뜻하는 0x를 넣으니 그냥 1로 바뀌어 버렸습니다.. 그래서 결국 라이트업을 보니 부분 주석을 활용해서 푸는 문제더군요 (전에 했던건데..) 아무튼 id에 길이 제한(6자)이 걸려있으므로 id에 '||no< 까지 입력해줍니다. 이후 no에 개행문자 ;%0a 를 입력해주고 no 값을 찾아주면 됩니다. admin의 no는 0~1000000000 사이에 있다는 것을 알게 되었습니다. 이제 이진 탐색으로 no 값을 찾아주..