해커 이용 js -- alert (1)
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
이것 은 완전히 합 법 적 인 자바 script 코드 로 alert (1) 에 해당 합 니 다.그것 은 대부분의 브 라 우 저 에서 실행 할 수 있다.(현재 내 가 가지 고 있 는 브 라 우 저가 모두 실 행 될 수 있 음 을 테스트 한 적 이 있 지만 이론 적 으로 모든 브 라 우 저가 정확하게 실 행 될 수 있 음 을 보장 할 수 없다. 그 이 유 는 다음 과 같다.)
이 코드 의 장점 은 문자 나 숫자 를 포함 하지 않 고 일부 필터 의 검 사 를 피 할 수 있다 는 것 이다.예 를 들 어 하나의 AJAX 요청 이 숫자 만 포 함 된 JSON 으로 돌아 갈 것 이 라 고 가정 하면 알파벳 이 없 는 것 으로 간단하게 판단 해 바로 eval 한 결과 해커 들 에 게 뒷문 을 남 겼 을 가능성 이 크다.위의 코드 기능 은 매우 간단 합 니 다. 다만 alert (1) 이지 만 같은 원 리 를 사용 하면 더욱 복잡 한 일 을 할 수 있 습 니 다. 예 를 들 어 alert (document. cookie).더 중요 한 것 은 이 코드 가 다시 한 번 나 에 게 해커 의 상상력 은 무한 하 다 는 것 을 일 깨 워 주 었 다. 라 이언 바 넷 트 의 강연 제목 처럼 "XSS: The only rule is no rule" 이다.
그렇다면 이 코드 는 어떻게 작 동 합 니까?
우 리 는 그것 을 두 부분 으로 나 누 어 이해 할 수 있다.
첫 번 째 부분:
자 바스 크 립 트 코드
(
$=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
두 번 째 부분:
자 바스 크 립 트 코드
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
그 중에서 첫 번 째 부분 은 핵심 입 니 다. 우 리 는 먼저 그것 을 분석 하고 먼저 들 여 씁 니 다.
자 바스 크 립 트 코드
($= [$=[]][
(__=!$+$)[_=-~-~-~$] +
({}+$)[_/_] +
($$= ($_=!''+$)[_/_] + $_[+$])
]
)()
($= [$=[]][
(__=!$+$)[_=-~-~-~$] +
({}+$)[_/_] +
($$= ($_=!''+$)[_/_] + $_[+$])
]
)()
분명히 가장 바깥쪽 은 (...) () 형식의 함수 호출 입 니 다. 우 리 는 여기 서 어떤 함 수 를 호출 했 는 지, 무엇 을 되 돌 렸 는 지 볼 필요 가 있 습 니 다. 다음 단 계 는 원래 코드 에서 할당 표현 식 을 추출 하여 다음 과 같은 등가 형식 으로 바 꿉 니 다.
$ = []; //1
__ = !$+$; //2
_ = -~-~-~$; //3
$_=!''+$; //4
$$ = $_[_/_] + $_[+$]; //5
$= [$][
__[_] + //6
({}+$)[_/_] + //7
$$ //8
]; //9
$(); //10
$ = []; //1
__ = !$+$; //2
_ = -~-~-~$; //3
$_=!''+$; //4
$$ = $_[_/_] + $_[+$]; //5
$= [$][
__[_] + //6
({}+$)[_/_] + //7
$$ //8
]; //9
$(); //10
지금 한 줄 로 와 서 보 세 요.
1. $우선 빈 배열 로 할당 (뒤에 덮어 쓰기)
2. __ = ![] + [] = false + [] = "false" 자 바스 크 립 트 연산 의 강제 형식 변환 기능 을 사용 합 니 다. 우선 빈 배열 은 null 값 이 아 닙 니 다. 따라서! [] 의 결 과 는 false (불 형) 입 니 다. false + [] 를 계산 할 때 배열 대상 이 다른 값 과 더 할 수 없 기 때문에 덧셈 전에 먼저 toString 변환 을 합 니 다. 빈 배열 의 toString 은 "" "이 므 로 사실상 false +" 를 계산 합 니 다.. 이 때 false 는 자동 으로 문자열 로 변 환 됩 니 다. 최종 결 과 는 "false" + "=" false "입 니 다. **다시 말 하면 $가 빈 배열 일 때 '+ $' 를 사용 하면 모든 값 을 문자열 로 변환 할 수 있 습 니 다 * *
3. ~ [] 를 계산 할 때 ~ 하나의 숫자 조작 수가 필요 합 니 다. 빈 배열 은 숫자 로 직접 변환 할 수 없 으 면 0 으로 처리 합 니 다. 따라서 ~ [] = ~ 0 = - 1.
자바 코드
참고:
~3 = -4
~[3] = -4
~[3,2] = -1 (숫자 로 변환 불가)
~"3" = -4
~"abc" = -1
참고:
~3 = -4
~[3] = -4
~[3,2] = -1 (숫자 로 변환 불가)
~"3" = -4
~"abc" = -1
그러므로: = - ~ - ~ - [] = - ~ - (- 1) = - ~ - ~ 1 = - (- 2) = - ~ 2 = - (- 3) = 3 이론 적 으로 이런 방식 으로 1 - 9 의 모든 숫자 를 얻 을 수 있다.
4.! '는 true 입 니 다. + $를 사용 하여 문자열' true '로 변경 합 니 다.
5. 여기 서 주의해 야 할 것 은 '값 + []' 으로 '값' 을 얻 는 문자열 형식 이 었 습 니 다. '+ []' 는 0 (플러스 로 인해 [] 가 자동 으로 수치 0 으로 바 뀌 었 습 니 다. 따라서 $$= 'true' [3 / 3] + 'true' [+ []] = 'true' [1] + 'true' [0] = 'rt'
6. __[_] = "false"[3] = "s"
7. ({} + []) 빈 대상 {} 이 문자열 '[object Object]' 로 바 뀌 었 기 때문에 ({} + $) [ /] = "[object Object]" [1] = "o"
9. $를 [[] [s] + "o" + "rt" 로 덮어 씁 니 다. 여기 [[]] 자 체 는 빈 배열 을 포함 하 는 배열 입 니 다. 사실 이 단계 에 서 는 어떤 배열 도 상관 없습니다. (반드시 배열 을 포함 하 는 것 은 아 닙 니 다.) 그러나 작 가 는 $의 첫 번 째 할당 식 을 배열 내부 에 교묘 하 게 놓 아 코드 를 더욱 치밀 하 게 만 들 었 습 니 다. 최종 결 과 는 $= [] [sort] = [[]]].sort = Array.prototype.sort。
10. $호출 ()전체 표현 식 의 최종 값 입 니 다. $는 전역 범위 이 며 window 의 속성 입 니 다. window. $에 해당 합 니 다. Array. prototype. sort 는 this 를 되 돌려 줍 니 다. window. $에 게 this 는 window 입 니 다. 따라서 전체 첫 번 째 부분의 값 은 window 자체 입 니 다. 물론 이 과정의 올 바른 작 동 은 현재 브 라 우 저의 Array. prototype. sort 에 의존 합 니 다.this 를 window 로 사용 할 수 있 는 상황 을 잘못 사용 합 니 다.
첫 번 째 부분 을 통 해 우 리 는 모든 값 을 문자열 로 바 꾸 는 간단 한 방법 을 얻 었 고 임의의 수 치 를 만 들 수 있 습 니 다. 이론 적 으로 자바 script 의 수치 시스템 에서 대부분의 자 모 를 추출 할 수 있 습 니 다 (전부 인지 아 닌 지 는 모 르 겠 습 니 다. 고증 이 필요 합 니 다)..................................................................................
위의 10 단 계 는 브 라 우 저의 구체 적 인 실현 과 관련 이 있 음 을 알 수 있 기 때문에 일부 브 라 우 저 에서 코드 를 수정 해 야 할 가능성 도 존재 한다.
지금 두 번 째 부분 을 보면 사실 매우 밝 습 니 다. 유일 하 게 주의해 야 할 것 은 현재 $는 하나의 함수 이기 때문에 ~ $= ~ 0 (숫자 로 직접 변환 할 수 없 으 면 0 으로 처리) = - 1 입 니 다.
자 바스 크 립 트 코드
[__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)
[__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)
그래서 전체 식 은 다음 과 같다.
자 바스 크 립 트 코드
window["alert"](1)
window["alert"](1)
마지막 으로 한 번 만 더 감개 하고 싶다. 해커 의 상상력 은 무한 하 다. 코드 를 이해 하 는 것 은 어렵 지 않다. 문 제 는 처음에 그들 이 어떻게 생각 했 느 냐 하 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.