0x00 原理
xss全称为cross site scripting,中文为跨站脚本攻击。它允许web用户将恶意代码植入到提供给用户使用的页面。代码包括HTML代码和客户端脚本。
0x01 危害
- 盗取用户账户(获取cookie)
- 控制网页数据
- 盗窃企业资料
- 非法转账
- 强制发送电子邮件
- 网站挂马
- 控制受害者机器向其他网站发起攻击
0x02 xss类别以及代码实现
0x02.1 反射型xss
反射型xss也叫非持久性xss,是一种常见的xss漏洞,但是危害较小。
后端代码
<?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
if( 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>
<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中用到的标签
<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绕过的一些技巧
属性与属性之间需要空格,而属性与标签之间可以不用