DVWA亲测sql注入漏洞

ops/2024/12/13 3:11:20/

LOW等级

我们先输入1

我们加上一个单引号,页面报错

我们看一下源代码:

 

<?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"]); } ?>

我们看

 

$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"

 

$id = $_REQUEST[ 'id' ];

id也没有进行过滤。。。。我们可以尝试闭合单引号 

比如我们输入id=1' or '1'='1

原句就变成:

 

$query = "SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1';";

 下面是如何来利用sql注入

 

文件读取

写入一句话木马

或者用sqlmap自动化注入:

 

sqlmap.py sqlmap -u "http://www.secexercise.tk/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "uuid=uid15204271354091678690121028269; PHPSESSID=rsv9ga280c8gpn6oheb5vhd8p3; security=low"

sqlmap成功注入

sqlmap获取webshell:

 

 

Medium等级

我们先尝试来抓包:

然后尝试修改id参数,Go向前观察页面变化

 

后面的利用跟LOW等级一样,这里不再赘述

High等级

我们尝试LOW等级的注入方法,发现一下就成功了

我们使用LOW等级的SQL map自动化攻击,发现失效,应为注入的点与返回的点不在同一个页面上

后面步骤不再展示

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(); ?>

重点看以下代码:

 

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();

这里对接受过的参数id进行判断,is_numeric()函数——》如果id是一个数字,则返回真

然后通过使用预编译语句(prepared statements)和参数化查询(parameterized queries)。这些sql语句从参数,分开的发送到数据库服务端,进行解析。这样黑客不可能插入恶意sql代码。

有两种方式去完成这个:

1.使用PDO对象(对于任何数据库驱动都好用)

 

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row }

2. 使用MySqli

 

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }

如果你链接的数据库不是mysql,你可以参考具体数据库所提供的其他选项,例如(pg_prepare() and pg_execute() for PostgreSQL)

Pdo是一个通用的选项。

1|0解释

到底发生了什么呢?你的SQL语句交给prepare 之后被数据库服务器解析和编译了。通过制定参数(不管是?还是命名占位符:name),你都可以告诉数据库引擎哪里你想过滤掉。然后当你执行execute方法时,预处理语句会把你所指定的参数值结合袭来。

这里很重要的就是参数


http://www.ppmy.cn/ops/141418.html

相关文章

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具&#xff0c;支持多种模型和训练方法&#xff0c;包括预训练、监督微调、强化学习等&#xff0c;同时提供量化技术和实验监控&#xff0c;旨在提高训练速度和模型性能。 官方开源地址&#xff1a;https://github.com/hiyouga/L…

【蓝桥杯Day1】:LCR 018. 验证回文串,left++<right--?

1&#xff1a;isalnum() 函数说明&#xff1a; 检查参数c,是否为英文字母或阿拉伯数字。 2.int toupper( int c)&#xff0c;toupper():将字母转位大写。 3.int tolower( int c)&#xff0c;tolower():将字母转为小写。 下面是我自己写的&#xff0c;感觉写的有点搓。 特别注…

系统安全——访问控制访问控制

访问控制 概念 什么是访问控制 access control 为用户对系统资源提供最大限度共享的基础上&#xff0c;对用户的访问权进行管理&#xff0c;防止对信息的非授权篡改和滥用 ​ 访问控制作用 保证用户在系统安全策略下正常工作 拒绝非法用户的非授权访问请求 拒绝合法用户越权…

【Java-数据结构篇】Java 中栈和队列:构建程序逻辑的关键数据结构基石

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 一、引言 1. 栈与队列在编程中的角色定位 栈和队列作为两种基本的数据结构&#xff0c;在众多编程场景中都有着独特的地位。它们为数据的有序…

【前端】live server如何让本地网页能在连接局域网的所有设备中打开

VScode中安装插件live server 找到工作目录中.vscode下方的settings.json 在其中添加下面设置 "liveServer.settings.host": "0.0.0.0", //确保在设置中选择了 0.0.0.0 作为监听地址&#xff0c;而不是 localhost 或 127.0.0.1。 //这将允许其他设备通过你…

对象函数原型

对象 创建对象 字面量{}new Object() 本质都是调用了Object构造函数,因此实例对象的__proto__指向Object.prototype对象 对象属性控制符 设置属性(默认属性描述符为false) Object.defineProperty(obj,key,{属性描述符})Object.defineProperties(obj,{key:{属性描述符},ke…

【单片机外设】MPU及Cache学习与开发

该篇主要&#xff1a;参考正点原子教程和安富莱教程 安富莱_STM32-V7_MPU及Cache部分.pdf 目录 1. 内存保护单元(MPU)介绍&#xff08;了解&#xff09; 1.1. 内存保护单元&#xff08;memory protection unit&#xff09;&#xff0c;简称&#xff1a;MPU 1.1.1. MPU的功能…

解决 Nginx 部署 React 项目时的重定向循环问题

Nginx 错误日志中的以下错误信息&#xff1a; 2024/12/11 11:28:44 [error] 37#37: *6 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 61.169.61.66, server: cms.stormsha.com, request: "GET / HTTP/1.1&q…