1、打開頁面
2、傳入xss代碼
payload:<script>alert(xss)</script>,發現返回<script>alert(xss)</script>
3、分析原因
打開f12,沒什么發現
看后端源碼,在這form表單通過get獲取keyword的值賦給$str,然后$str通過htmlspecialchars()過濾
htmlspecialchars()
?是 PHP 中的一個函數,用于將特殊字符轉換為 HTML 實體。這通常用于防止跨站腳本攻擊(XSS),并確保特殊字符(如?<
,?>
,?&
,?"
,?'
?等)在 HTML 上下文中被正確解析。
$str = $_GET["keyword"];
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level2.php method=GET><input name=keyword value="'.$str.'"><input type=submit name=submit value="搜索"/>
</form>
4、構建payload
所以我們通過前端可以看到:<input name=keyword value="<script>alert(xss)</script>">
所以我們考慮將<input name=keyword value="?"這個閉合,然后后面在跟我們的xss代碼,這樣傳入的value就被過濾,但我們xss就被網頁執行
所有構建payload:"> <script>alert("xss")</script>
然后變成:<input name=keyword value="?"> <script>alert("xss")</script>
5、疑惑反思
做題遇到的疑惑:
一開始我在想傳入<script>alert("xss")</script>,不是被htmlspecialchars
函數轉義成<script>alert("ls /")</script>了么,然后又通過代碼:echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>"? 輸出前端,為什么最后頁面顯示是“沒有找到和 <script>alert("ls /")</script> 相關的結果。而不是”沒有找到和<script>alert("ls /")</script>相關的結果.“
通過查閱資料,就懂了
6、網頁渲染過程
原理:
1、你參數傳進去,PHP 后端中使用 htmlspecialchars
對輸入進行轉義
2、然后開始執行PHP的后端代碼,你的參數就執行不了,傳入的payload也執行不了
3、PHP后端代碼執行完后,瀏覽器會將轉義后的字符還原為原始字符進行顯示
4、因此,頁面最終顯示的是用戶原始輸入的內容,而不是轉義后的字符
所以我們要通過閉合來繞開后端的過濾,來執行我的payload
反思:開發與安全缺一不可
總結:
1、xss的payload的構建可以f12查看前端代碼
2、理解構建xss的閉合過程,其實就是繞過過濾