网安第三次实验(CSRF,XSS和点击劫持攻防)
相关资源已上传,正在审核,谢谢~
(一)CSRF攻击和防御
攻击
废话不多说,直接上代码:
`
<form method="POST"
name="transferform"
action="http://localhost/transfer.php"
target="it"
id="transferform"
style="display:none">
<input name="zoobars" type="text" value="1" size="5">
<input name="recipient" type="text" value="csrf_a">
<input type="hidden" name="submission" value="Show Detil">
</form>
<h1>Hi,I'm csrf_a</h1>
<script type="text/javascript">
form = document.getElementById("transferform");
form.submit();
</script>
`
这段代码的意思是,当别人点击了我的链接跳转到我的界面时,我的页面中隐藏了一个表单,并且通过form.submit()直接提交,收攻击者只看到了页面上的Hi,I’m csrf_a而看不到表单提交的过程。
ps:将上面的html拖到myzoo文件夹下,在csrf_a的Profile中添加<a href=‘http://localhost/csrf.html’>Click me</a>即可实现攻击。
防御
CSRF的防御其实也很简单,只要在表单中隐藏一个token就可以,用户的token从session中直接获取,而攻击者无法得知token的值,因此而无法攻击成功。
上代码:
这是在login.php的开始插入的,和我参考的其他博客不同,我说明一下,因为发现每刷新一下就会生成新的session,那么问题来了,在transfer.php中我们post过去session后,session立马更新,这样的话,我们得到的post过来的值和session的值就不同了,验证当然不通过,怎么解决这个问题呢?就是在这里判断下是否已存在,如果session已经存在了,那么就不更新了,在transfer.php中修改:1.修改表单,隐藏发送session
2.获取post过来的值赋值给Post_Token
3.修改判断条件,如果通过则释放session,然后生成新的session。
(二)XSS攻击和防御
攻击
代码贴脸:
攻击的函数分两块,第一块是蠕虫功能的实现,第二块是偷币功能的实现。第一块很简单,就是异步发送请求,改掉受攻击者的Profile的内容,使其为超链接指向攻击页面,当其他用户访问受攻击者时,点击链接也会被攻击。第二块的重点是在第一题的基础上要获取用户的cookie,通过cookie得到用户的token,再将token,zoobars和攻击者用户名通过POST方式发送到transfer.php页面。获取cookie只需要document.cookie就可以(javascript可以直接对DOM操作),然后和前一题一样解码,但是不同的是,我们得到的cookie中除了zoobarLogin外还有PHPSESSID,所以通过对字符串的截取,截出ZoobarLogin的值,然后再去掉等于号前面的名字(这里可以合成一步,直接把token截出来),然后放入要POST的参数中,完事~
PS:后来才知道,第二题获取cookie与token无关。。。按理说第一题的防御也能防第二题,实际情况中,怎么可能知道cookie和token之间的关系啊,而且,token可能在一次会话中多次改变,就算获取到当前的token也可能无法使用…所以我们这里把发送的参数中的&token=“+token+”删去。
上面的是在同源的情况下的测试代码,下面的直接放到Profile中就可以啦,可以绕过token哦~注意在class中不能有空格,加空格表示结束
后来改成ajax请求,不会有弹窗。
防御
XSS的防御比CSRF的防御稍微要好点(我懒),首先要防止传播,根据老师课件上的思路,就是当profile中发现’<'时用<+;(一定要有;)代替,
就是在index.php中添加我注释掉的那行就行。
再要防止偷cookie,那就要HttpOnly了。
在auth.php中做如上修改(我注释的是修改后的亚子)。
原理嘛。。就是这个,官网上查询是六个值,但其实有七个参数,通过尝试,六个参数时,cookie生成失败,第七个值为httponly,即,是否只能通过http协议访问,是的话则无法在js中通过document.cookie访问。
(三)点击劫持的攻击和防御
攻击
就是这个代码:
因为可能每个人的电脑不同,位置就自己调吧,对,也就调个半小时就好了~,攻击的原理就是,我们在iframe中打开了transfer.php页面,但是iframe是透明的,用户只能看到下面那层页面(也就是0+1=he1+2=),这样的话,用户以为他在答题其实是在填写transfer.php中的表单,我的攻击者用户名就是3(现实中谁还用这名字啊,我真是个小genius),那么,怎么让用户在上层的透明页面操作,但下层页面的表单也会随着用户的操作而改变value?通过iframe.contentDocument就可以对获取iframe中的元素了,将里面的表单的值取出来再赋值给下层页面里的表达,让用户以为操作的就是他看到的页面,函数的触发是onmouseover,只要鼠标在iframe上就会不停更新表单里的值。
但上面的方式会由于js的同源策略而获取不到iframe从而被用户识破,那么可以换一种思路,先发送失败一次,将数值都传过去,然后诱导用户点击就可以了。
防御
在000-default.conf里添加(就是我注释掉的那行),然后重启,你会发现Apache不让你重启,这时你的第三次实验就爆炸了~。。。。。。。。。
开玩笑的,输入sudo a2enmod headers后再重启就好了。
防御原理,附上一幅图:
欢迎大家私信和留言,多多交流~