dvwa系列-sql注入

匿名 (未验证) 提交于 2019-12-03 00:18:01

本篇博文就不详细讲解sql注入的成因了,有兴趣的就去看看我sqlilabs的博文吧,我后面会慢慢完成sqlilabs的博文

low

我们先来判断注入点吧,用最常规的单引号试一试,报错了,初步判断应该是字符型的单引号注入。
下面就推断一下后台执行的sql语句,因为这是一个根据输入的id来查找信息的地方嘛,后台sql大概是:

select id,firstname,surname from 表名 where id='用户输入'

firstname,surname字段是我猜的,但是根据页面回显我们可以看到:

页面还是有三处回显的,现在我们需要来判断一下字段数,这样才方便以后利用union语句进行攻击,判断字段数我们一般利用order by语句:

' order by 2#(不报错) ' order by 3#(报错)

由此可见字段数是2,那么我们再构造攻击语句:

' union select version(),database()#


根据这个回显我们也知道id不是从数据库中查询的道德,应该是直接将我们的输入放到了页面上。所以,这部就是一个xss漏洞吗* _ *

medium


看到这个情景下的这个东西,第一反应,抓包,改包。还有这是一道数字型注入
图片中有攻击语句

high


我总觉得这一题与第一题没什么差异,直接单引号就注入了,看看源代码吧:
high等级:

<?php   if( isset( $_SESSION [ 'id' ] ) ) {      // Get input      $id = $_SESSION[ 'id' ];       // Check database      $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";      $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );       // Get results      while( $row = mysqli_fetch_assoc( $result ) ) {          // Get values          $first = $row["first_name"];          $last  = $row["last_name"];           // Feedback for end user          echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";      }       ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);          }   ?> 

low等级

<?php   if( isset( $_REQUEST[ 'Submit' ] ) ) {      // Get input      $id = $_REQUEST[ 'id' ];       // Check database      $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";      $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>' );      // Get results      while( $row = mysqli_fetch_assoc( $result ) ) {          // Get values          $first = $row["first_name"];          $last  = $row["last_name"];           // Feedback for end user          echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";      }       mysqli_close($GLOBALS["___mysqli_ston"]);  }   ?> 

high等级就比low等级多了个limit 1,emmmm没什么好说的

impossible

假装自己会代码审计

<?php   if( isset( $_GET[ 'Submit' ] ) ) {      // Check Anti-CSRF token      checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );       // Get input      $id = $_GET[ 'id' ];       // Was a number entered?      if(is_numeric( $id )) {          // Check the database          $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );          $data->bindParam( ':id', $id, PDO::PARAM_INT );          $data->execute();          $row = $data->fetch();           // Make sure only 1 result is returned          if( $data->rowCount() == 1 ) {              // Get values              $first = $row[ 'first_name' ];              $last  = $row[ 'last_name' ];               // Feedback for end user              echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";          }      }  }   // Generate Anti-CSRF token  generateSessionToken();   ?>  

sql查询用了预编译语句,基本是注入不了了,所以知道以后怎么写代码了吧?

欢迎留言,我会第一时间回复

文章来源: dvwa系列-sql注入
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!