用代码来细说Csrf漏洞危害以及防御
开头: 废话不多说,直接进主题。
0x01 CSRF介绍:
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
0x02 CSRF环境搭建:
环境搭建嘛,肯定要PHP的咯,不过别担心,这不有俺在嘛 我给你尝尝代码的味道。
CSRF测试代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?phpheader( "Content-Type:text/html;charset=utf-8" ); if (isset( $_POST [ 'sub' ])){ $username = $_POST [ 'username' ]; $password = $_POST [ 'password' ]; $conn = mysql_connect( "localhost" , "root" , "root" ); $db =mysql_select_db( "test" ); $query = mysql_query( "SET NAMES 'gbk'" ); $sql = "INSERT INTO `adminsql` (`id` ,`username` ,`password`)VALUES (13 , '$username' , '$password')" ; $row =mysql_query( $sql ); //执行sql插入语句 $sql = "SELECT * FROM adminsql" ; if ( $row =mysql_query( $sql )){ while ( $rows = mysql_fetch_array( $row )){ echo "user:{$rows['username']}-----pass:{$rows['password']}" . "<br/>" ; } } } ?> <!DOCTYPE html> <html> <head> <title>CSRF利用场所</title> </head> <body> <b><h2>CSRF测试环境</h2></b> <form action= "" method= "post" > <b>user:<input type= "text" name= "username" /></b> <b>pass:<input type= "password" name= "password" /></b> <input type= "submit" value= "Ok" name= "sub" /> </form> </body> </html> |
0x03 上层代码解释:
代码:<?php ?> 开始和结束 没一门编程语言都有
代码:header("Content-Type:text/html;charset=utf-8"); 将页面的编码设置为UTF-8
代码:代码
1
2
3
|
if (isset( $_POST [ 'sub' ])){ $username = $_POST [ 'username' ]; $password = $_POST [ 'password' ]; |
解释:
代码:
没错 又到了这里 看过我的细说SQL注入的就知道 我解释过一遍了 没看过那篇帖子的也没事哈 我再解释一遍。
1
2
3
4
5
6
7
8
9
|
$conn = mysql_connect( "localhost" , "root" , "root" ); //连接数据库 mysql_connect("HOST你的网站","你数据库账号","你数据库密码"); 赋值给$conn变量 $db =mysql_select_db( "test" ); //mysql_select_db("test"); mysql_select_db()函数是设置数据库, 第一个参数是你数据库名 注意: 是数据库名 不是表名! $query = mysql_query( "SET NAMES 'gbk'" ); //mysql_query()函数是执行一条sql语句 他这里是设置数据库字符编码为gbk $sql = "INSERT INTO `adminsql` (`id` ,`username` ,`password`)VALUES (13 , '$username' , '$password')" ; //SQL语句 INSERT INTO(插入) INSERT INTO 后 面的反引号是你的数据表名 就是数据库test下的表 |
再后面的括号(`id`,`username`,`password`); 这里是数据表里面的值 我有三个字段表 分别是id、usernam、 password这三个
后面的VALUES (13 , '$username' , '$password')"; //第一个参数是id 我没设置那个自增长ID(详 `` 情:http://jingyan.baidu.com/article/fcb5aff7b3a025edaa4a7130.html)
在后面的就懂了吧 就是我前面吧HTML表单的值赋值给那个变量:
1
2
|
$username = $_POST [ 'username' ]; $password = $_POST [ 'password' ]; |
懂俺意思了吧 嘻嘻 就是啊 你单击提交的数据 会插入到数据库的深处
代码:
1
2
3
4
5
|
$sql = "SELECT * FROM adminsql" ; //SELECT(查询) from要查询的表 adminsql if ( $row =mysql_query( $sql )){ //判断sql语句是否执行了 while ( $rows = mysql_fetch_array( $row )){ //执行就把数据库里面的数据表里面的所有字段表用while循环取出来 echo "user:{$rows['username']}-----pass:{$rows['password']}" . "<br/>" ; //echo 输出到页面上 前面的mysql_fetch_array()函数是一行一行获取 值 他吧值赋给了$rows变量 这个函数获取到的值全是array数组 所以要 $rows['username']; 这样取值 输出 } |
我把数据库发给你们吧
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
|
[ table =98%,none] [tr=none ][td][align= right ][align= right ][ size =1em]1[/align] [align= right ][ size =1em]2[/align] [align= right ][ size =1em]3[/align] [align= right ][ size =1em]4[/align] [align= right ][ size =1em]5[/align] [align= right ][ size =1em]6[/align] [align= right ][ size =1em]7[/align] [align= right ][ size =1em]8[/align] [align= right ][ size =1em]9[/align] [align= right ][ size =1em]10[/align] [align= right ][ size =1em]11[/align] [align= right ][ size =1em]12[/align] [align= right ][ size =1em]13[/align] [align= right ][ size =1em]14[/align] [align= right ][ size =1em]15[/align] [align= right ][ size =1em]16[/align] [align= right ][ size =1em]17[/align] [align= right ][ size =1em]18[/align] [align= right ][ size =1em]19[/align] [align= right ][ size =1em]20[/align] [align= right ][ size =1em]21[/align] [align= right ][ size =1em]22[/align] [align= right ][ size =1em]23[/align] [align= right ][ size =1em]24[/align] [align= right ][ size =1em]25[/align] [align= right ][ size =1em]26[/align] [align= right ][ size =1em]27[/align] [align= right ][ size =1em]28[/align] [align= right ][ size =1em]29[/align] [align= right ][ size =1em]30[/align] [align= right ][ size =1em]31[/align] [align= right ][ size =1em]32[/align] [align= right ][ size =1em]33[/align] [align= right ][ size =1em]34[/align] [align= right ][ size =1em]35[/align] [align= right ][ size =1em]36[/align] [align= right ][ size =1em]37[/align] [align= right ][ size =1em]38[/align] [align= right ][ size =1em]39[/align] [align= right ][ size =1em]40[/align] [align= right ][ size =1em]41[/align] [align= right ][ size =1em]42[/align] [align= right ][ size =1em]43[/align] [align= right ][ size =1em]44[/align] [align= right ][ size =1em]45[/align] [align= right ][ size =1em]46[/align] [align= right ][ size =1em]47[/align] [align= right ][ size =1em]48[/align] [/align][/td][td][align= right ][ size =1em][ size =1em] -- phpMyAdmin SQL Dump [ size =1em] -- version phpStudy 2014 [ size =1em] -- [ size =1em] -- 主机: localhost [ size =1em] -- 生成日期: 2017 年 06 月 23 日 21:14 [ size =1em] -- 服务器版本: 5.5.53 [ size =1em] -- PHP 版本: 5.3.29 [ size =1em] SET SQL_MODE= "NO_AUTO_VALUE_ON_ZERO" ; [ size =1em] SET time_zone = "+00:00" ; [ size =1em]/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; [ size =1em]/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; [ size =1em]/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; [ size =1em]/*!40101 SET NAMES utf8 */; [ size =1em] -- [ size =1em] -- 数据库: `test` [ size =1em] -- [ size =1em] -- -------------------------------------------------------- [ size =1em] -- [ size =1em] -- 表的结构 `adminsql` [ size =1em] -- [ size =1em] CREATE TABLE IF NOT EXISTS `adminsql` ( [ size =1em] `id` int (11) NOT NULL , [ size =1em] `username` varchar (32) NOT NULL , [ size =1em] ` password ` varchar (32) NOT NULL [ size =1em]) ENGINE=InnoDB DEFAULT CHARSET=utf8; [ size =1em] -- [ size =1em] -- 转存表中的数据 `adminsql` [ size =1em] -- [ size =1em] INSERT INTO `adminsql` (`id`, `username`, ` password `) VALUES [ size =1em](1, 'aaaa' , '' ), [ size =1em](1, 'aaaa' , '' ), [ size =1em](1, 'aaaa' , 'xss' ), [ size =1em](1, 'aaaa' , 'xss' ), [ size =1em](1, 'csrf' , 'csrf' ); [ size =1em]/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; [ size =1em]/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; [ size =1em]/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; [/align][/td][/tr] [/ table ] |
在mysql的SQL哪里 插入这些代码 然后执行即可
0x04 进入正题:
好了 有了环境 我们就更方便测试了 访问代码页:
构建环境:
ok 假设我现在是一枚网站管理员 现在localhost是我网站 localhost/php/xss/fanshexing.php 是我后台 现在我的同伴他说想帮我管理我的后台 我就把他创建了一个用户 用户名为(escape) 密码为(admin888)
点击ok 提交数据
OK 现在admin是我的号 而escape是我同伴的号 不过在此之前有一个黑客发现我的后台没有用token令牌 存在csrf漏洞 于是他就构造了一个html的文件
代码如下:
01
02
03
04
05
06
07
08
09
10
11
12
|
< script > function s(){ document.getElementById('fuck').submit(); //这里是javascript的代码(详情:[url]http://www.jquerycn.cn/a_10756[/url]) } </ script > < body onload = s ()> < input type = 'hidden' name = "username" value = "heike" > < input type = 'hidden' name = "password" value = "888888" > < input type = 'hidden' name = "sub" value = "123456" > </ form > </ body > |
构建环境:
攻击者视角:好 我现在的身份是一枚"非法用户" 我现在要去拿这个构造的页面发给笨蛋管理员 嘿嘿
假设现在我发送QQ邮件给管理员发了个文件 就是我构造的页面 发给了他
如果管理员打开了 就会自动提交
<input type='hidden' name="username" value="heike"> 用户
<input type='hidden' name="password" value="888888"> 密码
OK 到了管理员视角:
管理员:嘿 escape伙伴 快来瞧瞧 是一个html的文件 是一位叫构造者发给我们的 我们瞧瞧
escape:OK瞧瞧看
点击。。。
当然 这些用户是我从数据库取出来的 在项目中可不会这样 所以说 笨蛋管理员还不知道 我已经在他的后台构造了一个我的用户
0x05 如何构造一个添加管理员的页面?(没安装burpsuite请看:https://bbs.ichunqiu.com/forum.p ... mp;page=1#pid284388):
前面的构造页面太多的代码了 难道我需要全部背下来吗??当然不需要 下来我来教大家怎么构造一个CSRF的添加管理员页面
1、打开burpsuite神器(https://bbs.ichunqiu.com/forum.p ... mp;page=1#pid284388)
OK 打开后要代理服务端才能收到请求的数据
2、代理服务器
在burpsuite的主页面中的proxy里的Options
在浏览器这里设置代理服务器(详情:http://jingyan.baidu.com/article/f0e83a25da4d8222e591019d.html)
我用的是2345浏览器在工具哪里可以设置代理服务器
点击进入Internet后 点击连接
局域网设置
在我下面图画箭头的地方打钩
点击确定即可
3、开始构造
打开我们的管理员后台
查看后台现在有几个管理用户:
现在还有3个管理员
环境构造:
ok 现在我是一名"非法用户" 我发现了这个网站的后台登录地址 而且发现了木有存在token验证
我首先打开了他们的管理员登录的人口地方
user:test pass:test 开启浏览器服务器代理
开启burpsuite
代理好了服务器 开启了burpsuite 就点击ok
OK 接受到了 右击burpsuite界面 Engagement tooles 里面的 Generrate CSRFPoC
可以看到 他已经自己给你构造了一个页面:
复制代码 创建一个HTML文件
如果想修改账号 就吧 <input type="hidden" name="username" value="test" /> value="账号在这里 可以随便修改其他的 这里我就修改为test1"
OK了 Ctrl+s 就可以保存了
查询一下 现在有用户:
有三个用户 我们把这个文件发给管理员
环境构造:我现在又是管理员了 我打开了这个文件 并且在我没有退出登录和销毁cookie的情况下 打开了这个文件
件
点击提交
添加成功:
根据以上流程 我写下了一个具体的流程图:
到了这里 恐怕有很多人会问我 怎么去看这些漏洞是否存在?
答:你要是单单只是看看漏洞是否存在 可以看cookie或者post包中有没有token这种东西 如果存在token那就不能利用了 token就是个验证的玩意 只有服务器和后台有 所以你burpsuite是搜不到的
0x06 CSRF的检测以及防御:CSRF出现的地方通常在权限控制的地方 如会员中心、后台管理、用户注册、发布帖子、用户后台处、交易管理处这几个地方
防御就是开启token验证 token验证能干什么?你开启了token验证后 客服端请求的值必须和服务端的值相同 不能进行修改 这样你burpsuite就不能在改了 就彻底防御了这个漏洞
也可以看看cookie或者post包中有没有token这种东西
用代码来细说Csrf漏洞危害以及防御的更多相关文章
- DedeCMS flink_add Getshell漏洞 管理员CSRF漏洞
DedeCMS flink_add Getshell漏洞 管理员CSRF漏洞 1.漏洞利用 由于tpl.php中的$action,$content,$filename变量没有初始化,从而能操纵这些变量 ...
- CSRF 漏洞测试
CSRF简介: CSRF中文名:跨站请求伪造,英文译为:Cross-site request forgery,CSRF攻击就是attacker(攻击者)利用victim(受害者)尚未失效的身份认证信息 ...
- phpMyAdmin 4.7.x CSRF 漏洞利用
作者:Ambulong phpMyAdmin是个知名MySQL/MariaDB在线管理工具,phpMyAdmin团队在4.7.7版本中修复了一个危害严重的CSRF漏洞(PMASA-2017-9),攻击 ...
- CSRF 漏洞原理详解及防御方法
跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1 是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻 ...
- CSRF漏洞原理说明与利用方法
翻译者:Fireweed 原文链接:http://seclab.stanford.edu/websec/ 一 .什么是CSRF Cross-Site Request Forgery(CSRF),中文一 ...
- CSRF漏洞详细说明
CSRF漏洞详细说明 通常情况下,有三种方法被广泛用来防御CSRF攻击:验证token,验证HTTP请求的Referer,还有验证XMLHttpRequests里的自定义header.鉴于种种原因,这 ...
- php代码审计7审计csrf漏洞
跨站请求伪造,也有人写出xsrf,黑客伪造用户的http请求,然后将http请求发送给存在csrf的网站,网站执行了伪造的http请求,就引发了跨站请求伪造 漏洞危害:攻击者盗用了你的身份信息,以你的 ...
- 学习CSRF漏洞并挖掘CSRF漏洞
什么是跨站请求伪造? 跨站请求伪造(英语:Cross-siterequest forgery),也被称为one-clickattack或者session riding,通常缩写为CSRF或者XSRF, ...
- 2020/1/30 PHP代码审计之CSRF漏洞
0x00 CSRF漏洞 CSRF(Cross-site request forgery)跨站请求伪造:也被称为"One Click Attack"或者Session Riding, ...
随机推荐
- 459. Repeated Substring Pattern
https://leetcode.com/problems/repeated-substring-pattern/#/description Given a non-empty string chec ...
- 2018.10.25 uestc上天的卿学姐(计数dp)
传送门 看了DZYODZYODZYO的题解之后发现自己又sbsbsb了啊. 直接dpdpdp是O(2d)O(2^d)O(2d)更新,O(1)O(1)O(1)查询或者O(1)O(1)O(1)更新,O(2 ...
- Amount of Degrees(数位dp)
题目链接:传送门 思路:考虑二进制数字的情况,可以写成一个二叉树的形式,然后考虑区间[i……j]中满足的个数=[0……j]-[0……i-1]. 所以统计树高为i,中有j个1的数的个数. 对于一个二进制 ...
- MES制造执行系统
mes : Manufacturing Execution System 制造执行系统 起因:ERP系统和底层设备之间出现了断层. 包括资源管理,生产调度,单元分配,生产跟踪,性能分析,文档管理,人 ...
- Android APP测试流程
一. Monkey测试(冒烟测试) 使用monkey测试工具进行如下操作: 1. APP的安装 2. APP随机操作测试(APP压力测试) 3. APP的卸载 二. 安装卸载测试 1. 使用测试真机进 ...
- ELK简单部署
系统环境: IP:192.168.0.156 ruby环境准备 yum -y install ruby-devel ruby-libs ruby-rdoc ruby-ri ruby-static ru ...
- 实战fortran77基础语法2
由于大量的接触fortran77,先学习fortran77吧 1.fortran不区分大小写,fortran77一般全部大写,感觉没必要,不好读,还是用大小写混合着写吧.后缀 .for 为固定格式的代 ...
- vip导致的serverConnection closed by foreign host问题
问题描述: 应应用需求,设计搭建了一套带tokudb存储引擎的percona数据库,使用的是常见的双主架构.具体的架构如下图所示: 在172.20.32.x1上进行验证的时候出现了下面的问题: FHo ...
- JS如何创建对象
js创建对象的方法很多,以下分别介绍
- spring 事务的传播特性
1.声明式事物中,一个类serviceA的方法test1()调用另一个类serviceB的方法test2() 要是serviceB的test2()事务配置在xml文件中为REQUIRED,又在此方法上 ...