这里只尝试csrf漏洞,不配合其他方式(靶场学习)
LOW
一、查看页面
- 直接修改密码,可以得出是get请求方式,页面提示修改成功

- 抓包查看详细情况

- get请求,传递信息可在地址栏中看见
- 无明显的token防护,那就可能有csrf漏洞问题
二、那就构造一个简单的网页看看
<img src="http://192.168.75.1//DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change" border="0" style="display:none;" />
<h1>404</h1>
<h2>file not found.<h2>
- 只要访问这个网页,浏览器就会直接发送img标签中的请求,使在不知情时密码被修改


- 访问后发现使用原密码password无法登录,使用修改后的密码123456可以登录
- 那就判断出网站存在csrf漏洞
三、代码审计

- 后端代码只对传入的两个密码作比较,相同就修改
- 没有做任何的身份校验和识别
总结:没有对发送请求方做身份识别和校验,存在ccsrf漏洞
Meidum
一、查看页面后无任何明显变化,抓包后页面有什么变化
-
尝试使用LOW级别的方式试试

-
访问自己构造的网站(
192.168.4.1/name.html)发现没有操作成功 -
仔细分析包到的信息,判断这里的防护手段是判断请求包中的referer字段的内容
二、将构造的网站名换成和目标网站名一样的尝试

- 将恶意构造的网站域名换成192.168.75.1后发现存在漏洞,那就推测判断后端对referer字段做了判断
三、代码审计
// 源码
if( isset( $_GET[ 'Change' ] ) ) {
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
if( $pass_new == $pass_conf ) {
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
$current_user = dvwaCurrentUser();
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// 后续代码
- 使用函数
mysqli_real_escape_string()转义特殊字符,防止sql注入的漏洞 - 重点是使用了
stripos()函数验证请求来源,但可被绕过 - 使用函数检查请求来源中的
url是否包含在服务域名中,存在则修改
总结:后端通过函数stripos()判断请求的来源地址是否包含在服务器的地址中,但可以通过构造网站域名来绕过这个防护,实现csrf攻击
High
一、查看页面(无变化)
- 抓包看看情况

- 首先要明确的是,csrf漏洞存是因为后端对操作的用户身份校验存在问题,检验身份的主要和最好的手段就是严格的token生成和销毁流程
- 可以看出这里存在了token,那csrf漏洞可以说是已经被初步阻断了,就算可以绕过也是配合其他漏洞一起攻击的(可以查看本网站其他人通过
xss方式绕过token验证,这里只是简单的学习csrf漏洞) - 这里的可以绕过token的防护,来修改密码的方法就是使用xss漏洞来配合绕过
二、代码审计

- 这里重点使用
checkToken()函数来判断token的有效性,这也是能阻断的前提 - 条件判断语句中使用两种兼容性的设置,一种是JSON的POST请求(前后端风分离的场景),另外一种是普通的表单提交方式(原生的html网页体提交)
- 剩余的就是验证两个密码是否相同,SQL注入的防护
总结:通过在表单中添加token的方式阻断了csrf漏洞,但可以配合xss漏洞配合修改密码
Impossible
代码审计

- 使用函数
check Token()验证token的有效性,彻底阻断了csrf漏洞 - 这里还要求输入原密码,这个要让恶意修改密码的方式被阻止
- 使用转义函数
stripslashes去转义、mysqli_real_escape_string转义特殊字符的方式,防止修改新密码的地方存在SQL注入漏洞
880

被折叠的 条评论
为什么被折叠?



