本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程
1. 简介
-
CSRF 是什么
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one clickattack/session riding,缩写为:CSRF/XSRF。
-
CSRF 可以做什么
你这可以这么理解CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
-
审计 csrf
敏感表单是否使用token 验证
-
防御策略
1.验证HTTP Referer 字段
2.在请求地址中添加token 并验证
3.在HTTP 头中自定义属性并验证
2. DVWA 源代码
-
源代码
<?php if (isset($_GET['Change'])) { // Turn requests into variables $pass_curr = $_GET['password_current']; $pass_new = $_GET['password_new']; $pass_conf = $_GET['password_conf']; // Sanitise current password input $pass_curr = stripslashes( $pass_curr ); $pass_curr = mysql_real_escape_string( $pass_curr ); $pass_curr = md5( $pass_curr ); // Check that the current password is correct $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';"; $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' ); if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){ $pass_new = mysql_real_escape_string($pass_new); $pass_new = md5($pass_new); $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); echo "<pre> Password Changed </pre>"; mysql_close(); } else{ echo "<pre> Passwords did not match or current password incorrect. </pre>"; } } ?>
-
DVWA 中用到的防御函数
-
stripslashes() 函数
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠
语法: echo stripslashes("Who\'s Bill Gates?");
-
mysql_real_escape_string() 函数
转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:\x00 \n \r \ ' " \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
语法: mysql_real_escape_string(string,connection)
-
md5() 函数
计算字符串 “Hello” 的 MD5 散列
用法: <?php $str = "Shanghai"; echo md5($str); ?>
-