로키8의 보안때문에 실습이 지연되어 centos7로 테스트
네트워크 설정하고, firewall-cmd로 http 허용
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
* 센토스 centos 7.9가 2024 06 30일자로 EOL종료되어 yum install이나 update시 에러발생
해결방안
1. suse linux가 제공하는 유료지원 이용
https://www.suse.com/ko-kr/products/multi-linux-support/
1년 기준 67달러
2. 저장소 변경
/etc/yum.repos.d/CentOS-Base.repo 파일을 열어서 기존 주소 주석처리하고 변경
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
baseurl=http://vault.centos.org/7.9.2009/centosplus/$basearch/
무료로 이용가능
xss 공격 실습 이어서
alert창이 뜬 모습
소스코드를 수정하여, userid를 그대로 출력하는 부분을 삭제한다
그럼에도 불구하고 해당 코드에는 xss 위험성이 존재한다
input hidden값으로 그대로 출력하는 코드가 있기 때문
기존코드를 그대로 붙여넣으면 이렇게 태그안쪽으로 들어가면서 실행되지 않는다
Escape tag
공격코드 : "><script>alert("aa");</script>
input hidden 소스를 ">로 닫아버리고 새로운 소스코드를 이어붙여서 실행시킨다
Tampering type attribute
공격코드: " type="text" onfocus="alert('aa')" autofocus a="
사용자입력(<?=$_GET['uesrid']?>)이 type 속성보다 앞에 있을 때 type="text"를 선언하여 덮어버리는 공격방식
인데 실습에선 hidden이 아니라 button을 이용해서 실행된듯
display:block 활용
구버전 IE(6,7,8) 또는 Firefox 구버전에서 사용가능
공격코드: " onmouseover="alert(45)" style="display:block;width:100%;height:1000px;" a="
style로 display:block을 지정하여 나타나게 하는것. 현재 대부분 브라우저가 style보다 type=hidden을 우선하여, 최신버전들에서는 소용없다고 한다
accesskey + onclick와 Using onbeforetoggle는 실행되지 않았다
버전 차이인가보다
Using oncontentvisibilityautostatechange
2024년 7월에 새로 추가된 벡터라고 한다
oncontentvisibilityautostatechange를 통해 트리거하여 XSS 동작
사용자 interaction없어도 됨
공격코드: " oncontentvisibilityautostatechange="alert(/aa/)" style="content-visibility:auto"
+
type과 style의 차이점
type="hidden" / style="visibility:hidden" => 렌더링시 element가 보이지 않도록 함
style="visibility:none" => 렌더링시 element가 보이지 않도록 하지만 position과 size 유지
강사님 강의와 블로그 ( https://www.hahwul.com/2016/06/20/web-hacking-hiddenxss-xss-in-hidden/ ) 참고
Burp로 회원정보수정 살펴보고 파라미터 확인
POST /membereditok.html HTTP/1.1
중략
tb=member&no=3&username=%EB%B8%94%EB%9E%99%ED%96%87&userpw=222222&useremail=test%40naver.com
=> CSRF(씨써프)공격 시도
<form> 태그를 이용해 input type hidden으로 tb, no, username, userpw, useremail등을 설정하여 POST로 전송한다
admin이 해당 게시글을 클릭하면 비밀번호가 변경된다
그런데, 기존의 회원정보수정 바로 전 화면으로 이동된다
이렇게 되면 관리자가 눈치채게 되므로 iframe을 이용한다
<iframe name="iframeTest" width="0" height="0"></iframe>
<script>document.getElementById("csrftest").submit();</script>
<form target="iframeTest" id="csrftest" method=POST action=/membereditok.html>내용들</form>
이런식으로 iframe에만 내용을 출력시켜 눈치채지 못하게 한다
이제는 회원정보수정 화면이 아니라 게시글이 나온다
대응방안
CSRF 토큰값 생성
memberedit.html 에서 일회성 CSRF 토큰값(랜덤문자열)을 생성하여 세션변수에 저장하고
membereditok.html파일로 전송하여 방어한다
세션의 이해 $year = 2024; echo $year => 파일1, 2024 출력 echo $year => 파일2, 아무것도 출력되지 않는다 두 파일간에 변수가 공유되지 않았고 include되지도 않았으니 파일2에는 $year가 없어서 출력되지않는다 파일간 변수를 글로벌하게 공유하기 위해 세션을 사용한다 session_start(); $_SESSION['year'] = 2024; => 세션변수의 셋팅 |
$randomBytes = openssl_random_pseudo_bytes($number);
return base64_encode($randomBytes);
=> openssl 이용하여 32바이트 랜덤생성 후, base64로 인코딩한다. 이를 함수로 묶어놓기.
include_once("php파일명");
해당 php파일명 안에 들어있는 함수 등을 가져다 쓸 수 있다
$_SESSION['csrftoken'] = return된 base64_encode($randomBytes)값넣기.
form안의 input type hidden으로 토큰값을 넣어준다
member 정보 update 쿼리전에 검증을한다
# cat /var/lib/php/session/sess_rq701j1uo511tth68653sgkee4
userid|s:5:"admin";username|s:9:"관리자";year|i:2024;csrtfoken|s:44:"IIRoC3N/aQ0lj/LE2LaxmT14ujonvAV1pqS8CHyVVLo=";
cat으로 세션파일을 읽어보면, form input에 token값이 그대로 저장되어 있음을 알 수 있다
burp로 echo를 통해 response 디버깅을 해본 모습
iframe이 아닌 테스트 게시글의 경우 이렇게 alert가 뜬다
iframe의 경우 alert는 뜨지않지만 burp로 확인하면
정상적인 경로가 아니기 때문에 post (폼) 토큰이 존재하지 않아, 공격에 실패한다.
그런데 지금 상태로도 문제가 있다
정상적인 경로로 다른 사용자의 정보를 접근하는 것은 막을 수 없기 때문
select 쿼리로 사용자를 체크해야하는데, 이부분은 시간문제로 다음 시간에 하기로 함.
공격자가 from에 임의의 토큰값을 입력했을때
접근불가.
단, 이 또한 보안취약점이 있는데, 멤버정보수정을 하려고 접근하지 않으면 세션변수가 없기때문.
때문에 로그인시마다 세션변수를 새로 설정하는 부분이 필요하다.