[실습5-5] MyPage에 대한 XSS 공격과 꺽쇠 문자 없이 XSS 공격 실습
mypage 화면이다. 이 화면에서 xss 공격을 한다고 해도, 로그인한 계정마다 다 다르게 나오므로 stored xss 공격은 불가능할 것이다. 그러나, 다른 일반적인 웹페이지에서는 admin 계정으로 회원 정보가 나열되어 있는 콘솔 창이 나타날 수 있기 때문에 거기서는 xss 공격이 수월할 것이다.
관리자 모드 (F12) 로 들어가서 Elements를 보면 이렇게 input으로 코드가 짜여진 걸 볼 수 있다.
사용자 입력값인 "해커"가 들어가는데, 이것을 마무리하고 xxs 공격을 하면 어떻게 될까?
<input type="text" class="form-control" name="name" placeholder="Name Input" value="해커">
이 상태에서
<input type="text" class="form-control" name="name" placeholder="Name Input" value="해커"><script>alert(document.cookie);</script>">
이렇게 추가해주는 것이다. (공백 없음)
그러면 직접 웹페이지에 적용해보자.
우리가 입력한 값은 해커이므로, 그 뒤에 추가로
해커"><script>alert(document.cookie);</script>
이 부분으로 수정하는 것이다.
이렇게 입력하고, 수정하기 버튼을 누르면
이렇게 위에 경고창이 뜨고, Name 칸 밑에 ">가 추가로 표시되는 것도 알 수 있다.
취약점이 존재한다고 판단할 수 있다.
그럼 이건 Dom based일까, reflected일까, stored일까?
다시 home에 들어갔다가 mypage에 들어가면 같은 경고창이 뜨는 걸 보면, stored xss 공격이라는 것을 알 수 있다.
database에 입력되었다는 의미이다.
실제로 데이터가 어떻게 저장되어 있는지 cmd 창을 통해 확인해보자.
참고로 mysql로 들어가서 select * from members;
이렇게 치니까 아무 데이터베이스가 선택되지 않았다고 한다.
그럼 데이터베이스를 먼저 선택해야 되는데, 어떤 데이터베이스가 있는지 잘 모른다.
show databases;
이렇게 치면 저렇게 목록이 나오고, 하나씩 시도해보면 된다.
결론적으로는
use pentest;
이렇게 친 후,
select * from members;
이렇게 치면 현재 계정들을 볼 수 있다.
중요한 부분만 잘라서 보면, 해커의 이름에 스크립트 내용이 들어가있는 것이 보인다.
앞에 해커라고 써있는 부분은 한글이 인코딩돼서 그렇다. UTF-8로 디코딩해주면 아마 보일 것인데, 귀찮아서 안 할게요
이렇게 xss 취약점이 존재한다는 것을 판단했다.
만약 꺽쇠를 입력할 수 없는 상황이라면 어떻게 될까?
공격이 불가능할 것이다.
소스코드를 수정해보자.
mypage.php에 들어가서 테스트용으로 name값만 수정해보자.
실제로 입력할 수 있는 부분이 email이랑 company도 있기 때문에, 이것도 다 수정해주는 것이 원칙이긴 하다.
이렇게 추가해주었다. 꺽쇠를 각각 %lt, %gt로 이름을 바꾼 것이다.
처음에는 left right이라서 lt gt 아닐까? 했는데 챗지피티한테 물어보니 less than, greater than이라서 lt gt라고 한단다.
그럼 이렇게 코드를 저장하고, 다시 mypage에 스크립트 코드를 넣고 해보자.
이렇게 밑에 ">라고 써있는 부분은 사라지고, xss 공격이 실패한 것을 확인할 수 있다.
소스코드를 보면,
이렇게 꺽쇠가 다르게 저장된 것을 알 수 있다. 결국 스크립트가 실행되지 않는다.
공격이 불가능해졌다.
꺽쇠가 없는 상태로 공격을 하는 방법은 없을까?
아까 보면 "는 입력이 되는 상태였다.
<input type="text" class="form-control" name="name" placeholder="Name Input" value="해커" onfocus="alert(document.cookie)" autofocus="">
요약하자면, 둘다 이벤트 핸들링을 위해 사용되는 코드인데 onfocus는 우리가 name 칸에 입력하고 수정하고 나서, 다시 name칸을 클릭하면 이벤트가 발생하는 것이고, 다시 커서 위에 놓이기 위해 autofocus로 맞춰주는 것이다.
원래는 autofocus=""를 하지 않고 autofocus만 해주는데, "를 끝내주기 위해서 넣은 것이다.
그럼 다시 실습해보자.
이렇게 수정을 하고
수정된 상태에서 다시 name 칸을 누르면
이렇게 경고창이 뜬다.
아무리 확인을 눌러도 경고창이 지워지지 않는다.
대응 방안
대응하기 까다로운 XSS 취약점
HTML 태그를 사용해야 하므로 대응하기 까다롭다.
게시판에 글만 쓸 수 있다면 보안상 매우 안전하겠지만 서비스성이 떨어질 수밖에 없을 것이다.
보안과 서비스가 서로 반비례하는 상황이다.
사용자 입력값에 따라 대응해야 하는 방법이 다 다르다.
특정 패턴을 통해 값을 골라낼 수 있다면 정규 표현식만으로 대응할 수 있다.
그러나 게시글이나 댓글 같은 경우에 html을 사용하지 않는다면 HTML Entity encoding을 하면 된다.
만약 html을 사용한다면 보안 라이브러리를 사용한다.
보안 라이브러리는 어려우니 건너뛰고
html entity encoding 적용 예시다. 아까 위에서 실습할 때도 사용했던 거와 비슷하다.
원래는 보안 목적이 아니다.
게시글 같은 곳에 <>를 사용하고 싶을 때 사용하기 위해 만든 것이다.
함수를 통해 적용할 수 있는 방법이 있다.
[실습5-6] 취약 환경 시큐어 코딩 적용 실습
우선 reflected xss를 시큐어코딩해보자.
전에 실습할 때 url에 다른 문자를 입력하면 not found하면서 쳤던 부분이 그대로 출력되는 현상이 나타났었다.
이것을 고쳐보자.
error.php를 보면 입력한 value 값이 그대로 출력되는 것을 알 수 있다.
적절한 정규 표현식을 통해 허용된 문자값만 쓸 수 있도록 한다.
이렇게 if절을 추가해주고 저장한다.
이렇게 시큐어 코딩이 적용되었다.
가장 중요한 문제는 게시판이다.
action.php를 켜보자.
이중에서 우리가 보안 라이브러리를 적용시켜야 하는 부분은 content 뿐이다. 다른 곳에서는 우리가 꺽쇠를 사용한다거나 스크립트 코드를 작성할 일이 거의 없기 때문에, content 부분만 신경 써주면 된다.
html이 필요없는 부분에는 일괄로 적용해주자.
common.php에 들어가서 함수를 만들어주자.
이렇게 밑에 공통으로 사용할 함수를 만들어준다.
다시 action.php로 돌아가서, 우선 title과 writer부분에만 함수를 적용해보겠다.
잘 적용되었는지 체크해보자.
이렇게 제목에다가 작성해주자.
이렇게 변했다.
안전하게 적용되었다.
스크립트가 실행되지 않는다. 게시글을 눌러도 아무것도 일어나지 않는다.
수정할 때는 또 스크립트가 실행될 수 있으므로, 수정하는 칸도 바꿔줘야 한다.
action.php 밑에 보면 수정칸이 있다. 여기서 함수를 적용시켜준다.
유닉스나 리눅스 환경에서는, 파일을 업로드할 때 꺽쇠가 들어간다. 이것을 통해 공격할 수도 있으므로 이에 대한 대응도 해줘야 한다.
이렇게.
출력될 때 스크립트가 적용되지 않게끔.
그러나 할 필요가 없는 게, 파일이 아닌 형태라면 파일 업로드 실패 알림이 뜨므로 굳이 할 필요는 없긴 하다.
또한, 보안 라이브러리도 적용시켜주어야 한다.
우리가 적용할 라이브러리는 html purifier이다.
다른 보안 라이브러리를 사용하고 싶다면, 라이선스 문제가 있는지도 확인할 필요가 있다.
구글에 html purifier를 검색한 후 제일 위에 뜨는 사이트를 클릭하여 zip 파일을 다운로드 받으면 된다.
근데 보면 이미 우리 라이브러리에 htmlpurifier가 다운로드 되어있으니 굳이 다운 받을 필요는 없다.
이제 적용을 해보자.
https://gist.github.com/kijin/5829736
여기를 참고하자.
이 코드를 복사해서 common.php에 붙여주면 된다.
함수를 만들어주고 저 중괄호 안에다가 복사한 코드를 집어넣으면 적용 완료이다.
이렇게. 처음엔 들여쓰기가 안되는데, 부분을 다 드래그한 뒤에 tab 버튼을 두번 누르면 들여쓰기가 맞춰진다.
경로는 이렇게 설정해주면 된다.
마지막 이 부분만 수정해주면 된다.
우리는 변수를 value로 만들었으니 이렇게 바꿔주고, html 변수를 반환하도록 추가로 입력해주면 끝이다.
다시 action.php에 들어가서 write 부분에서 content 변수에 xss_html 함수를 적용시켜주고,
당연히 modify 부분에도 수정해주어야 한다.
이제 아까 썼던 게시글을 수정해보자.
contents에 코드를 많이 작성해보자.
수정을 하고 다시 게시글을 눌러보면 이렇게 html 코드는 적용된 것을 볼 수 있다.
스크립트는 실행되지 않지만 html은 실행된다.
그러나 악용할 수 있는 부분이 하나 더 있다.
버프 스위트를 켜주고
수정을 다 한 후 modify 버튼을 누를 때 버프 스위트에선 어떻게 나오는지 봐보자.
여기서 oldfile 부분에 임의로 test 입력값을 넣어보자.
이렇게 밑에 test라는 파일이 입력됐다는 걸 확인할 수 있다.
여기서 취약점이 발생할 수 있다.
만약에 이것을 악용해서 스크립트를 넣는다면 어떻게 될까?
test라고 쓴 부분을 지우고 <script>alert(1)</script>를 써보자.
이렇게
그러고 다시 그 게시글을 누르면 이렇게 뜬다. 스크립트가 발생된다.
oldfile 부분에는 html 코딩이 필요없으므로 여기서 시큐어 코딩을 해주자.
action.php에 들어가서 이렇게 밑에 바꿔주면 된다.
이렇게 적용된 것을 확인할 수 있다.
스크립트가 실행되지 않는다.
또 취약한 부분은 mypage이다.
mypage.php에 들어가서 action 부분에 name, email, company에 각각 xss_html_entity 함수를 적용시켜준다.
그럼 잘 적용되었는지 실습해보자.
이렇게 이름을 바꿔보고 수정해보자.
수정을 완료했으나 똑같이 이렇게 나타나는 것을 볼 수 있다.
"가 적용이 안된다는 것을 알 수 있다.
소스코드를 보자.
아까 화면에서 우클릭을 하고 소스코드 보기를 누르면 된다.
내가 표시해둔 곳을 보면, 아까 입력한 "가 치환된 것을 확인할 수 있다.
'웹 해킹 & 시큐어 코딩' 카테고리의 다른 글
웹 해킹 & 시큐어 코딩 (22) (0) | 2025.02.02 |
---|---|
웹 해킹 & 시큐어 코딩 (21) (0) | 2025.02.02 |
웹 해킹 & 시큐어 코딩 (19) (0) | 2025.01.30 |
웹 해킹 & 시큐어 코딩 (18) (0) | 2025.01.28 |
웹 해킹 & 시큐어 코딩 (17) (0) | 2025.01.28 |