Web安全之SQL注入漏洞

发表于:2017-7-21 11:56

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:f354f7231c35    来源:51Testing软件测试网采编

  本节知识点
  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注入?
  哪里存在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注入漏洞?
  判断注入
  uand
  1=1 / and 1=2回显页面不同(整型判断)
  u单引号’判断显示数据库错误信息或者页面回显不同(整型,字符串类型判断)
  u\(转义符)
  u-1
  / +1回显下一个或者上一个页面(整型判断)
  uand
  sleep(5) (判断页面返回时间)
  SQL注入漏洞的利用
  MySQL数据库的特性
  一.MySQL中的3种注释风格
  u#
  (url编码为%23)
  u--
  (--后面要跟上一个或者多个空格)
  u--+
  (+相当于空格)
  u/*…*/
  u/*!...*/
  二.MySQL函数利用
  1.常用函数
  luser()---数据库用户名
  l
  mysql>select user();
  +----------------+
  |user()|
  +----------------+
  |root@localhost |
  +----------------+
  1 rowin set (0.00 sec)
  ldatabase()---数据库名
  l
  mysql>select database();
  +------------+
  | database()|
  +------------+
  |security|
  +------------+
  1 rowin set (0.00 sec)
  l@@datadir---数据库路径
  l
  mysql>select @@datadir;
  +-----------------------+
  |@@datadir|
  +-----------------------+
  |C:\server\mysql\data\ |
  +-----------------------+
  1 rowin set (0.00 sec)
  l@@version_compile_os---操作系统版本
  l
  mysql>select @@version_compile_os;
  +----------------------+
  |@@version_compile_os |
  +----------------------+
  |Win64|
  +----------------------+
  1 rowin set (0.00 sec)
  lversion()---MySQL数据库版本
  l
  mysql>select version();
  +-----------+
  |version() |
  +-----------+
  |5.7.16|
  +-----------+
  1 rowin set (0.04 sec)
  l@@version---MySQL数据库版本
  l
  mysql>select @@version;
  +-----------+
  |@@version |
  +-----------+
  |5.7.16|
  +-----------+
  1 rowin set (0.00 sec)
  2.load_file()函数读取文件操作
  前提:
  l知道文件的绝对路径
  l能够使用union查询
  l对web目录有写的权限
  UNION SELECT1,load_file('/etc/passwd’),3,4,5#
  0x2f6574632f706173737764
  UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5#
  路径没有加单引号的话必须转换成十六进制
  要是想省略单引号的话必须转换成十六进制
  3.into
  outfile ‘路径’写入文件操作
  前提:
  l文件名必须是全路径(绝对路径)
  l用户必须有写文件的权限
  l没有对单引号’过滤
  SELECT ‘’ intooutfile ‘C:\\Windows\\tmp\\1.php’
  SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’
  路径里面两个反斜杠\\可以换成一个正斜杠/
  PHP语句没有加单引号的话必须转换成十六进制
  要是想省略单引号的话必须转换成十六进制
  后面路径的单引号不能省略
  或者
  建议一句话PHP语句转换成十六进制
  4.连接字符串函数
  lConcat(str1,str2)---没有分隔符的连接字符串
  l
  mysql>select concat('1234','5678');
  +-----------------------+
  |concat('1234','5678') |
  +-----------------------+
  |12345678|
  +-----------------------+
  1 rowin set (0.03 sec)
  lconcat_ws(separator,str1,str2)---含有分隔符的连接字符串
  l
  mysql>select concat_ws(0x7e,'1234','5678');
  +-------------------------------+
  |concat_ws(0x7e,'1234','5678') |
  +-------------------------------+
  |1234~5678|
  +-------------------------------+
  1 rowin set (0.04 sec)
  lgroup_concat(str1,str2)---连接一个组的所有字符串,并且以逗号分割每一条数据
  l
  mysql>select group_concat('1234','5678');
  +-----------------------------+
  |group_concat('1234','5678') |
  +-----------------------------+
  |12345678|
  +-----------------------------+
  1 rowin set (0.07 sec)
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号