DVWA靶场实践笔记——CSRF(low级别)

    技术2023-07-09  91

    CSRF是什么?

    CSRF,全称Cross-site request forgery。跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接,或者访问包含攻击代码的页面,在受害人不知情的情况下,以受害人的身份向服务器发送请求,完成一系列非法操作。我愿称之为 借刀杀人!

    我们来进入DVWA靶场看看实际操作吧

    可以发现这是一个修改密码的页面,我们来看看源代码:

    <?php if( isset( $_GET[ 'Change' ] ) ) { // Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // Do the passwords match? if( $pass_new == $pass_conf ) { // They do! $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 ); // Update the database $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $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>' ); // Feedback for the user echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

    分析可以看出,源代码里只要修改密码后和再次确认密码输入的是一致的,就可以执行后面的balabalabala操作,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制:

    if( isset( $_GET[ 'Change' ] ) ) { // Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // Do the passwords match? if( $pass_new == $pass_conf ) {

    漏洞的危害和恶意利用:

    上述我们可以知道,此源代码对于CSRF没有任何的防护机制,只要是password_new和password_conf两次输入一致,就会完成更改密码的情况。 当我们合法正常更改密码之后,网页的URL变化为:

    http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

    当受害者(啥都不懂的小小白)点入这个链接的时候,就可以看到他的密码已经被恶意更改为password。

    需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。

    但是这种直接构造链接让别人点击的方式攻击未免也太憨憨了对吧,内行人一看你的链接就知道是关于密码修改什么什么的。所以,我们可以采用短链接的方式,把原来长长的URL在网上可以转换为一个奇奇怪怪的短URL: 你看,转换之后我们刚刚的长长URL就变为:

    https://w.url.cn/s/AJgSirW

    这样看起来是不是比刚刚那个憨憨地址好多了,但是受害者还最终还是会看到自己密码被修改的页面。所以如果有能力的话,我们还可以写一个假的诱骗页面,把我们生成的短URL导到这个诱骗页面(例如错误404或者其他奇奇怪怪的页面),我就不写这个html了(你要记住今天你的懒惰!)给个图看看: 这样子受害者就不知道自己的密码被恶意更改了。

    至此CSRF (low级别)结束,后面随缘更新一下更高级别的吧。(如果我弄明白了话)

    Processed: 0.008, SQL: 9