重读dvwa的笔记

0x00

花了些时间把dvwa重新看了一遍

虽然以前已经玩过这个 ,但是这次从源码出发的重读还是有新收获

决定写一个学习笔记

0x01

首先是环境搭建

类似的环境搭建文章网上有太多了

而且这篇文章也写的非常好(我就是参照这个搭建的)

http://www.freebuf.com/sectool/102661.html

顺便一提测试的时候记得要在php.ini中开启几个函数

0x02

首先是Brute Force  暴力破解

low

在low下源码的部分

    $user = $_GET[ ‘username‘ ];

    // Get password
    $pass = $_GET[ ‘password‘ ];
    $pass = md5( $pass );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = ‘$user‘ AND password = ‘$pass‘;";

很容易想到万能密码的绕过。。。同样直接爆破密码也是可以的

爆破密码可以写脚本也可以直接用burpsuite的intruder模块爆破 找个字典就行

medium

在medium下源码的部分

    $user = $_GET[ ‘username‘ ];
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitise password input
    $pass = $_GET[ ‘password‘ ];
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass = md5( $pass );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = ‘$user‘ AND password = ‘$pass‘;";

和low比加了一点东西 一个三元运算符

$GLOBALS["___mysqli_ston"]这只是一个自定义全局变量可以不用在意

(ps:MySQLConverter假定此全局变量设置为等于您的数据库连接对象; 如果转换器找到一个mysql_connect

它将(部分地,但是带有一个警告)将您的代码转换为包含$ GLOBALS [“___ mysqli_ston”]的赋值给mysqli_connect函数的结果的代码)

三元运算结果是用mysqli_real_escape_string()函数处理参数或者返回错误(和mysqli_escape_string()这个函数是完全一样的)

这个函数的作用是对一些特殊字符进行转义

  • x00
  • \n
  • \r
  • \
  • "
  • \x1a

可见medium下不能使用万能密码的绕过了

但是如果是gbk编码的话 还是可以用宽字节绕过

抓包可以发现并未做token的验证

所以依然可以使用burpsuite爆破

high

在high下源码的部分

    checkToken( $_REQUEST[ ‘user_token‘ ], $_SESSION[ ‘session_token‘ ], ‘index.php‘ );

    // Sanitise username input
    $user = $_GET[ ‘username‘ ];
    $user = stripslashes( $user );
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitise password input
    $pass = $_GET[ ‘password‘ ];
    $pass = stripslashes( $pass );
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass = md5( $pass );

    // Check database
    $query  = "SELECT * FROM `users` WHERE user = ‘$user‘ AND password = ‘$pass‘;";

代码中可以看到增加了token参数 而且username和password参数同样进行的过滤防护

每次刷新页面都会获得一个随机的参数  这样就很难用burpsuite进行爆破了

那么如何获得token参数呢。。。high难度应该是有办法做出来的

看了下dvwa的源码  index.php有这样一段

if( $vulnerabilityFile == ‘high.php‘ || $vulnerabilityFile == ‘impossible.php‘ )
    $page[ ‘body‘ ] .= "            " . tokenField();

$page[ ‘body‘ ] .= "
        </form>

在high和impossible下会把token写到源码里 这样我们就可以获取了,如下

<form action="#" method="POST">
    Username:<br />
    <input type="text" name="username"><br />
    Password:<br />
    <input type="password" AUTOCOMPLETE="off" name="password"><br />
    <br />
    <input type="submit" value="Login" name="Login">
    <input type=‘hidden‘ name=‘user_token‘ value=‘f7733a69e0bd2f43c9ab3f1c48d49b84‘ />
</form>

然后开始写python脚本吧

0x03

0x04

0x05

0x06

0x07

0x08

0x09

0x10

时间: 2024-11-11 13:26:00

重读dvwa的笔记的相关文章

重读C++ Primer笔记

C++ Primer 5E 有符号和无符号 无符号类型和有符号类型混合运算时,有符号数会被提升至无符号类型,如果其值为负责会产生错误. int main() { unsigned int u = 10; int i = -42; std::cout<<u+i<< std::endl; // 4294967264 if sizeof(int)==4 return 0; } 列表初始化 列表初始化过程不允许损失数据类型精度,所以下面代码中的两行无法通过编译 int main() { d

DVWA学习笔记--06--SQL Injection

0x00 终于到sql注入了 利用应用中传递的参数 ,将恶意sql语句注入到数据库执行 高危害的漏洞 dvwa里的这个指的是回显注入 0x01 low 在low下的全部源码 <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE use

DVWA学习笔记--03--File Inclusion

0x00 第三个是文件包含漏洞 分为远程文件包含和本地文件包含两种 但是远程文件包含是需要开启allow_url_include()这个函数才行 0x01 low 在low下的全部源码 <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> 想怎么包含怎么包含 如果包含的参数错了 则会报错 那么服务器的路径就给爆出来了(开了错误显示) 远程包含-- 本地包含-- 就没写别的文件  直接利用dvwa带的文件 如果不知道绝对

DVWA学习笔记

一开始有点乱,后期会整理哒 DVWA的安装 DVWA的基本漏洞——SQL 乌云上最常见的脚本漏洞莫过于SQL注入和XSS. 脚本安全的本质就是脚本接受了不安全的变量输入,又没得到有效的过滤,最后进入一些对敏感的函数就会对安全造成威胁. 最基本的SQL漏洞: 1 if(isset($_GET['Submit'])){ 2 3 // Retrieve data 4 5 $id = $_GET['id']; 6 7 $getid = "SELECT first_name, last_name FROM

(总结)程序员的思维修炼.

第一章:尝试改变自己. 第二章:德雷福斯模型.从整体角度看待问题.保持实践.学习如何学习的技能. 第三章:双cpu,L与R.多用脑,多记录想法.积极的情感.什么是创作?.多编码,深思熟虑,专注实践. 第四章:增加感观体验.R型开路,L型紧跟(从整体到局部).使用隐喻(异类联想,培养幽默).改变解决问题的角度 第五章:“很少”不意味着“没有”.从多个角度看待问题.你确信?你怎么知道的.凡事总有两面性. 第六章:学习能力可能是成功的最重要因素.技术不是最重要的,持续学习才是最重要的.教育的含义:从学

使用增强学习法之SQ3R主动阅读

读书读得再多,没有记住,没有去用那都没有用,只是浪费时间,我之前就是,读一本书,读完了就放下了,不做笔记,不回顾,当时是学到了东西,可是日子久了,没用了,就发现以前学的东西都忘光了.如果想再用,必须再读.学习是需要方法的,有个好的方法会让学习更有效率和轻松,下面我们来介绍下SQ3R阅读法.内容来自于<程序员的思维修炼> 一个事实:书面指令通常被认为是最无效的,对于你想要训练或教育的大脑,它们当中大部分不是处理语言的.大脑中处理语言的部分相对较小,而大部分都是不懂语言的,我们最善于的是模仿,是天

21. 《程序员的思维修炼》2018-5-22

21. <程序员的思维修炼>2018-5-22 程序员 思维 坦然 随记录 做个小实验.坐下, 抬起右脚顺时针旋转,与此同时,用右手在空中写数字6.-请注意,你的右脚会改变旋转方向! 一旦开始记录这些想法,你就会得到更多如果不使用这种方法,大脑就会停止向你提供东西,但如果你开始使用它,大脑就会非常乐意给你提供比你想要的更多东西.如果你不记录这些伟大的想法,你就不会意识到拥有过它们.确实,转瞬即逝啊. 研究证实:积极的情感对学习和创造性思维非常关键,处于"高兴"的状态可以扩展

django源码分析

原文网址 https://www.jianshu.com/p/17d78b52c732?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation 环境说明 [x] Python 3.5 [x] Django 1.10.4 创建一个django项目 C:\Users\zhengtong>C:\Python35\Scripts\django-admin.exe st

Effective Objective-C 2.0重读笔记---1

上次看这本书的时候匆匆走了一遍,最近不太忙,重温了一遍,把笔记写出来~.. 有兴趣的可以去买一本,感觉这本书还是挺不错的 由于大部分是在坐车的时候用手机写的,所以代码很少,图也很少 1. 尽量使用向前声明,延后引入头文件的时间,这样可以减少编译时间2. 使用arraywithobjects:....如果遇到为空的变量,就会自动终止,后面的变量便会添加不上,切不会报错,会造成数据不一致问题,所以尽量使用字面量语法创建相关对象,减少出错且减少代码量3. 使用字面量创建的对象都是不可变的,如果要获得可