前言:跨站腳本(Cross-Site Scripting,XSS)是一種經常出現在Web應用程序中的計算機安全漏洞,是由於Web應用程序對用戶的輸入過濾不足而產生的。攻擊者通常利用網站漏洞把而已的腳本代碼(通常包括HTML代碼和客戶端jjavascript腳本)注入到網頁之中,當其他用戶瀏覽這些網頁時,就會執行其中的惡意代碼,對受害用戶可能采取Cookie資料竊取,會話劫持,釣魚欺騙等各種攻擊。
0x00:
在裝好DVWA后我便迫不及待的想試試,那我們先從最簡單的xss開始。
0x01:首先在DVWA Security中將難度調節為low(哈哈,先易后難),之后擇
Xss(Reflected)
及反射型xss開始我們的測試。
先來試試黑盒測試,我們輸入<script>alert(/xss/)</script>

發現提交后只是在下面顯示了個Hello,而我們想要的彈窗卻沒出現。
F12查看源碼發現<pre>標簽,猜測是<pre>標簽將<>實體化了
重新輸入</pre><script>alert(/xss/)</script><pre>成功彈出彈窗。

再用白盒分析以下漏洞的成因:

上述代碼中沒有對name參數作任何過濾和檢查,存在明顯的xss漏洞。
0x01:medium模式
先輸入</pre>
<script>alert(/xss/)</script><pre>測試
0X03:Impossible級別

通過輸出結果分析是對<script>標簽進行了過濾,
重新輸入

成功彈出窗口,存在xss漏洞
使用白盒分析漏洞原因:

可以看出通過$name = str_replace('<script>','',$_GET['name'])這句代碼替換<script>標簽為''空字符。所以我們可以使用上述的雙寫繞過。
· 另一種方法,大小寫混淆繞過:
輸入:
</pre><SCriPt>alert(/xss/)</ScRipt><pre>
0X02:high模式

通樣成功彈出
、服務器端核心代碼:

可以看到high級別同樣使用了黑名單過濾輸入的方法,str_replace()
函數使用正則表達式的搜索和替換,這樣使得雙寫繞過和大小寫混淆不可行。
我們可以考慮
通過img、body等標簽的事件或者iframe等標簽的src注入惡意的js代碼。
輸入:
</pre><img src=1 onerror=alert(/xss/)><pre>

輸入:<a href='#' onclick=alert(/xss/)>test</a>

服務器端核心代碼:

可以看到,Impossible級別的代碼使用htmlspecialchars函數把預定義的字符&、”、 ’、<、>轉換為 HTML 實體,防止瀏覽器將其作為HTML元素。