SQL注入步骤_dvwa
1. 查找注入点
以dvwa靶场的low级别为例:
1.1 判断注入的类型
判断是否存在注入点并检验是字符型还是数字型
先输入正确的User ID:1,2,3 点 Submit 后,将正常显示信息
输入错误的数据,例如9,10,11……结果是不显示(空白)
- 输入1’,出现报错
说明此处是注入点,接受相关参数未经正确处理直接带入数据库进行查询操作。 - 通常sql 注入漏洞会被分为2种类型 :
数值型
和字符型
。
输入1 and 1 = 2, 因为1=2为假,如果是数值型,按道理来讲页面会出现报错,但页面如下,没有报错
输入1’ and ‘1’ =’2,页面如下,则说明存在字符型注入
字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
因此,我们可以猜测(仅是猜测)这里的sql语句应该是:
SELECT (某字段)FROM (某个表)WHERE userid = ‘’;
查看源代码
<?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"]);
}?>
第6行可以看出,语句为
query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
2. 获取字段数(order by 取临界值)
通过order by看当前表中存在多少列,ORDER BY 语句用于根据指定的列对结果集进行排序。可以这么理解,如访问id=1 order by 3,页面返回与id=1相同的结果,输入id=1 order by 4,页面返回与id=1不同的结果,则字段数为3。
- 输入1’ order by 2# ,页面正常显示 (这里的#号是注释符,注释后面的引号)
- 输入1’ order by 3# ,出现报错页面
这样我们就可以判断查询结果值为两列。
2.1 确定显示的位置(SQL语句查询之后的回显位置)
输入1’ union select 1,2#
上图可以看到有两个回显,因此我们可以在回显处1和2中显示我们想要获得的信息
3. 查询当前的数据库,以及版本
注:mysql5以上默认在数据库中存放一个information_schema 的数据库,这个数据库中,需要记住三个表名,分别是SCHEMATA、TABLES和COLUMNS。
-
SCHEMATA表存储用户创建的所有数据库的库名,只要记住该表中的字段
SCHEMA_NAME,这个表中记录了数据库库名。 -
TABLES表存储用户创建的所有数据库 库名和表名,字段分别为:
TABLES_SCHEMA和TABLES_NAME。 -
COLUMNS表中存储用户创建的所有数据库的库名、表名、字段名,字段名分别为:
TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME.
输入1’ union select version(),database()#
在回显处,看到了数据库为dvwa,版本是5.5.53
4. 查询数据库中的表
输入1’ union select table_name,2 from information_schema.tables where table_schema =‘dvwa’#
可以看到一个users的表,根据字面意思,里面应该存放的是用户的信息,这是我们想要得到的,所以我们就针对这个users的表继续深入。
5. 查询表中的字段
输入1’ union select column_name,2 from information_schema.columns where table_name =‘users’#
可以看到,在users表里面有user和password字段,我们继续尝试查看这两个字段的内容
输入1’ union Select user,password from users#
可以看到密码被加密,可以使用相应工具进行解密;这里做个演示,以用户gordonb为例:
解密结果为abc123
到此成功拿到用户名密码相关信息。
本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/weixin_43847838/article/details/109833310。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。*