본문 바로가기

전체 글

(297)
[ 1-Day ] XSS in new.loading.page.html 본 포스팅은 학습 목적으로 작성되었으며, hackerone report를 기반으로 작성되었습니다. 분석 레포트 https://hackerone.com/reports/2419227 GoCD disclosed on HackerOne: XSS in new.loading.page.html hackerone.com 공격자는 new.loading.page.html 파일 내 쿼리 매개변수의 부적절한 처리에 기인하는 취약점을 악용하여 URL 쿼리를 조작하여 자바스크립트를 삽입할 수 있다 ( URI를 삽입할 수 있다. ). ?redirect_to=javascript:alert("XSS")와 같이 조작된 URL 매개 변수로 redirectToLanding 함수를 트리거하면 취약한 코드가 삽입된 스크립트를 실행하여 크로스 ..
Dreamhack : XSS Filtering Bypass Advanced Write-Up def xss_filter(text): _filter = ["script", "on", "javascript"] for f in _filter: if f in text.lower(): return "filtered!!!" advanced_filter = ["window", "self", "this", "document", "location", "(", ")", "&#"] for f in advanced_filter: if f in text.lower(): return "filtered!!!" return text filtering 조건들이 이전에 비해 많이 추가되었고, filtering하는 패턴과 일치 시, 곧바로, "filtered!!!" 메시지를 반환한다. iframe 과 javasc..
Dreamhack : XSS Filtering Bypass Write-Up def xss_filter(text): _filter = ["script", "on", "javascript:"] for f in _filter: if f in text.lower(): text = text.replace(f, "") return text @app.route("/vuln") def vuln(): param = request.args.get("param", "") param = xss_filter(param) return param 해당 Challenge의 주요 부분은 위와 같다. vuln 페이지에서 param에 대한 인자 값을 xss_filter 함수로 필터링한다. xss_filter 함수는 ["script", "on", "javascript:"] 를 필터링 한다. 위와 ..
XSS 정리 XSS 공격은 동적처리가 이루어지는 웹 애플리케이션에 대해 악의적인 스크립트( 클라이언트 사이드 스크립트 중 JavaScript )를 삽입하여, 사용자에게 비정상적인 행위를 강제적으로 유도하는 공격이다.  XSS에 대한 구분은 아래와 같다. ( Universal XSS는 이번 정리를 통해 처음 알게되었다.  https://github.com/Metnew/uxss-db?tab=readme-ov-file ) DOM-based XSSXSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS ( Fragment는 서버 요청/응답 에 포함되지 않는다. )Reflected XSSXSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSSStored XSSXSS에 사용되는 악성 ..
Dreamhack : xss-2 Write-Up [[ xss-1 문제 ]] @app.route("/vuln") def vuln(): param = request.args.get("param", "") return param [[ xss-2 문제 ]] @app.route("/vuln") def vuln(): return render_template("vuln.html") XSS-2 가 XSS-1 문제와 달라진 부분은 위의 /vuln 엔드 포인트에 render_template 함수를 통해 페이지를 랜더링 하고 있다는 것이다. ( render_template 함수는 Flask 웹 프레임워크에서 제공하는 함수로, Jinja2 템플릿 엔진을 사용하여 HTML 템플릿 파일을 렌더링한다. 주어진 템플릿 파일( vuln.html )의 이름과 함께 전..
Dreamhack : xss-1 Write-Up def read_url(url, cookie={"name": "name", "value": "value"}): cookie.update({"domain": "127.0.0.1"}) driver.add_cookie(cookie) driver.get(url) read_url 함수의 주요 부분이다. cookie.update({"domain": "127.0.0.1"}) 를 통해 쿠키가 유효한 범위(도메인)가 127.0.0.1 이란 것을 알 수 있다. 여기서 127.0.0.1 은 Target 서버의 local ip이다. @app.route("/flag", methods=["GET", "POST"]) def flag(): if request.method == "GET": return render_t..
md5( ) md5( ,true) 차이 md5('value') 와 같이 쓰이는 경우와 md5('value',true) 와 같이 쓰이는 경우가 있다. 두 경우의 차이점을 어렴풋이 알고 있지만, 기회가 되어 정리하고 넘어가고자 한다. php 의 md5() 함수는 아래와 같은 형식을 가진다. md5( string $str , [ bool $raw_output = FALSE ] ) str 은 해시 값을 생성할 문자열이며, 뒤의 옵션 부분을 true로 설정하면, 32 자리 문자열 ( md5 다이제스트 ) 이 반환되는 대신에 길이가 16인 원시(raw) 바이너리 형식으로 반환된다. 위 실행 코드 중 $php_magic_hash 에 대한 결과는 PHP 의 magic hash란 특수동작에 관한 예제이다. ( a == b와 같은 약한 비교 일 경우에 발생하는..
Webhacking.kr : old-50 Write-Up