XSS
反射型XSS,也叫做“非持久型XSS”,只是简单的把用户输入的数据“反射”给浏览器;
存储型XSS,也叫做“持久型XSS”,会把用户输入的数据“存储在”服务器端。常见的场景是,黑客写下一篇含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的JavaScript代码;
DOM Based XSS,从效果来说也是反射型XSS,单独划分出了是因为DOM Based XSS的形成原因比较特殊,通过修改页面的DOM节点形成的XSS
HTML基本语法
HTML 标签是由尖括号包围的关键词,比如 <html>
HTML 标签通常是成对出现的,比如 <b> 和 </b>
标签对中的第一个标签是开始标签,第二个标签是结束标签
开始和结束标签也被称为开放标签和闭合标签
<!DOCTYPE html> <!-- 声明这是HTML5文档 -->
<html> <!-- HTML有两部分组成,head部分与body部分 -->
<head>
<meta charset="utf-8"> <!-- 指定编码方式 -->
<title>我是文章标题</title>
</head>
<body>
<h2>我是2号标题</h2>
<input type='text' name='input' placeholder="我是文本输入框">
<input type='submit' value='我是确定按钮'>
</body>
</html>
CSS基本语法
规则由两个主要的部分构成:选择器,以及一条或多条声明。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我是文章标题</title>
<style type="text/css">
/* 设置CSS样式 */
h2 {
color:red; font-size: 14px;
}
</style>
</head>
<body>
<h2>我是2号标题</h2>
<input type='text' name='input' placeholder="我是文本输入框">
<input type='submit' value='我是确定按钮'>
</body>
</html>
javascript 语法
在 HTML 中,JavaScript 代码必须位于 <script> 与 </script> 标签之间。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我是文章标题</title>
<script type="text/javascript">
//弹窗
alert('hello world');
</script>
</head>
<body>
<h2>我是2号标题</h2>
<input type='text' name='input' placeholder="我是文本输入框">
<input type='submit' value='我是确定按钮'>
</body>
</html>
成果
XSS挑战
第一题,比较简单,就不放图,直接在URL后加上<script>alert(1)</script>就通关了。
第二题
打开这之后发现源代码value=“ ”里面是空的,就想着把URL改了,但是keyword还必须有东西,
注意要参考源代码里test的格式,不能少了右边的尖括号还有双引号。
<script>alert(1)</script>这段代码写进去之后,跳出弹窗,证明是xss.
补充一个题目,bugku上面一个普通的二维码。
16进制编辑器打开发现末尾,发现有一串数字,没有8,应该是八进制,下面就要写脚本,
把八进制转换为十进制,再转换为字符,就OK啦。
脚本如下:
package java_lianxi;
import java.util.Scanner;
public class 八进制转十进制 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str;
String sr="";
int[] a=new int[42];
Scanner sc=new Scanner(System.in);
str=sc.next();
int n=str.length();
int num=0;
for(int i=0;i<n;i++) {
sr=sr+str.charAt(i);
if((i+1)%3==0&&i!=0) {
a[num]=Integer.parseInt(sr);
sr="";
num++;
}
}
int sum;
char sum2;
for(int i=0;i<num;) {
int x=a[i]%10;
a[i]=a[i]/10;
int y=a[i]%10;
a[i]=a[i]/10;
int z=a[i]%10;
sum=x+y*8+z*8*8;
sum2=(char)(sum);
System.out.print(sum2);
sum=0;
i++;
}
// for(int i=0;i<num;i++) {
// System.out.println(a[i]);
// }
}
}
DOM Based XSS
当输入内容点击“write”按钮后,会在当前页面插入一个超链接,其地址为文本框内容
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
function test(){
//getElementById():查找并定位id元素
//定义一个变量str,获取id为text的值
var str = document.getElementById("text").value;
//将超链接写入id为t的标签中
document.getElementById("t").innerHTML = "<a href='" + str + "' >testLink</a>";
}
</script>
</head>
<body>
<div id="t"></div>
<input type="text" id="text">
<input type=“submit” value=“write” onclick=“test()”> <!– 当点击按钮时,会触发JavaScript的test函数 -->
</body>
</html>
构造如下数据:
‘ οnclick=alert(1)//
输入后,页面代码就变成了:<a href=‘ ‘ οnclick=alert(1)//’ >testLink</a>
CSRF,
Cross Site Request Forgery,即跨站点请求伪造
它是一种常见的Web攻击,也是Web安全中最容易被忽略的一种攻击方式
它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。
一般攻击方式为攻击者诱使用户访问了一个页面,就以该用户身份在第三方站点里执行了一次操作