常见漏洞之SQL注入

sql简介

  • 全称Structured Query Language,即结构化查询语言,是一种特殊的编程语言,用于数据库中的标准数据查询语言,也被作为关系式数据库管理系统的标准语言。
  • 含义:Sql注入是代码注入,插入到web表单以及一些查询字符串,由于如果没有合适的过滤,最终达到欺骗服务器使得恶意的sql语句被插入输入字段中执行。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。
  • 成因
    • 程序编写者在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
    • 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL查询语句中。
  • 注意】SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。

SQL注入的危害

 - 数据库信息泄露:数据库中存放的用户的隐私信息的泄露
 - 网页篡改:通过通过操作数据库对特定网页进行篡改
 - 网站被挂马,传播恶意软件:修改数据库一些特定的值,嵌入网马链接,进行挂马攻击
 - 数据库被恶意操作:数据库服务器被攻击,数据库的管理员账号被篡改
 - 数据库被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统
 - 破坏硬件数据,瘫痪全系统

sql注入的分类

按变量类型分:数字型和字符型

数字型不需要闭合,而字符型需要引号闭合

数字型:select * from table where id = 1   
字符型:select * from table where username = ‘admin’    

按HTTP提交方式分:

  • POST注入
  • GET注入
  • Cookie注入:如果我们现在已经知道了XX站管理员的站号和MD5密码了 但是破解 不出来密码(MD5是加密后的一个16位的密码)我们就可以用COOKIE诈骗来实现,把自己的ID修改成管理员的,MD5密码也修改成他的,有工具可以修改 COOKIE 这样就答到了COOKIE诈骗的目的,系统以为你就是管理员了。

SQL头注入点

  • useragent
  • cookie
  • referer

从注入手法分

布尔盲注、时间盲注;联合注入;基于错误回显
二次注入;堆叠注入;宽字节注入
useragent、cookie、referer
  • 布尔盲注

    ①查看是否有注入
    ②查看有多少列:order by
    ③通过二分法猜解得到所有的库:and ascll(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>100–+
    ④通过二分法猜解得到security下的所有表:and ascll(substr((select table_name from information_schema.tables where table_schema=0xsecurity limit 1,1),1,1))>1–+
    ⑤通过二分法猜解users内的字段:and ascll(substr((select column_name from information_schema.columns where table_name=0xsecurity limit 1,1),1,1))>1–+
    ⑥通过二分法猜解得到字段内的值:and ascll(substr((select username from security.users limit 1,1),1,1))>1–+

  • 时间盲注

    • 需要用到的函数
      if(condition,A,B) --如果条件成立返回A,否则返回B;
      sleep(num) --表示延迟几秒
      left(m,n) --从左向右截取字符串 m 返回其前 n 位
      substr(m,1,1) --取字符串 m 的左边第一位起,1字长的字符串
      ascii(m) --返回字符 m 的 ASCII 码
      length(m) --返回字符串 m 的长度
      count(column_name) --返回指定列的值的数目
  • 联合查询注入union:(页面上有显示位时使用,显示位即展示数据的位置)

    ①判断注入点
    我们可以在url后面加入 and 1=1 --+ 执行,然后再写上 and 1=2 --+ 执行,查看页面回显是否相同,回显不同说明这是一个整型注入,如果回显相同则可能存在字符注入 单引号判断‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断) \ (转义符) -1/+1 回显下一个或上一个页面(整型判断)注:加号‘+’在URL中有特殊含义,因此在需要对其进行URL编码为%2b
    ②判断是整型还是字符型
    数字型注入与字符型注入的最大去区别在于 数字型不需要闭合,而字符型需要引号闭合 select * from table where id = 1 数字型 select * from table where username = ‘admin’ 字符型
    ③判断查询列数:通过二分法来猜解列数;
    order by函数是对查询结果按照指定字段名进行排序,除了指定字段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依此类推。
    ④判断显示位:sql union操作符,用于合并两个或多个select语句的结果集
    ⑤获取所有数据库名和当前连接数据库的用户
    select schema_name from information_schema.schemata 使用group_concat()一次性显示数据库名;使用limit依次显示数据库名
    ⑥获取数据库所有表名:select table_name from information_schema.tables where table_schema=‘security’
    ⑦获取字段名:select username,password from security.users
    ⑧获取字段中的数据

  • 报错注入

    • 需要用到的函数
      rand():产生一个0-1之间随机数,rand(0),随机产生一个0-1的随机数,运行多次产生的结果一样
      floor():向下取整,floor(rand()*2),随机产生0和1两个数
      group by:分组排列
      count():统计数量
      concat():将字符串连接起来
  • 堆叠查询

  • 宽字节注入:可多语句查询注入,可以同时执行多条语句的执行时的注入

    • 产生原理
      在数据库使用了宽字符集而WEB中没考虑这个问题的情况下,在WEB层,由于0XBF27是两个字符,在PHP中比如addslash和magic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27会变成0xbf5c27,而数据进入数据库中时,由于0XBF5C是一个另外的字符,因此\转义符号会被前面的bf带着"吃掉",单引号由此逃逸出来可以用来闭合语句。
    • 根本原因
      character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding使用不当。
    • 解决办法
      统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。或对数据进行正确的转义,如mysql_real_escape_string+mysql_set_charset的使用。

漏洞工具:sqlmap

支持五种不同的注入形式: ​布尔盲注、时间盲注、联合注入、堆叠注入、报错注入

详细内容点这里

漏洞利用

  • 判断注入点

    • 提交单引号: 通过提交单引号并根据返回结果判断是否存在注入点,如果返回正常说明存在注入点
    • 提交AND判断: 也可以使用and语句来判断是否存在注入
    • 提交OR判断: 同样的使用OR语句也是可以判断数据库权限的
    • 提交加号: 我们在参数输入1+1,看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b
    • 提交减号: 同样的道理,提交减号也可以实现判断注入点,但不需要进行编码转化
  • 常用判断语句

    index.php?id=1 union select 1,1,load_file("/etc/passwd")       // 加载指定文件
    index.php?id=1 union select 1,1,@@datadir                      // 判断数据库目录
    index.php?id=1 union select 1,1,@@basedir                      // 判断安装根路径
    index.php?id=1 union select 1,1,@@hostname                     // 判断主机名
    index.php?id=1 union select 1,1,@@version                      // 判断数据库版本
    index.php?id=1 union select 1,1,@@version_compile_os           // 判断系统类型(Linux)
    index.php?id=1 union select 1,1,@@version_compile_machine      // 判断系统体系(x86)
    index.php?id=1 union select 1,1,user()                         // 曝出系统用户
    index.php?id=1 union select 1,1,database()                     // 曝出当前数据库
    
  • 判断表字段数
    order by 后加一个数字表示第几列进行排序。用此函数判断该数据库由几列组成
    union select 1,2,3每列之间用逗号隔开,而这里1,2,3的意思是第一列的内容为1,第二列的内容为2,以此类推。判断所需内容为第几列

  • 库与表名称

    • 查当前数据库名称: 可以直接使用MySQL自带函数database()来查询得到当前使用的数据库
      index.php?id=1 and 0 union select 1,1,database()
    • 查全部数据库名称: 使用以下语句语句得到所有的数据库名,and 1=0功能是不显示第一行
      index.php?id=1 and 0 union select 1,1,schema_name from information_schema.schemata
    • 查指定数据库名称: 用来查询第一个数据库的名称
      index.php?id=1 and 0 union select null,null,schema_name from information_schema.schemata limit 0,1
  • 字段与数据:select username,password from security.users

如何防御

  • 过滤掉一些常见的数据库关键字:select、insert、update、delete、and等
  • 打开magic_quotes_gpc=off,默认是关闭的,它打开后自动把用户提交的sql语句进行转换(加上\转义),这对防止sql注入有很大作用;因此开启magic_quotes_gpc=on
  • 限制每一种数据的类型和格式,eg:数字必须用int形式储存
  • 对于常用的方法进行封装,避免直接暴露sql
  • 规定数据长度防止sql注入
  • 绑定变量,使用预编译语句
  • 避免直接响应一些sql异常信息,sql发生异常后,自定义异常发生响应。
  • 严格限制数据库权限,能最大程度减少sql注入的危害
  • 通过系统函数addslashes(需要过滤的内容)来进行过滤;当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。 addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。当然addslashes也不是毫无用处,它是用于单字节字符串的处理
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃_早餐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值