XSS实战(Level1-10小试牛刀)

  • Post author:
  • Post category:其他

XSS实战

说明

环境

Metasploitable2-Linux

步骤:

1.	判断是否存在XSS攻击的可能(提交的内容,页面会显示出来)
2.	判断可输入内容在标签内(属性)还是值
3.	判断闭合(在标签内部的话就需要提前闭合,使XSS的攻击代码生效)
4.	判断是否过滤某些字符(对于<>script这种特殊字符,一旦被过滤,就需要通过大小写,替换,转义等方式来改变)

常用XSS攻击代码

<script>alert("xss")</script>
<img src=1 onerror=alert(1)>
<img src="#" onerror=alert('xss')>
onmousemove=javascript:alert(1)
onclick=alert(1)

level1

可见,name提交的内容就是页面显示的内容,及存在XSS攻击的可能性

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

在这里插入图片描述在这里插入图片描述

level2

1.通过地址栏可以看出,此关卡的提交数据的变量名使keyword,且输入的内容会直接显示在页面上个,说明可能存在XSS漏洞,提交XSS的弹窗代码后,并没有直接弹窗

2.判断提交的内容是否在标签内,一般在输入框内的,肯定在标签内

3.判断闭合,使其input标签提前闭合

"><script>alert('xss')</script>
"用于将value的闭合,>用于对input标签的闭合

在这里插入图片描述在这里插入图片描述
在这里插入图片描述查看后台源代码,可见与预期相符
在这里插入图片描述

level3

1.与之前相同,先判断有无XSS攻击的可能,这里就不做演示了

2.判断输入的内容是否在标签内(直接在浏览器检查元素,看下页面的HTML标签即可,可见是在input标签内)

3.输入大小写,内嵌,都没有用,即并没有过滤特殊字符;猜下可能是用了实体转换,并没有执行弹窗代码

4.使用事件标签,此时就要判断input标签中的value使用的是何种闭合方式,经两次尝试,发现使用的是单引号闭合

为什么要使用事件来触发XSS漏洞?

因为使用常规的标签会被.htmlspecialchars().转换为字符,不会起作用,而事件则不会出现此类问题
'onclick='alert(1)
第一个单引号用于闭合value,即使得onclick值生效;第二个单引号用于对value后的第二个单引号闭合,即使alert(1)生效
这是一个鼠标点击时间,即提交完成后,需要点击输入框

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述查看网页源代码,可见value的闭合方式与预期相符
在这里插入图片描述

level4

1.输入以下代码后,输入框中并没有<>,这种情况属于特殊字符的过滤,测试,发现大小写,内嵌,替换为标签都是没有用的

<scrip>alert(1)</script>

2.尝试事件标签,尝试两次,发现value的闭合方式为双引号,参考level2的闭合方式的解释
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

查看网页源代码,可见对< >进行了过滤,且value的闭合方式为双引号

在这里插入图片描述

level5

1.可见,其页面是对出现script、on、的特殊字符中添加下划线且能够识别大小写,使其不能生效,即不能执行XSS的攻击代码

2.首先莫慌,始终牢记,没有绝对的安全;然后试试a标签,即超链接,思路是使用a标签来创建一个超链接,超链接的内容是一个伪代码,即XSS的弹窗,这样就能轻而易举的执行弹窗代码了

"><a href=javascript:alert(1)>XSS</a>
相信看到这里,你一定能理解前面的">是什么意思吧,还是老套路,即为了闭合value属性,input标签

在这里插入图片描述在这里插入图片描述在这里插入图片描述

HTML的a标签小试牛刀

<html>
<body>

<a href="https://blog.csdn.net/qq_41959899">Eichi-Blog</a>

</body>
</html>

在这里插入图片描述在这里插入图片描述在这里插入图片描述

查看网页源代码,可见与分析一致

在这里插入图片描述

level6

1.此关增加了对超链接的href属性的下划线添加,使其不能生效

2.解决办法就是大小写的替换,如下代码

"ONclick="alert(1)

在这里插入图片描述在这里插入图片描述

查看网页源码,可见与预期相符

在这里插入图片描述

那level5为什么不对事件进行大小写的替换,要使用a标签来创建链接呢?
仔细观察level5的源码就会发现,他是先将输入的内容进行小写的转换了,题外话:一定要注重细节

在这里插入图片描述

strtolower()函数

(PHP 4, PHP 5, PHP 7)

strtolower — 将字符串转化为小写

说明

strtolower ( string $string ) : string

string 中所有的字母字符转换为小写并返回。

​ 注意 “字母” 与当前所在区域有关。例如,在默认的 “C” 区域,字符 umlaut-A(ä)就不会被转换。

参数

  • string 输入字符串。

返回值

返回转换后的小写字符串。   

范例

Example #1 strtolower() 范例

 <?php
 $str = "Mary Had A Little Lamb and She LOVED It So";
 $str = strtolower($str);echo $str; // 打印 mary had a little lamb and she loved it so
 ?>  

level7

本关的script、on、href、均被过滤,且大写输入后被转换为小写,但是可以采用内嵌的方式,是其生效,即让页面过滤调内嵌的即可,有很多方法,以下列举出两个

"oonnclick="javascript=alert(1) onclick是一个属性,其还是在标签内的,第一个双引号用于闭合value的"
"><scscriptript>alert(1)</scscriptript> <script>是一个标签 ">用于闭合input

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
查看网页源码,可见于预期相符,老套路,这里不多赘述
在这里插入图片描述

level8

本关是将输入框的内容创建到超链接上,大小写,关键字符都被添加了下划线,这属于对关键字符的形变

解决:

采用特殊字符的转义,即不直接执行特殊字符,而是先转义,这样就绕过了后台的形变,过滤等,有以下这几种常用的字符转义

1.url转码
2.hex转码
3.HTML实体转码

HTML实体转码

字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。

这么做的目的主要有两个:
1、解决HTML代码编写中的一些问题。例如需要在网页上显示小于号(<)和大于号(>),由于它们是HTML的预留标签,可能会被误解析。这时就需要将小于号和大于号写成字符实体:
小于号这样写:&lt; 或 &#60;
大于号这样写:&gt; 或 &#62;
前面的写法称为实体名称,后面的写法则是实体编号。ISO-8859-1字符集(西欧语言)中两百多个字符设定了实体名称,而对于其它所有字符都可以用实体编号来代替。
2、网页编码采用了特定语言的编码,却需要显示来自其它语言的字符。例如,网页编码采用了西欧语言ISO-8859-1,却要在网页中显示中文,这时必须将中文字符以实体形式写入HTML代码中。

将sc字符转换为HTML实体为

&#x73;&#x63;
页面的输入框内输入java&#x73;&#x63;ript:alert(1),结果如下图

在这里插入图片描述在这里插入图片描述在这里插入图片描述

查看网页的后端源码

在这里插入图片描述

level9

页面分析:

无论输入什么,友情链接都是固定的内容,可以初步推断出,a标签是写死的内容,检查前端元素可以看出来,与预期相符

注意:
	这里的查看前端的内容只是简单的猜测,有可能后台使用了一些函数,前台是完全看不到的,当然此关卡的后台代码确实是使用了一些函数的

继续分析:

​ 如果这里的连接是写死的,那么逻辑上将会出现问题,所以,后台应该是对输入的信息进行了某些字符的筛选导致验证出来不是正常的连接才会显示链接不合法的信息;猜测,一般的链接肯定存在http://的,所以可能是这段字符串后台有某种甄别机制,经测试,确实是要输入http://的,可见下图的展示

​ 既然这里是将输入的内容创建为友情连接下,那么可以使用伪代码的方式来构造XSS攻击,但是存在字符的修改过滤手段,则沿用上一关中的HTML实体的转码这种绕过手段,代码如下

java&#x73;&#x63;ript:alert('http://')

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

查看网页后台代码,可见大致与预期相符

在这里插入图片描述

PHP strpos()函数

定义和用法

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

注释:strpos() 函数对大小写敏感。

注释:该函数是二进制安全的。

相关函数:

  • stripos() – 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
  • strripos() – 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
  • strrpos() – 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

语法

strpos(string,find,start)
参数 描述
string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符串。
start 可选。规定在何处开始搜索。

技术细节

返回值: 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。 注释:字符串位置从 0 开始,不是从 1 开始。
PHP 版本: 4+

level10

此关的界面就比较清奇,没有输入的位置,查看页面元素,可以发现三个input标签被隐藏了,将其取消隐藏就可以看到三个输入框,但是页面读取的是哪个对话框,并不能知道,那就直接在地址栏对input标签的name属性进行输入测试即可

​ 经测试,发现只有t_sort这个属性才能被赋值,即可以进行XSS的攻击,由于这里采用的是鼠标点击的事件,那么需要去掉这个输入框的隐藏属性,就可以进行鼠标的点击

代码如下,在level10.php后写入如下命令即可

?t_sort="onclick="alert(1)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

查看页面的后台代码
在这里插入图片描述

总结:

​ 攻击思路分为以下这几点,注意,以下这几点是层层递进

1.判断能否攻击,即输入的内容会被执行并显示在页面上

2.判断输入的内容是在标签内还是需要成为一个属性,若需要成为独立的标签或属性,就要打破闭合

3.判断页面的过滤方式,常见的有以下这几种过滤手段,大小写过滤、常用标签修改过滤、对特殊字符的替换过滤(使用replace函数将常用的字符替换为空)

4.页面有XSS了,判断出来过滤方式了,那就进行XSS的攻击吧,首先要对过滤手段进行绕过,常用的绕过有,字符大小写、内嵌绕过、a标签的超链接绕过、事件绕过(鼠标的移动,点击等)、url hex HTML实体转码绕过


版权声明:本文为qq_41959899原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。