[渗透测试]CSRF相关
懒得整理了,直接贴链接了。
参考资料:
讓我們來談談 CSRF
CSRF
CSRF,跨站请求伪造,也被称为one click attack或者session riding。
XSS与CSRF区别:
- XSS利用站点内的信任用户,盗取cookie
- CSRF通过伪装成受信任用户请求受信任的网站
原理
利用目标用户的合法身份,以目标用户的名义执行某些非法操作
例如,一个转账案例中,初始化链接为
http://www.xxx.com/pay.php?user=xx&money=100
构造恶意链接:
http://www.xxx.com/pay.php?user=恶意用户&money=10000
上述案例中,分析得知这个过程分为两个步骤,首先是会话验证,也就是服务端对cookie的验证,验证成功后,接受不了user和money两个值,并进行转账操作。因此CSRF成功利用的条件有两个:1.用户已经登陆系统。2.用户访问对应的URL。
无防护的CSRF漏洞利用
GET型CSRF代码分析
对于上面这段代码,我们只需要构造GET型URL,提交username和password参数,以此来新建对应的用户名和密码。例如将下面的URL发给管理员,就会在数据库中新增一条数据:
http://.../new_user.php?username=admin&passwpord=123123
如果觉得这种链接过于明显,可以用前端img标签的src属性对其进行隐藏:
<img src="http://..../new_user.php?username=admin&passwpord=123123">
POST型CSRF代码分析
攻击者可以通过开发者工具查看请求,得知传参的名字,以及这个请求是post类型,那么就可以构造一个如下的网页,当用户点击按钮时,即向数据库插入了一条新的用户数据
<form action="http://..../new_user.php" method="post">
<input type="hidden" name="username" value="admin_test">
<input type="hidden" name="password" value="admin_test">
<input type="hidden" name="sub" value="Ok">
<input type="submit" name="test" value="我中奖了">
</form>
CSRF自动化探测
手动探测
手动探测原理在于探测web应用程序具有防止CSRF的措施。
CSRF漏洞预防措施:
- 二次验证:一般情况下需要js验证,是否执行成功取决于用户。
- HTTP referer头
- 是否设置token
- HTTP自定义头
如果web应用程序的HTTP请求中没有对应的预防措施,那么很大程度上就确定存在CSRF漏洞
自动化探测工具
CSRFTester原理:利用代理抓取在浏览器中访问过的所有链接以及所有的表单等信息,通过在CSRFTester中修改对应的表单等信息,重新提交,相当于以此伪造客户端请求,如果修改的测试请求成功被网站服务端接收,则说明存在CSRF漏洞。
CSRF漏洞token防御
CSRF漏洞实质:服务器无法准确判断当前请求是否是合法用户的自定义操作。如果服务器在用户登陆后给予用户一个唯一的合法令牌,每一次操作过程中,服务器都会验证令牌是否正确,如果正确执行操作,不正确不执行操作。一般情况下,给予的令牌会写入表单中隐藏域的value值中,随着表单内容进行提交。
简单模型:登陆验证->登陆成功后,给予一个唯一的令牌。执行操作时,操作过程中验证令牌->成功再进行增删改查
生成token代码:唯一。例如下面的PHP代码生成token。
function generateToken(){
$salt="test".date("h:i:s");
$token=md5($salt);
return $token
}
使用token进行CSRF漏洞防御:
1.登陆验证成功后,在会话session["user_token"]中保存token
2.在后台操作中,增删改查表单中增加隐藏域hidden,设置value为token
3.提交之后进行验证token是否正确
CSRF绕过referer技巧
referer防御CSRF原理
当用户点击被构造好的CSRF利用页面,那么在执行用户对应操作时,提交的HTTP请求中就有对应的referer值,此时服务器端判断referer值是否与服务器的域名信息有关,如果不相关则不执行操作。
PHP referer防御代码编写
是否包含了某个域名
if(strpos($_SERVER['HTTP_REFERER'],'xx.com')!==false){
判断成功
}
else{
判断失败
}
绕过referer技巧
如果服务端只判断当前的referer中是否具有域名,那么直接可以在站点目录下新建文件夹进行绕过,文件夹的名字为判断的域名或者ip地址。
GET型CSRF漏洞利用方法
链接利用:同上文提到的get型CSRF
iframe利用:iframe标签内容将在页面家在过程中自动进行加载,src指向的位置就是页面请求的位置。可以设置iframe的style->display:none,以此来不显示iframe加载的内容,类似于a标签里的href
img标签利用:img标签的内容会随着页面的加载而被请求,以此src指向的位置会在页面家在过程中进行请求
css-background利用:利用css中background样式中的url来加载远程机器上的内容,从而对url中的内容发送http请求
防范
客户端防范:对于数据库的修改请求,全部使用POST提交,禁止使用GET请求。
服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。
验证码验证这种只能作为一个辅助手段,像是二次验证一样。