[2025-08-12] CSTI
π¦₯ λ³Έλ¬Έ
μ μ λ° κ°λ
Client-Side Template Injection. λΈλΌμ°μ μμ λμνλ ν νλ¦Ώ μμ§μ΄ μ΄μ©μμ μ λ ₯κ°μ ν νλ¦Ώ ꡬ문μΌλ‘ ν΄μλμ΄ λ λλ§λ λ, μλνμ§ μμ ννμ νκ°λ μ€ν¬λ¦½νΈ ꡬ문 μ€νμ μΌμΌν€λ μ·¨μ½μ .
λμ νλ¦
- μ±μ΄ ν΄λΌμ΄μΈνΈ ν νλ¦Ώμ μ¬μ©ν΄ DOMμ λ λλ§
- κ°λ°μκ° μ¬μ©μ μ λ ₯μ ν νλ¦ΏμΌλ‘ ν΄μλ μ μλ μμΉμ λ£λλ€
- ν
νλ¦Ώ μμ§μ΄ ν΄λΉ λ
Έλλ₯Ό μ»΄νμΌ/λ°μΈλ© νλ©΄μ
{{..}}
κ°μ ννμμ νκ° - JS μ€νμΌλ‘ μ΄μ΄μ Έ DOM XSSκ° λλ€.
ν νλ¦Ώ μ’ λ₯ λ° μ·¨μ½μ
- Vue : νλ‘ νΈμλ νλ μ μν¬.
-
EX)
<script src="https://unpkg.com/vue@3"></script> <div id="app">{{ message }}</div> <script> Vue.createApp({ data() { return { message: 'Hello Vue!' } } }).mount('#app') </script>
-
μ·¨μ½ μ½λ μμ
<script src="https://unpkg.com/vue@3"></script> <div id="app"> <?php echo htmlspecialchars($_GET['msg']); ?> </div> <script> Vue.createApp({ data() { return { message: 'Hello Vue!' } } }).mount('#app') </script>
$_GET['msg']
: URLμμ msg κ°μ λ°μμμ 보μ¬μ€htmlspecialchars()
:<
,>
κ°μ HTML νκ·Έλ₯Ό μΈμ½λ©νμ¬ μΌλ°μ μΈ XSS μ°¨λ¨?msg=<script>alert(1)</script>
β<script>
κ°<script>
λ‘ λ°λμ΄μ μ€ν¬λ¦½νΈ νκ·Έλ‘ μ€νλμ§ μμ.
?msg={{1+1}}
μμ 2κ° μΆλ ₯λμλ€λ©΄ CSTI κ°λ₯
-
{{_Vue.h.constructor}}
: μμ±μ. ν¨μλ₯Ό μμ±νκ³ νΈμΆνκΈ° λλ¬Έμ XSS κ³΅κ²©μ΄ κ°λ₯νλ€- EX)
{{_Vue.h.constructor("alert(1)")}}
- EX)
-
- AngularJS : νλ‘ νΈμλ νλ μμν¬. νμ
μ€ν¬λ¦½νΈ κΈ°λ°
-
EX)
<!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js"></script> </head> <body> <div> <label>Name:</label> <input type="text" ng-model="yourName" placeholder="Enter a name here"> <hr> <h1>Hello {{yourName}}!</h1> </div> </body> </html>
-
μ·¨μ½ μ½λ μμ
<!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js"></script> </head> <body> <?php echo htmlspecialchars($_GET['msg']); ?> </body> </html>
- Vueμ μ·¨μ½ μμ μ½λμ λ§μ°¬κ°μ§
htmlspecialchars()
:<
,>
κ°μ HTML νκ·Έλ₯Ό μΈμ½λ©νμ¬ μΌλ°μ μΈ XSS μ°¨λ¨
-
{{constructor.constructor}}
: μμ±μ. ν¨μλ₯Ό μμ±νκ³ νΈμΆνμ¬ κ³΅κ²©- EX)
{{constructor.constructor("alert(1)")()}}
- EX)
-
λμ λ°©λ²
- μ¬μ©μμ μ λ ₯μ νμ λ°μ΄ν°λ‘λ§ λ€λ£¨κ³ , ν νλ¦ΏμΌλ‘ ν΄μλ μ μλ κ²½λ‘λ‘ λ£μ§ λ§κΈ°
- νλ μμν¬λ³ κΈκΈ°/κΆμ₯
- Vue :
v-html
μ μΈλΆ/μ¬μ©μ μ λ ₯ κΈμ§ - Angular :
$sce.trustAsHtml
λ¨μ© κΈμ§,ng-bind-html
μ μ¬μ©μ μ λ ₯ κΈμ§.$compile
λ‘ μ¬μ©μ μ λ ₯μ λ€μ μ»΄νμΌνμ§ λ§ κ².
- Vue :
- CSPμμ
script-src 'self'; object-src 'none';
μ ν΅ν΄ XSS νΌν΄ μΆμ - ν νλ¦Ώ ꡬ문 μ΄μ€μΌμ΄ν
Leave a comment