본문 바로가기

전체 글

(119)
CSRF 1번 공격 시나리오 안녕하세요 이번에는 한 번 공격 시나리오을 짜보려고 합니다. 이번이 처음인지라 저도 많이 찾아보고 참고을 하고 수정을 많이 하겠습니다. 시작하겠습니다. CSRF 실습 1번- 한 페이지의 게시판에서 XSS 공격이 통하는 게시판을 발견했습니다. 그리고 마이페이지에 비밀번호 변경을 할 때 새로운 pw의 파라미터만 있으면 변경된다는 취약점을 찾았습니다. 이 두 개을 이용하여 CSRF 공격이 통합니다. CSRF란? 사이트 간 요청 위조(Cross-sire rquest forgery)으로 자신의 의지와는 무관하게 공격자가 의도한 행위 (삭제,수정,변경 조회 등)를 특정 웹사이트에 요청을 하는 공격입니다. 1) 마이페이지 비밀번호 변경 비밀번호 변경할 때 pw의 파라미터만 보내면 되는 취약점을 찾았습니다. 게다가 P..
los rubiya - 26(red_dragon) 풀이 시작하겠습니다. 보니 no는 숫자 값이네요! 만약 아니면 1로 강제 치환이 되게 해놨네요. id는 7자리이하이구요. 저희가 알아야되는건 no의 값을 알아야만 하네요 음.. 일단 7자리는 안되게 ' or 1# 해보겠습니다. 그럼.. '||no>%23&no=%0a1 해볼게요 %23은 #이여서 한 줄만 주석 처리를 합니다. 그리고 no에 %0a는 한 줄 띄어쓰기해서 #을 피해서 1을 입력하게 합니다. 그러면? 즉 저 sql문에 주석 처리된 것을 없애서 보면 select id from prob_red_dragon where id=''||no> 1 이렇게 됩니다! 그러니 no는 당연히 1보다 크니 참이여서 admin이 나오겠죠! 그럼 이제 찾으면 되겠죠 no의 길이 값은 모릅니다. 왜냐 id의 길이가 한정되어 있..
los rubiya - 25(green_dragon) 풀이 시작하겠습니다. id와 pw에 _ . ' " 을 막아 놨네요 그리고 admin이 출력이 되게 하라네요! 그럼 id에 \' and pw= 가 들어가게 되어서 '을 우회가 가능합니다. 그럼 저희는 이제 admin을 찾으면 되는데 저는 char 구문을 이용해서 admin 문자열을 출력하겠습니다, ?id=\&pw= OR id=CHAR(97,100,109,105,110) %23 아마 char을 못쓰게 했었을 수도 있습니다. 그럼 약간 우회를 더 해보죠. 어차피 if($result['id'] == "admin") solve("green_dragon"); 이 구문을 보시면 id 컬럼에 admin이 나오기만 하면 되잖아요? union 구문을 이용하겠습니다. 일단 잘 통하는지 확인만 해보겠습니다. ?id=\&pw= un..
los rubiya - 24(evil_wizard) 풀이 시작하겠습니다. 전 문제랑 같은데 중간에 same with hell_fire? really? 하네요 전 문제랑 같아 보이냐고 저한테 물어보네요! 한 번 똑같이 해보겠습니다. ?order=if(id='admin' AND length(email)=0,1,100) limit 0,1 ?order=if(id='admin' AND length(email)>0,1,100) limit 0,1 음..? 제 눈에는 같아 보이네요 한 번 제가 전에 짯던 (23번 hell_fire에 썻던) 코드를 그대로 가져오고 url만 수정하고 길이 값도 구하지 않고 그냥 충분히 주겠습니다. import requests import urllib.parse #******parameter:[파라미터이름],parameter value: [파라미..
los rubiya - 23(hell_fire) 풀이 시작하겠습니다. union을 못쓰는데 admin의 email을 찾아야만 하네요 그럼.. 일단 order에 1을 입력해 보겠습니다. ?order=1 1이면 저렇게 나오네요 그럼 한번 if문을 사용해 보겠습니다. ?order=if(id='admin' AND length(email)=0,1,100) 참이면 1 거짓이면 100 나오게 했습니다. 무조건 거짓이니깐 100이 나오겠죠? 이번엔 ?order=if(id='admin' AND length(email)>0,1,100) 참으로 해서 1 나오게 하겠습니다. 1 즉 참이면 admin이 맨 윗줄 나오고 100 거짓이면 admin이 2번째 줄로 밀려나네요! 0은 안되냐고 물으실 수 있는데 이 if절을 하고 나면 결과가 상관없이 admin이 맨 아랫줄에 나옵니다. ?..
los rubiya - 22(dark_eyes) 풀이 안녕하세요 저번에 이어서 계속 풀어보겠습니다. 이젠 if문을 막고 저번 문제처럼 비밀번호를 찾아야 하는 문제네요 더군다나 if(mysqli_error($db)) exit(); 이렇게 문법 오류가 나면 아예 종료하게 해놨네요! 그럼.. 저는 union을 이용하겠습니다. 일단 만약 select 1을 하면 1이 출력이 되잖아요? 그럼 select 1>0 이렇게 하면 1은 0보다 크니 참이잖아요? 그러니 1이 출력이 되어서 select 1이 출력을 하게 됩니다. 더 나아가서 select 1 union select 1>0 이면 어떻게 될까요? 그럼 결국 select 1 union select 1 이 되어서 1이 출력이 될 겁니다. 만약 select 1 union select 1>2 이면 select 1 union..
CSRF 공격 - 실습 (3번 풀이) 시작하겠습니다. 저번에 했던 csrf 실습이랑 내용이 같습니다. 그런데 조금 난해한 부분이 있죠 저 토큰 값이 랜덤으로 할당이 되어서 저 값을 가져와야만 회원 수정이 가능합니다! 이 토큰 값은 마이페이지에 들어가기만 하면 자동으로 할당해지게 되어 있네요 그럼 일단 전에 실습 한 코드에서 추가 코딩하면 될 거 같습니다. 이론은 쉽죠! 먼저 mypage.php에 들어가서 이 응답 메시지에 있는 csrf_token 값을 가져오고 form 태그에 csrf_token에 넣고 바꿀 pw을 적어서 보내기만 하면 되겠죠! 일단 POST 방식만 통하니 XSS 공격이 통하는 곳을 찾아 스크립트을 작성 하겠습니다. 저는 fetch 함수로 mypage.php을 들어가고 난 뒤 DOMParser(); 으로 응답 메시지를 받았습..
CSRF 공격 - 실습 (2번 풀이) 저번 포스팅에 이어서 풀어보겠습니다. 정상대로 로그인을 하겠습니다. CSRF 공격이니 비밀번호 수정하기 위해 마이페이지에 비밀번호를 수정해 보겠습니다! 그리고 버프 스위트로 확인해 보겠습니다. 한 번 GET 방식으로 해보겠습니다. 그럼 POST 방식으로 공격을 하면 되겠죠! XSS 공격이랑 병행하면 됩니다. 전 포스팅에 GET 방식으로 공격한 코드에서 form 태그에 POST으로 바꾸기만 하면 됩니다! 이렇게 하시면 iframe 으로 새 창에 form 태그가 보내지는데 높이랑 너비 값이 0이고 style이 none이라 피해자의 눈에 안 보입니다! 그리고 클릭만 해도 이 POST 방식으로 보내지게 스크립트에 document.forms[0].submit() 이용했습니다. 버프 스위트 통해 확인을 해보니 결국..