想不到吧?
簡述
這是在做完 網站前後端開發基礎測試 後學到的一些小知識,所以想記錄一下。
只過濾 <script> 字串安全嗎?
不安全。
- 我可以改用
<SCRIPT
來避開(HTML 沒有分大小寫)
1 2 3 4 5
| <?php $xss = '<SCRIPT>alert(1)</SCRIPT>'; ?>
<div><?php echo str_replace('<script>', '', $xss); ?></div>
|
- 我可以拆成
<scr<script>ipt>
1 2 3 4 5
| <?php $xss = '<scr<script>ipt>alert(1)</scr<script>ipt>'; ?>
<div><?php echo str_replace('<script>', '', $xss); ?></div>
|
- 我可以寫成
<script type="text/javascript">
1 2 3 4 5
| <?php $xss = '<script type="text/javascript">alert(1)</script>'; ?>
<div><?php echo str_replace('<script>', '', $xss); ?></div>
|
- 我可以利用「字串拼接」的方式取代
<script>
(跟 SQL Injection 類似)
1 2 3 4
| <?php $xss = ' " onerror="alert(1)'; ?> <img src="src" alt="<?php echo $xss; ?>">
|
可惡,那我把可疑字元都過濾掉總安全了吧?
不好意思,有個東西叫做「JavaScript pseudo-protocol」,所以不需要那些字元也能執行 JS。
1 2 3 4 5
| <?php $xss = 'javascript: alert(1)'; ?>
<a href="<?php echo htmlspecialchars($xss); ?>">Good Things</a>
|
好,目前我知道的就這些,其他等之後碰到了再回來補。不得不說 XSS 的攻擊方式真的有夠多…